@genspectrum/dashboard-components 0.6.3 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +1 -1
- package/dist/dashboard-components.js +84 -11
- package/dist/dashboard-components.js.map +1 -1
- package/dist/genspectrum-components.d.ts +7 -2
- package/dist/style.css +3 -0
- package/package.json +1 -1
- package/src/preact/components/tooltip.stories.tsx +54 -0
- package/src/preact/components/tooltip.tsx +31 -0
- package/src/preact/mutationsOverTime/getFilteredMutationsOverTime.spec.ts +23 -11
- package/src/preact/mutationsOverTime/getFilteredMutationsOverTimeData.ts +6 -2
- package/src/preact/mutationsOverTime/mutations-over-time-grid.tsx +45 -10
- package/src/query/queryMutationsOverTime.spec.ts +50 -24
- package/src/query/queryMutationsOverTime.ts +20 -5
- package/src/utils/temporal.spec.ts +5 -0
- package/src/utils/temporal.ts +29 -5
- package/src/web-components/visualization/gs-mutations-over-time.tsx +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-components.js","sources":["../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../src/web-components/lapis-context.ts","../src/web-components/reference-genome-context.ts","../src/lapisApi/ReferenceGenome.ts","../src/lapisApi/lapisTypes.ts","../src/lapisApi/lapisApi.ts","../src/web-components/app.ts","../node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","../node_modules/preact/hooks/dist/hooks.module.js","../src/preact/mutationComparison/getMutationComparisonTableData.ts","../src/preact/components/table.tsx","../src/utils/mutations.ts","../src/preact/shared/sort/sortSubstitutionsAndDeletions.ts","../src/preact/shared/table/formatProportion.ts","../src/preact/mutationComparison/mutation-comparison-table.tsx","../src/preact/components/chart.tsx","../src/preact/mutationComparison/mutation-comparison-venn.tsx","../src/operator/FetchSubstitutionsOrDeletionsOperator.ts","../src/operator/SortOperator.ts","../src/query/querySubstitutionsOrDeletions.ts","../src/preact/mutationComparison/queryMutationData.ts","../src/preact/LapisUrlContext.ts","../src/preact/shared/floating-ui/hooks.ts","../src/preact/components/dropdown.tsx","../src/preact/components/checkbox-selector.tsx","../src/preact/ReferenceGenomeContext.ts","../src/preact/components/SegmentSelector.tsx","../src/preact/components/csv-download-button.tsx","../src/preact/components/error-display.tsx","../src/preact/components/resize-container.tsx","../src/preact/components/error-boundary.tsx","../src/preact/components/info.tsx","../src/preact/components/loading-display.tsx","../src/preact/components/mutation-type-selector.tsx","../src/preact/components/no-data-display.tsx","../src/preact/components/min-max-range-slider.tsx","../src/preact/components/percent-intput.tsx","../src/preact/components/proportion-selector.tsx","../src/preact/components/proportion-selector-dropdown.tsx","../src/preact/components/tabs.tsx","../src/preact/useQuery.ts","../src/preact/mutationComparison/mutation-comparison.tsx","../src/web-components/PreactLitAdapter.tsx","../src/web-components/PreactLitAdapterWithGridJsStyles.tsx","../src/web-components/visualization/gs-mutation-comparison.tsx","../src/preact/mutations/getInsertionsTableData.ts","../src/preact/mutations/getMutationsTableData.ts","../src/preact/shared/sort/sortMutationPositions.ts","../src/preact/mutations/getMutationsGridData.ts","../src/preact/mutations/mutations-grid.tsx","../src/preact/shared/sort/sortInsertions.ts","../src/preact/mutations/mutations-insertions-table.tsx","../src/preact/mutations/mutations-table.tsx","../src/operator/FetchInsertionsOperator.ts","../src/query/queryInsertions.ts","../src/preact/mutations/queryMutations.ts","../src/preact/mutations/mutations.tsx","../src/web-components/visualization/gs-mutations.tsx","../src/preact/prevalenceOverTime/getPrevalenceOverTimeTableData.ts","../src/utils/sort.ts","../src/preact/shared/charts/LogitScale.ts","../src/preact/shared/charts/colors.ts","../src/preact/shared/charts/confideceInterval.ts","../src/preact/shared/charts/getYAxisMax.ts","../src/preact/shared/charts/getYAxisScale.ts","../src/preact/prevalenceOverTime/prevalence-over-time-bar-chart.tsx","../node_modules/dayjs/esm/constant.js","../node_modules/dayjs/esm/locale/en.js","../node_modules/dayjs/esm/utils.js","../node_modules/dayjs/esm/index.js","../node_modules/dayjs/esm/plugin/advancedFormat/index.js","../node_modules/dayjs/esm/plugin/isoWeek/index.js","../src/utils/temporal.ts","../src/utils/utils.ts","../src/preact/prevalenceOverTime/prevalence-over-time-bubble-chart.tsx","../src/preact/prevalenceOverTime/prevalence-over-time-line-chart.tsx","../src/preact/prevalenceOverTime/prevalence-over-time-table.tsx","../src/operator/FetchAggregatedOperator.ts","../src/operator/FillMissingOperator.ts","../src/operator/GroupByOperator.ts","../src/operator/GroupByAndSumOperator.ts","../src/operator/MapOperator.ts","../src/operator/RenameFieldOperator.ts","../src/operator/SlidingOperator.ts","../src/query/queryAggregatedDataOverTime.ts","../src/operator/DivisionOperator.ts","../src/query/queryPrevalenceOverTime.ts","../src/preact/components/select.tsx","../src/preact/components/confidence-interval-selector.tsx","../src/preact/components/scaling-selector.tsx","../src/preact/prevalenceOverTime/prevalence-over-time.tsx","../src/web-components/visualization/gs-prevalence-over-time.tsx","../src/preact/relativeGrowthAdvantage/relative-growth-advantage-chart.tsx","../src/query/queryRelativeGrowthAdvantage.ts","../src/preact/relativeGrowthAdvantage/relative-growth-advantage.tsx","../src/web-components/visualization/gs-relative-growth-advantage.tsx","../src/query/queryAggregateData.ts","../src/preact/aggregatedData/aggregate-table.tsx","../src/preact/aggregatedData/aggregate.tsx","../src/web-components/visualization/gs-aggregate.tsx","../src/preact/numberSequencesOverTime/getNumberOfSequencesOverTimeTableData.ts","../src/preact/numberSequencesOverTime/number-sequences-over-time-bar-chart.tsx","../src/preact/numberSequencesOverTime/number-sequences-over-time-line-chart.tsx","../src/preact/numberSequencesOverTime/number-sequences-over-time-table.tsx","../src/query/queryNumberOfSequencesOverTime.ts","../src/preact/numberSequencesOverTime/number-sequences-over-time.tsx","../src/web-components/visualization/gs-number-sequences-over-time.tsx","../src/preact/mutationsOverTime/getFilteredMutationsOverTimeData.ts","../src/preact/mutationsOverTime/mutations-over-time-grid.tsx","../src/utils/Map2d.ts","../src/query/queryMutationsOverTime.ts","../src/preact/mutationsOverTime/mutations-over-time.tsx","../src/web-components/visualization/gs-mutations-over-time.tsx","../src/preact/dateRangeSelector/selectableOptions.ts","../src/preact/dateRangeSelector/computeInitialValues.ts","../src/preact/dateRangeSelector/dateConversion.ts","../src/preact/dateRangeSelector/date-range-selector.tsx","../src/web-components/input/gs-date-range-selector.tsx","../src/preact/locationFilter/fetchAutocompletionList.ts","../src/preact/locationFilter/location-filter.tsx","../src/web-components/input/gs-location-filter.tsx","../src/preact/textInput/fetchAutocompleteList.ts","../src/preact/textInput/text-input.tsx","../src/web-components/input/gs-text-input.tsx","../src/preact/components/ReferenceGenomesAwaiter.tsx","../src/preact/mutationFilter/mutation-filter-info.tsx","../src/preact/mutationFilter/sequenceTypeFromSegment.ts","../src/preact/mutationFilter/parseAndValidateMutation.ts","../src/preact/shared/icons/DeleteIcon.tsx","../src/preact/mutationFilter/mutation-filter.tsx","../src/web-components/input/gs-mutation-filter.tsx","../src/preact/lineageFilter/fetchLineageAutocompleteList.ts","../src/preact/lineageFilter/lineage-filter.tsx","../src/web-components/input/gs-lineage-filter.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer((()=>{customElements.define(t,e)})):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce(((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1]),t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,adoptStyles,css,getCompatibleStyle,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:r,getOwnPropertyNames:h,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),y={attribute:!0,type:String,converter:u,reflect:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class b extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=y){if(s.state&&(s.attribute=!1),this._$Ei(),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),r=this.getPropertyDescriptor(t,i,s);void 0!==r&&e(this.prototype,t,r)}}static getPropertyDescriptor(t,s,i){const{get:e,set:h}=r(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get(){return e?.call(this)},set(s){const r=e?.call(this);h.call(this,s),this.requestUpdate(t,r,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??y}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...h(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$EC(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const r=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==r?this.removeAttribute(e):this.setAttribute(e,r),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),r=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e,this[e]=r.fromAttribute(s,t.type),this._$Em=null}}requestUpdate(t,s,i){if(void 0!==t){if(i??=this.constructor.getPropertyOptions(t),!(i.hasChanged??f)(this[t],s))return;this.P(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$ET())}P(t,s,i){this._$AL.has(t)||this._$AL.set(t,s),!0===i.reflect&&this._$Em!==t&&(this._$Ej??=new Set).add(t)}async _$ET(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t)!0!==i.wrapped||this._$AL.has(s)||void 0===this[s]||this.P(s,this[s],i)}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach((t=>t.hostUpdate?.())),this.update(s)):this._$EU()}catch(s){throw t=!1,this._$EU(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EU(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Ej&&=this._$Ej.forEach((t=>this._$EC(t,this[t]))),this._$EU()}updated(t){}firstUpdated(t){}}b.elementStyles=[],b.shadowRootOptions={mode:\"open\"},b[d(\"elementProperties\")]=new Map,b[d(\"finalized\")]=new Map,p?.({ReactiveElement:b}),(a.reactiveElementVersions??=[]).push(\"2.0.4\");export{b as ReactiveElement,u as defaultConverter,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{defaultConverter as t,notEqual as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:t,reflect:!1,hasChanged:e},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t)},init(e){return void 0!==e&&this.P(o,void 0,t),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,r?{...t,wrapped:!0}:t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import { createContext } from '@lit/context';\n\nexport const lapisContext = createContext<string>('lapis-context');\n","import { createContext } from '@lit/context';\n\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\n\nexport const referenceGenomeContext = createContext<ReferenceGenome>('reference-genome-context');\n","import z from 'zod';\n\nimport type { SequenceType } from '../types';\n\nexport const referenceGenomeResponse = z.object({\n nucleotideSequences: z.array(\n z.object({\n name: z.string(),\n sequence: z.string(),\n }),\n ),\n genes: z.array(\n z.object({\n name: z.string(),\n sequence: z.string(),\n }),\n ),\n});\nexport type ReferenceGenome = z.infer<typeof referenceGenomeResponse>;\n\nexport const getSegmentNames = (referenceGenome: ReferenceGenome, sequenceType: SequenceType) => {\n switch (sequenceType) {\n case 'nucleotide': {\n return referenceGenome.nucleotideSequences.map((sequence) => sequence.name);\n }\n case 'amino acid': {\n return referenceGenome.genes.map((gene) => gene.name);\n }\n }\n};\n\nexport const isSingleSegmented = (referenceGenome: ReferenceGenome) => referenceGenome.nucleotideSequences.length === 1;\n","import z, { type ZodTypeAny } from 'zod';\n\nexport const orderByType = z.enum(['ascending', 'descending']);\n\nexport const orderBy = z.object({\n field: z.string(),\n type: orderByType,\n});\n\nexport const lapisBaseRequest = z\n .object({\n limit: z.number().optional(),\n offset: z.number().optional(),\n fields: z.array(z.string()).optional(),\n orderBy: z.array(orderBy).optional(),\n })\n .catchall(z.union([z.boolean(), z.undefined(), z.string(), z.number(), z.null(), z.array(z.string())]));\nexport type LapisBaseRequest = z.infer<typeof lapisBaseRequest>;\n\nexport const mutationsRequest = lapisBaseRequest.extend({ minProportion: z.number().optional() });\nexport type MutationsRequest = z.infer<typeof mutationsRequest>;\n\nconst mutationProportionCount = z.object({\n mutation: z.string(),\n proportion: z.number(),\n count: z.number(),\n sequenceName: z.union([z.string(), z.null()]),\n mutationFrom: z.string(),\n mutationTo: z.string(),\n position: z.number(),\n});\nexport const mutationsResponse = makeLapisResponse(z.array(mutationProportionCount));\nexport type MutationsResponse = z.infer<typeof mutationsResponse>;\n\nconst insertionCount = z.object({\n insertion: z.string(),\n count: z.number(),\n insertedSymbols: z.string(),\n position: z.number(),\n sequenceName: z.union([z.string(), z.null()]),\n});\nexport const insertionsResponse = makeLapisResponse(z.array(insertionCount));\n\nexport const aggregatedItem = z.object({ count: z.number() }).catchall(z.union([z.string(), z.number(), z.null()]));\nexport const aggregatedResponse = makeLapisResponse(z.array(aggregatedItem));\nexport type AggregatedItem = z.infer<typeof aggregatedItem>;\n\nfunction makeLapisResponse<T extends ZodTypeAny>(data: T) {\n return z.object({\n data,\n });\n}\n\nexport const problemDetail = z.object({\n title: z.string().optional(),\n status: z.number(),\n detail: z.string().optional(),\n type: z.string(),\n instance: z.string().optional(),\n});\n\nexport type ProblemDetail = z.infer<typeof problemDetail>;\n\nexport const lapisError = z.object({\n error: problemDetail,\n});\n","import { referenceGenomeResponse } from './ReferenceGenome';\nimport {\n aggregatedResponse,\n insertionsResponse,\n type LapisBaseRequest,\n lapisError,\n type MutationsRequest,\n mutationsResponse,\n problemDetail,\n type ProblemDetail,\n} from './lapisTypes';\nimport { type SequenceType } from '../types';\n\nexport class UnknownLapisError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n ) {\n super(message);\n this.name = 'UnknownLapisError';\n }\n}\n\nexport class LapisError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly problemDetail: ProblemDetail,\n ) {\n super(message);\n this.name = 'LapisError';\n }\n}\n\nexport async function fetchAggregated(lapisUrl: string, body: LapisBaseRequest, signal?: AbortSignal) {\n const response = await fetch(aggregatedEndpoint(lapisUrl), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n await handleErrors(response);\n\n return aggregatedResponse.parse(await response.json());\n}\n\nexport async function fetchInsertions(\n lapisUrl: string,\n body: LapisBaseRequest,\n sequenceType: SequenceType,\n signal?: AbortSignal,\n) {\n const response = await fetch(insertionsEndpoint(lapisUrl, sequenceType), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n await handleErrors(response);\n\n return insertionsResponse.parse(await response.json());\n}\n\nexport async function fetchSubstitutionsOrDeletions(\n lapisUrl: string,\n body: MutationsRequest,\n sequenceType: SequenceType,\n signal?: AbortSignal,\n) {\n const response = await fetch(substitutionsOrDeletionsEndpoint(lapisUrl, sequenceType), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n await handleErrors(response);\n\n return mutationsResponse.parse(await response.json());\n}\n\nexport async function fetchReferenceGenome(lapisUrl: string, signal?: AbortSignal) {\n const response = await fetch(referenceGenomeEndpoint(lapisUrl), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n signal,\n });\n\n await handleErrors(response);\n return referenceGenomeResponse.parse(await response.json());\n}\n\nconst handleErrors = async (response: Response) => {\n if (!response.ok) {\n if (response.status >= 400 && response.status < 500) {\n const json = await response.json();\n\n const lapisErrorResult = lapisError.safeParse(json);\n if (lapisErrorResult.success) {\n throw new LapisError(\n response.statusText + lapisErrorResult.data.error.detail,\n response.status,\n lapisErrorResult.data.error,\n );\n }\n\n const problemDetailResult = problemDetail.safeParse(json);\n if (problemDetailResult.success) {\n throw new LapisError(\n response.statusText + problemDetailResult.data.detail,\n response.status,\n problemDetailResult.data,\n );\n }\n\n throw new UnknownLapisError(`${response.statusText}: ${JSON.stringify(json)}`, response.status);\n }\n throw new UnknownLapisError(`${response.statusText}: ${response.status}`, response.status);\n }\n};\n\nexport const aggregatedEndpoint = (lapisUrl: string) => `${lapisUrl}/sample/aggregated`;\nexport const insertionsEndpoint = (lapisUrl: string, sequenceType: SequenceType) => {\n return sequenceType === 'amino acid'\n ? `${lapisUrl}/sample/aminoAcidInsertions`\n : `${lapisUrl}/sample/nucleotideInsertions`;\n};\nexport const substitutionsOrDeletionsEndpoint = (lapisUrl: string, sequenceType: SequenceType) => {\n return sequenceType === 'amino acid'\n ? `${lapisUrl}/sample/aminoAcidMutations`\n : `${lapisUrl}/sample/nucleotideMutations`;\n};\nexport const referenceGenomeEndpoint = (lapisUrl: string) => `${lapisUrl}/sample/referenceGenome`;\n","import { provide } from '@lit/context';\nimport { Task } from '@lit/task';\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { lapisContext } from './lapis-context';\nimport { referenceGenomeContext } from './reference-genome-context';\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\nimport { fetchReferenceGenome } from '../lapisApi/lapisApi';\n\n/**\n * ## Context\n *\n * This component provides the main application context.\n * All other `gs-*` components must be (possibly nested) children of this component.\n * It makes use of the [Lit Context](https://lit.dev/docs/data/context/) to\n * - provide the URL to the LAPIS instance to all its children\n * - fetch the reference genomes from LAPIS and provide it to all its children\n *\n * This will show an error message if the reference genome cannot be fetched\n * (e.g., due to an invalid LAPIS URL).\n *\n * ## Shadow DOM\n *\n * This component does __not__ use a shadow DOM. Children of this component will be rendered directly in the light DOM.\n */\n@customElement('gs-app')\nexport class App extends LitElement {\n /**\n * Required.\n *\n * The URL of the LAPIS instance that all children of this component will use.\n */\n @provide({ context: lapisContext })\n @property()\n lapis: string = '';\n\n /**\n * @internal\n */\n @provide({ context: referenceGenomeContext })\n referenceGenome: ReferenceGenome = {\n nucleotideSequences: [],\n genes: [],\n };\n\n /**\n * @internal\n */\n private updateReferenceGenome = new Task(this, {\n task: async () => {\n this.referenceGenome = await fetchReferenceGenome(this.lapis);\n },\n args: () => [this.lapis],\n });\n\n override render() {\n return this.updateReferenceGenome.render({\n complete: () => html``, // Children will be rendered in the light DOM anyway. We can't use slots without a shadow DOM.\n error: () =>\n html` <div class=\"m-2 w-full alert alert-error\">\n Error: Cannot fetch reference genome. Is LAPIS available?\n </div>`,\n });\n }\n\n override createRenderRoot() {\n return this;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-app': App;\n }\n}\n","import{options as r,Fragment as e}from\"preact\";export{Fragment}from\"preact\";var t=/[\"&<]/;function n(r){if(0===r.length||!1===t.test(r))return r;for(var e=0,n=0,o=\"\",f=\"\";n<r.length;n++){switch(r.charCodeAt(n)){case 34:f=\""\";break;case 38:f=\"&\";break;case 60:f=\"<\";break;default:continue}n!==e&&(o+=r.slice(e,n)),o+=f,e=n+1}return n!==e&&(o+=r.slice(e,n)),o}var o=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,f=0,i=Array.isArray;function u(e,t,n,o,i,u){t||(t={});var a,c,p=t;if(\"ref\"in p)for(c in p={},t)\"ref\"==c?a=t[c]:p[c]=t[c];var l={type:e,props:p,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:--f,__i:-1,__u:0,__source:i,__self:u};if(\"function\"==typeof e&&(a=e.defaultProps))for(c in a)void 0===p[c]&&(p[c]=a[c]);return r.vnode&&r.vnode(l),l}function a(r){var t=u(e,{tpl:r,exprs:[].slice.call(arguments,1)});return t.key=t.__v,t}var c={},p=/[A-Z]/g;function l(e,t){if(r.attr){var f=r.attr(e,t);if(\"string\"==typeof f)return f}if(\"ref\"===e||\"key\"===e)return\"\";if(\"style\"===e&&\"object\"==typeof t){var i=\"\";for(var u in t){var a=t[u];if(null!=a&&\"\"!==a){var l=\"-\"==u[0]?u:c[u]||(c[u]=u.replace(p,\"-$&\").toLowerCase()),_=\";\";\"number\"!=typeof a||l.startsWith(\"--\")||o.test(l)||(_=\"px;\"),i=i+l+\":\"+a+_}}return e+'=\"'+i+'\"'}return null==t||!1===t||\"function\"==typeof t||\"object\"==typeof t?\"\":!0===t?e:e+'=\"'+n(t)+'\"'}function _(r){if(null==r||\"boolean\"==typeof r||\"function\"==typeof r)return null;if(\"object\"==typeof r){if(void 0===r.constructor)return r;if(i(r)){for(var e=0;e<r.length;e++)r[e]=_(r[e]);return r}}return n(\"\"+r)}export{u as jsx,l as jsxAttr,u as jsxDEV,_ as jsxEscape,a as jsxTemplate,u as jsxs};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function d(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function h(n){return o=1,p(D,n)}function p(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),!(!i&&o.__c.props===n)&&(!c||c.call(this,n,t,r))};r.u=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=d(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__H.__h.push(i))}function _(n,u){var i=d(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function T(n,r){var u=d(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=d(t++,10),i=h();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=d(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.i=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.i=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,p as useReducer,A as useRef,h as useState};\n//# sourceMappingURL=hooks.module.js.map\n","import { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\ntype Proportions = {\n [displayName: string]: number;\n};\n\ntype MutationComparisonRow = {\n mutation: Substitution | Deletion;\n proportions: Proportions;\n};\n\nexport function getMutationComparisonTableData(data: Dataset<MutationData>, proportionInterval: ProportionInterval) {\n const mutationsToProportions = new Map<string, MutationComparisonRow>();\n\n for (const mutationData of data.content) {\n for (const mutationEntry of mutationData.data) {\n const mutationKey = mutationEntry.mutation.toString();\n const existingRow = mutationsToProportions.get(mutationKey);\n\n if (!existingRow) {\n mutationsToProportions.set(\n mutationKey,\n initializeMutationRow(mutationEntry.mutation, mutationData.displayName, mutationEntry.proportion),\n );\n } else {\n existingRow.proportions = updateProportions(\n existingRow.proportions,\n mutationData.displayName,\n mutationEntry.proportion,\n );\n mutationsToProportions.set(mutationKey, existingRow);\n }\n }\n }\n\n return [...mutationsToProportions.values()]\n .map((row) => {\n return {\n mutation: row.mutation,\n ...data.content\n .map((mutationData) => {\n return {\n [`${mutationData.displayName} prevalence`]: row.proportions[mutationData.displayName] || 0,\n };\n })\n .reduce((acc, val) => ({ ...acc, ...val }), {}),\n } as { mutation: Substitution | Deletion } & Proportions;\n })\n .filter((row) =>\n Object.values(row).some(\n (value) =>\n typeof value === 'number' && value >= proportionInterval.min && value <= proportionInterval.max,\n ),\n );\n}\n\nfunction initializeMutationRow(\n mutation: Substitution | Deletion,\n displayName: string,\n proportion: number,\n): MutationComparisonRow {\n return {\n mutation,\n proportions: {\n [displayName]: proportion,\n },\n };\n}\n\nfunction updateProportions(proportions: Proportions, displayName: string, proportion: number): Proportions {\n return { ...proportions, [displayName]: proportion };\n}\n","import { Grid } from 'gridjs';\nimport { type OneDArray, type TColumn, type TData } from 'gridjs/dist/src/types';\nimport { type ComponentChild } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\n\nimport 'gridjs/dist/theme/mermaid.css';\n\nexport const tableStyle = {\n table: {\n fontSize: '12px',\n },\n th: {\n padding: '4px',\n textAlign: 'center',\n },\n td: {\n textAlign: 'center',\n padding: '8px',\n },\n footer: {\n fontSize: '12px',\n },\n};\n\ninterface TableProps {\n data: TData;\n columns: OneDArray<TColumn | string | ComponentChild>;\n pageSize: number | boolean;\n}\n\nexport const Table = ({ data, columns, pageSize }: TableProps) => {\n const pagination = typeof pageSize === 'number' ? { limit: pageSize } : pageSize;\n\n const wrapper = useRef(null);\n\n useEffect(() => {\n if (wrapper.current === null) {\n return;\n }\n const grid = new Grid({\n columns,\n data,\n style: tableStyle,\n pagination,\n }).render(wrapper.current);\n\n return () => {\n grid.destroy();\n };\n });\n\n return <div ref={wrapper} />;\n};\n","import { type MutationType, type SequenceType } from '../types';\n\nexport interface Mutation {\n readonly segment: string | undefined;\n readonly position: number;\n readonly code: string;\n readonly type: MutationType;\n\n equals(other: Mutation): boolean;\n\n toString(): string;\n}\n\nexport const substitutionRegex =\n /^((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Za-z])?(?<position>\\d+)(?<substitutionValue>[A-Za-z.])?$/;\n\nexport class Substitution implements Mutation {\n readonly code;\n readonly type = 'substitution';\n\n constructor(\n readonly segment: string | undefined,\n readonly valueAtReference: string | undefined,\n readonly substitutionValue: string | undefined,\n readonly position: number,\n ) {\n const segmentString = this.segment ? `${this.segment}:` : '';\n const valueAtReferenceString = this.valueAtReference ? `${this.valueAtReference}` : '';\n const substitutionValueString = this.substitutionValue ? `${this.substitutionValue}` : '';\n this.code = `${segmentString}${valueAtReferenceString}${this.position}${substitutionValueString}`;\n }\n\n equals(other: Mutation): boolean {\n if (!(other instanceof Substitution)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.valueAtReference === other.valueAtReference &&\n this.substitutionValue === other.substitutionValue &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): Substitution | null {\n const match = mutationStr.match(substitutionRegex);\n if (match === null || match.groups === undefined) {\n return null;\n }\n return new Substitution(\n match.groups.segment,\n match.groups.valueAtReference,\n match.groups.substitutionValue,\n parseInt(match.groups.position, 10),\n );\n }\n}\n\nexport const deletionRegex = /^((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Za-z])?(?<position>\\d+)(-)$/;\n\nexport class Deletion implements Mutation {\n readonly code;\n readonly type = 'deletion';\n\n constructor(\n readonly segment: string | undefined,\n readonly valueAtReference: string | undefined,\n readonly position: number,\n ) {\n const segmentString = this.segment ? `${this.segment}:` : '';\n const valueAtReferenceString = this.valueAtReference ? `${this.valueAtReference}` : '';\n this.code = `${segmentString}${valueAtReferenceString}${this.position}-`;\n }\n\n equals(other: Mutation): boolean {\n if (!(other instanceof Deletion)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.valueAtReference === other.valueAtReference &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): Deletion | null {\n const match = mutationStr.match(deletionRegex);\n if (match === null || match.groups === undefined) {\n return null;\n }\n\n return new Deletion(match.groups.segment, match.groups.valueAtReference, parseInt(match.groups.position, 10));\n }\n}\n\nexport const insertionRegexp =\n /^ins_((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<position>\\d+):(?<insertedSymbols>(([A-Za-z?]|(\\.\\*))+))$/i;\n\nexport class Insertion implements Mutation {\n readonly code;\n readonly type = 'insertion';\n\n constructor(\n readonly segment: string | undefined,\n readonly position: number,\n readonly insertedSymbols: string,\n ) {\n this.code = `ins_${this.segment ? `${this.segment}:` : ''}${this.position}:${this.insertedSymbols}`;\n }\n\n equals(other: Mutation): boolean {\n if (!(other instanceof Insertion)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.insertedSymbols === other.insertedSymbols &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): Insertion | null {\n const match = mutationStr.match(insertionRegexp);\n if (match === null || match.groups === undefined) {\n return null;\n }\n\n return new Insertion(match.groups.segment, parseInt(match.groups.position, 10), match.groups.insertedSymbols);\n }\n}\n\nexport const bases: { [P in SequenceType]: string[] } = {\n nucleotide: ['A', 'C', 'G', 'T', '-'],\n 'amino acid': [\n 'I',\n 'L',\n 'V',\n 'F',\n 'M',\n 'C',\n 'A',\n 'G',\n 'P',\n 'T',\n 'S',\n 'Y',\n 'W',\n 'Q',\n 'N',\n 'H',\n 'E',\n 'D',\n 'K',\n 'R',\n '-',\n ],\n};\n","import { Deletion, type Substitution } from '../../../utils/mutations';\n\nexport const sortSubstitutionsAndDeletions = (a: Substitution | Deletion, b: Substitution | Deletion) => {\n if (a.segment !== b.segment) {\n compareSegments(a.segment, b.segment);\n }\n\n if (a.position !== b.position) {\n return comparePositions(a.position, b.position);\n }\n\n const aIsDeletion = a instanceof Deletion;\n const bIsDeletion = b instanceof Deletion;\n\n if (aIsDeletion !== bIsDeletion) {\n return aIsDeletion ? 1 : -1;\n }\n\n if (!aIsDeletion && !bIsDeletion) {\n if (a.substitutionValue !== b.substitutionValue) {\n return compareSubstitutionValues(a.substitutionValue, b.substitutionValue);\n }\n }\n\n return 0;\n};\n\nexport const compareSegments = (a: string | undefined, b: string | undefined) => {\n if (a === undefined) {\n return -1;\n }\n if (b === undefined) {\n return 1;\n }\n return a.localeCompare(b);\n};\n\nexport const comparePositions = (a: number, b: number) => {\n return a - b;\n};\n\nconst compareSubstitutionValues = (a: string | undefined, b: string | undefined) => {\n if (a === undefined) {\n return -1;\n }\n if (b === undefined) {\n return 1;\n }\n return a.localeCompare(b);\n};\n","export const formatProportion = (proportion: number, digits: number = 2) => {\n return `${(proportion * 100).toFixed(digits)}%`;\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getMutationComparisonTableData } from './getMutationComparisonTableData';\nimport { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { Table } from '../components/table';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsTableProps {\n data: Dataset<MutationData>;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nexport const MutationComparisonTable: FunctionComponent<MutationsTableProps> = ({\n data,\n proportionInterval,\n pageSize,\n}) => {\n const headers = [\n {\n name: 'Mutation',\n sort: {\n compare: sortSubstitutionsAndDeletions,\n },\n formatter: (cell: Substitution | Deletion) => cell.toString(),\n },\n {\n name: 'Prevalence',\n columns: data.content.map((mutationData) => {\n return {\n name: mutationData.displayName,\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n };\n }),\n },\n ];\n\n const tableData = getMutationComparisonTableData(data, proportionInterval).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={headers} pageSize={pageSize} />;\n};\n","import { Chart, type ChartConfiguration } from 'chart.js';\nimport { useEffect, useRef } from 'preact/hooks';\n\nexport interface GsChartProps {\n configuration: ChartConfiguration;\n}\n\nconst GsChart = ({ configuration }: GsChartProps) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const chartRef = useRef<Chart | null>(null);\n\n useEffect(() => {\n if (canvasRef.current === null) {\n return;\n }\n\n const ctx = canvasRef.current.getContext('2d');\n if (ctx === null) {\n return;\n }\n\n chartRef.current = new Chart(ctx, configuration);\n\n return () => {\n chartRef.current?.destroy();\n };\n }, [canvasRef, configuration]);\n\n return <canvas ref={canvasRef} />;\n};\n\nexport default GsChart;\n","import { type ActiveElement, Chart, type ChartConfiguration, type ChartEvent, registerables } from 'chart.js';\nimport { ArcSlice, extractSets, VennDiagramController } from 'chartjs-chart-venn';\nimport { type FunctionComponent } from 'preact';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\n\nimport { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport GsChart from '../components/chart';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\nChart.register(...registerables, VennDiagramController, ArcSlice);\n\nexport interface MutationComparisonVennProps {\n data: Dataset<MutationData>;\n proportionInterval: ProportionInterval;\n}\n\nexport const MutationComparisonVenn: FunctionComponent<MutationComparisonVennProps> = ({\n data,\n proportionInterval,\n}) => {\n const divRef = useRef<HTMLDivElement>(null);\n const noElementSelectedMessage = 'You have no elements selected. Click in the venn diagram to select.';\n const [selectedDatasetIndex, setSelectedDatasetIndex] = useState<null | number>(null);\n\n const sets = useMemo(\n () =>\n extractSets(\n data.content\n .map((mutationData) => ({\n displayName: mutationData.displayName,\n data: mutationData.data.filter(\n (mutationEntry) =>\n mutationEntry.proportion >= proportionInterval.min &&\n mutationEntry.proportion <= proportionInterval.max,\n ),\n }))\n .map((mutationData) => {\n return {\n label: mutationData.displayName,\n values: mutationData.data.map((mutationEntry) => mutationEntry.mutation.toString()),\n };\n }),\n ),\n [data, proportionInterval],\n );\n\n useEffect(() => {\n if (divRef.current === null) {\n return;\n }\n if (selectedDatasetIndex === null) {\n divRef.current.innerText = noElementSelectedMessage;\n return;\n }\n\n const values = sets.datasets[0].data[selectedDatasetIndex].values;\n const label = sets.datasets[0].data[selectedDatasetIndex].label;\n divRef.current!.innerText = `${label}: ${values.join(', ')}` || '';\n }, [divRef, selectedDatasetIndex, sets]);\n\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'venn',\n data: sets,\n options: {\n maintainAspectRatio: false,\n scales: {\n x: {\n ticks: {\n color: 'black',\n font: {\n size: 20,\n },\n },\n },\n y: {\n ticks: {\n color: 'blue',\n font: {\n size: 20,\n },\n },\n },\n },\n events: ['click'],\n onClick(_: ChartEvent, elements: ActiveElement[]) {\n if (elements.length === 0) {\n setSelectedDatasetIndex(null);\n }\n },\n backgroundColor: '#f5f5f5',\n animation: false,\n layout: {\n padding: 30,\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n filter: ({ dataIndex }) => {\n setSelectedDatasetIndex(dataIndex);\n return false;\n },\n },\n },\n },\n }),\n [sets],\n );\n\n if (data.content.length > 5) {\n return <div>Too many datasets to display. Maximum are five. </div>;\n }\n\n return (\n <div className='h-full flex flex-col'>\n <div className='flex-1'>\n <GsChart configuration={config} />\n </div>\n <div class='flex flex-wrap break-words m-2' ref={divRef} />\n </div>\n );\n};\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchSubstitutionsOrDeletions } from '../lapisApi/lapisApi';\nimport { type LapisFilter, type SequenceType, type SubstitutionOrDeletionEntry } from '../types';\nimport { Deletion, Substitution } from '../utils/mutations';\n\nexport class FetchSubstitutionsOrDeletionsOperator implements Operator<SubstitutionOrDeletionEntry> {\n constructor(\n private filter: LapisFilter,\n private sequenceType: SequenceType,\n private minProportion?: number,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<SubstitutionOrDeletionEntry>> {\n const mutations = await this.fetchMutations(lapis, signal);\n\n const content: SubstitutionOrDeletionEntry[] = mutations.map(\n ({ count, proportion, mutationFrom, mutationTo, position, sequenceName }) => {\n if (mutationTo === '-') {\n return {\n type: 'deletion',\n mutation: new Deletion(sequenceName ?? undefined, mutationFrom, position),\n count,\n proportion,\n };\n }\n return {\n type: 'substitution',\n mutation: new Substitution(sequenceName ?? undefined, mutationFrom, mutationTo, position),\n count,\n proportion,\n };\n },\n );\n\n return { content };\n }\n\n private async fetchMutations(lapis: string, signal?: AbortSignal) {\n const filter = {\n ...this.filter,\n minProportion: this.minProportion,\n };\n\n return fetchSubstitutionsOrDeletions(lapis, filter, this.sequenceType, signal).then(\n (response) => response.data,\n );\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class SortOperator<S> implements Operator<S> {\n constructor(\n private child: Operator<S>,\n private compareFn: (a: S, b: S) => number,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<S>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.sort(this.compareFn),\n };\n }\n}\n","import { FetchSubstitutionsOrDeletionsOperator } from '../operator/FetchSubstitutionsOrDeletionsOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter, type SequenceType } from '../types';\n\nexport function querySubstitutionsOrDeletions(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchSubstitutionsOrDeletionsOperator(lapisFilter, sequenceType, 0);\n const sortData = new SortOperator(fetchData, (a, b) => {\n if (a.mutation.segment !== b.mutation.segment) {\n return (a.mutation.segment ?? '').localeCompare(b.mutation.segment ?? '');\n }\n return a.mutation.position - b.mutation.position;\n });\n return sortData.evaluate(lapis, signal);\n}\n","import { querySubstitutionsOrDeletions } from '../../query/querySubstitutionsOrDeletions';\nimport { type NamedLapisFilter, type SubstitutionOrDeletionEntry } from '../../types';\nimport { type DisplayedSegment } from '../components/SegmentSelector';\nimport { type DisplayedMutationType } from '../components/mutation-type-selector';\n\nexport type MutationData = {\n displayName: string;\n data: SubstitutionOrDeletionEntry[];\n};\n\nexport async function queryMutationData(\n lapisFilters: NamedLapisFilter[],\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n) {\n const mutationData = await Promise.all(\n lapisFilters.map(async (filter) => {\n return {\n displayName: filter.displayName,\n data: (await querySubstitutionsOrDeletions(filter.lapisFilter, sequenceType, lapis)).content,\n };\n }),\n );\n return { mutationData };\n}\n\nexport function filterMutationData(\n data: MutationData[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n return data.map((mutationEntry) => ({\n displayName: mutationEntry.displayName,\n data: filterBySegmentAndMutationType(mutationEntry.data, displayedSegments, displayedMutationTypes),\n }));\n}\n\nexport function filterBySegmentAndMutationType(\n data: SubstitutionOrDeletionEntry[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n const byDisplayedSegments = (mutationEntry: SubstitutionOrDeletionEntry) => {\n if (mutationEntry.mutation.segment === undefined) {\n return true;\n }\n return displayedSegments.some(\n (displayedSegment) =>\n displayedSegment.segment === mutationEntry.mutation.segment && displayedSegment.checked,\n );\n };\n const byDisplayedMutationTypes = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return displayedMutationTypes.some(\n (displayedMutationType) =>\n displayedMutationType.checked && displayedMutationType.type === mutationEntry.type,\n );\n };\n\n return data.filter(byDisplayedSegments).filter(byDisplayedMutationTypes);\n}\n","import { createContext } from 'preact';\n\nexport const LapisUrlContext = createContext('');\n","import { autoUpdate, computePosition, type Middleware } from '@floating-ui/dom';\nimport type { Placement } from '@floating-ui/utils';\nimport { useEffect, useRef } from 'preact/hooks';\nimport type { MutableRefObject } from 'react';\n\nexport function useFloatingUi(\n referenceRef: MutableRefObject<HTMLElement | null>,\n floatingRef: MutableRefObject<HTMLElement | null>,\n middleware?: Array<Middleware | null | undefined | false>,\n placement?: Placement,\n) {\n const cleanupRef = useRef<Function | null>(null);\n\n useEffect(() => {\n if (!referenceRef.current || !floatingRef.current) {\n return;\n }\n\n const { current: reference } = referenceRef;\n const { current: floating } = floatingRef;\n\n const update = () => {\n computePosition(reference, floating, {\n placement,\n middleware,\n }).then(({ x, y }) => {\n floating.style.left = `${x}px`;\n floating.style.top = `${y}px`;\n });\n };\n\n update();\n cleanupRef.current = autoUpdate(reference, floating, update);\n\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current();\n }\n };\n }, [placement, middleware, referenceRef, floatingRef]);\n}\n\nexport function useCloseOnClickOutside(\n floatingRef: MutableRefObject<HTMLElement | null>,\n referenceRef: MutableRefObject<HTMLElement | null>,\n setShowContent: (value: ((prevState: boolean) => boolean) | boolean) => void,\n) {\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const path = event.composedPath();\n if (\n floatingRef.current &&\n !path.includes(floatingRef.current) &&\n referenceRef.current &&\n !path.includes(referenceRef.current)\n ) {\n setShowContent(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [floatingRef, referenceRef, setShowContent]);\n}\n\nexport function useCloseOnEsc(setShowHelp: (value: ((prevState: boolean) => boolean) | boolean) => void) {\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setShowHelp(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [setShowHelp]);\n}\n","import { flip, offset, shift } from '@floating-ui/dom';\nimport { type Placement } from '@floating-ui/utils';\nimport { type FunctionComponent } from 'preact';\nimport { useRef, useState } from 'preact/hooks';\n\nimport { useCloseOnClickOutside, useCloseOnEsc, useFloatingUi } from '../shared/floating-ui/hooks';\n\ninterface DropdownProps {\n buttonTitle: string;\n placement?: Placement;\n}\n\nexport const dropdownClass =\n 'z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200 shadow-lg rounded-md';\n\nexport const Dropdown: FunctionComponent<DropdownProps> = ({ children, buttonTitle, placement }) => {\n const [showContent, setShowContent] = useState(false);\n const referenceRef = useRef<HTMLButtonElement>(null);\n const floatingRef = useRef<HTMLDivElement>(null);\n\n useFloatingUi(referenceRef, floatingRef, [offset(4), shift(), flip()], placement);\n\n useCloseOnClickOutside(floatingRef, referenceRef, setShowContent);\n useCloseOnEsc(setShowContent);\n\n const toggle = () => {\n setShowContent(!showContent);\n };\n\n return (\n <div>\n <button type='button' className='btn btn-xs whitespace-nowrap' onClick={toggle} ref={referenceRef}>\n {buttonTitle}\n </button>\n <div ref={floatingRef} className={`${dropdownClass} ${showContent ? '' : 'hidden'}`}>\n {children}\n </div>\n </div>\n );\n};\n","import { Dropdown } from './dropdown';\n\nexport type CheckboxItem = {\n label: string;\n checked: boolean;\n};\n\nexport interface CheckboxSelectorProps<Item extends CheckboxItem = CheckboxItem> {\n items: Item[];\n label: string;\n setItems: (items: Item[]) => void;\n}\n\nexport const CheckboxSelector = <Item extends CheckboxItem>({\n items,\n label,\n setItems,\n}: CheckboxSelectorProps<Item>) => {\n return (\n <Dropdown buttonTitle={label} placement={'bottom-start'}>\n <ul>\n {items.map((item, index) => (\n <li className='flex flex-row items-center' key={item.label}>\n <label>\n <input\n className={'mr-2'}\n type='checkbox'\n id={`item-${index}`}\n checked={item.checked}\n onChange={() => {\n const newItems = items.map((item, i) =>\n i === index ? { ...item, checked: !item.checked } : item,\n );\n setItems(newItems);\n }}\n />\n {item.label}\n </label>\n </li>\n ))}\n </ul>\n </Dropdown>\n );\n};\n","import { createContext } from 'preact';\n\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\n\nexport const ReferenceGenomeContext = createContext<ReferenceGenome>({ nucleotideSequences: [], genes: [] });\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport { type CheckboxItem, CheckboxSelector } from './checkbox-selector';\nimport { getSegmentNames } from '../../lapisApi/ReferenceGenome';\nimport { type SequenceType } from '../../types';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\n\nexport type DisplayedSegment = CheckboxItem & {\n segment: string;\n};\n\nexport type SegmentSelectorProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (items: DisplayedSegment[]) => void;\n prefix?: string;\n};\n\nconst getSegmentSelectorLabel = (displayedSegments: DisplayedSegment[], prefix: string) => {\n const allSelectedSelected = displayedSegments\n .filter((segment) => segment.checked)\n .map((segment) => segment.segment);\n\n if (allSelectedSelected.length === 0) {\n return `${prefix}none`;\n }\n if (displayedSegments.length === allSelectedSelected.length) {\n return `${prefix}all`;\n }\n return prefix + allSelectedSelected.join(', ');\n};\n\nexport const SegmentSelector: FunctionComponent<SegmentSelectorProps> = ({\n displayedSegments,\n setDisplayedSegments,\n prefix,\n}) => {\n if (displayedSegments.length <= 1) {\n return null;\n }\n\n return (\n <CheckboxSelector\n items={displayedSegments}\n label={getSegmentSelectorLabel(displayedSegments, prefix || 'Segments: ')}\n setItems={(items) => setDisplayedSegments(items)}\n />\n );\n};\n\nexport function useDisplayedSegments(sequenceType: SequenceType) {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const displayedSegments = getSegmentNames(referenceGenome, sequenceType).map((segment) => ({\n segment,\n label: segment,\n checked: true,\n }));\n\n return useState<DisplayedSegment[]>(displayedSegments);\n}\n","import { type FunctionComponent } from 'preact';\n\ntype ToStringable = {\n toString: () => string;\n};\n\ntype DataValue = string | number | boolean | null | ToStringable;\n\nexport interface CsvDownloadButtonProps {\n label?: string;\n filename?: string;\n getData: () => Record<string, DataValue>[];\n className?: string;\n}\n\nexport const CsvDownloadButton: FunctionComponent<CsvDownloadButtonProps> = ({\n label = 'Download',\n filename = 'data.csv',\n getData,\n className,\n}) => {\n const download = () => {\n const content = getDownloadContent();\n const blob = new Blob([content], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n const getDownloadContent = () => {\n const data = getData();\n const keys = getDataKeys(data);\n const header = `${keys.join(',')}\\n`;\n const rows = data.map((row) => keys.map((key) => row[key]).join(',')).join('\\n');\n return header + rows;\n };\n\n const getDataKeys = (data: Record<string, DataValue>[]) => {\n const keysSet = data\n .map((row) => Object.keys(row))\n .reduce((accumulatedKeys, keys) => {\n keys.forEach((key) => accumulatedKeys.add(key));\n return accumulatedKeys;\n }, new Set<string>());\n\n return [...keysSet];\n };\n\n return (\n <button className={className} onClick={download}>\n {label}\n </button>\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useRef } from 'preact/hooks';\n\nexport class UserFacingError extends Error {\n constructor(\n public readonly headline: string,\n message: string,\n ) {\n super(message);\n this.name = 'UserFacingError';\n }\n}\n\nexport const ErrorDisplay: FunctionComponent<{ error: Error }> = ({ error }) => {\n console.error(error);\n\n const ref = useRef<HTMLDialogElement>(null);\n\n return (\n <div className='h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center flex-col'>\n <div className='text-red-700 font-bold'>Error</div>\n <div>\n Oops! Something went wrong.\n {error instanceof UserFacingError && (\n <>\n {' '}\n <button\n className='text-sm text-gray-600 hover:text-gray-300'\n onClick={() => ref.current?.showModal()}\n >\n Show details.\n </button>\n <dialog ref={ref} class='modal'>\n <div class='modal-box'>\n <form method='dialog'>\n <button className='btn btn-sm btn-circle btn-ghost absolute right-2 top-2'>\n ✕\n </button>\n </form>\n <h1 class='text-lg'>{error.headline}</h1>\n <p class='py-4'>{error.message}</p>\n </div>\n <form method='dialog' class='modal-backdrop'>\n <button>close</button>\n </form>\n </dialog>\n </>\n )}\n </div>\n </div>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nexport type Size = {\n width: string;\n height: string;\n};\n\nexport interface ResizeContainerProps {\n size: Size;\n}\n\nexport const ResizeContainer: FunctionComponent<ResizeContainerProps> = ({ children, size }) => {\n return <div style={size}>{children}</div>;\n};\n","import type { FunctionComponent } from 'preact';\nimport { useErrorBoundary } from 'preact/hooks';\n\nimport { ErrorDisplay } from './error-display';\nimport { ResizeContainer, type Size } from './resize-container';\n\nexport const ErrorBoundary: FunctionComponent<{ size: Size }> = ({ size, children }) => {\n const [internalError] = useErrorBoundary();\n\n if (internalError) {\n return (\n <ResizeContainer size={size}>\n <ErrorDisplay error={internalError} />\n </ResizeContainer>\n );\n }\n\n return <>{children}</>;\n};\n","import { offset, shift, size } from '@floating-ui/dom';\nimport { type FunctionComponent } from 'preact';\nimport { useRef, useState } from 'preact/hooks';\n\nimport { dropdownClass } from './dropdown';\nimport { useCloseOnClickOutside, useCloseOnEsc, useFloatingUi } from '../shared/floating-ui/hooks';\n\nexport interface InfoProps {\n height?: string;\n}\n\nconst Info: FunctionComponent<InfoProps> = ({ children, height }) => {\n const [showHelp, setShowHelp] = useState(false);\n const referenceRef = useRef<HTMLButtonElement>(null);\n const floatingRef = useRef<HTMLDivElement>(null);\n\n useFloatingUi(referenceRef, floatingRef, [\n offset(10),\n shift(),\n size({\n apply() {\n if (!floatingRef.current) {\n return;\n }\n floatingRef.current.style.width = '100vw';\n floatingRef.current.style.height = height ? height : '50vh';\n },\n }),\n ]);\n\n const toggleHelp = () => {\n setShowHelp(!showHelp);\n };\n\n useCloseOnEsc(setShowHelp);\n useCloseOnClickOutside(floatingRef, referenceRef, setShowHelp);\n\n return (\n <div className='relative'>\n <button type='button' className='btn btn-xs' onClick={toggleHelp} ref={referenceRef}>\n ?\n </button>\n <div\n ref={floatingRef}\n className={`${dropdownClass} overflow-y-auto opacity-90 ${showHelp ? '' : 'hidden'}`}\n >\n <div className={'flex flex-col'}>{children}</div>\n <button\n onClick={() => setShowHelp(false)}\n className={'float-right underline text-sm hover:text-blue-700 mr-2'}\n >\n Close\n </button>\n </div>\n </div>\n );\n};\n\nexport const InfoHeadline1: FunctionComponent = ({ children }) => {\n return <h1 className='text-lg font-bold'>{children}</h1>;\n};\n\nexport const InfoHeadline2: FunctionComponent = ({ children }) => {\n return <h2 className='text-base font-bold mt-4'>{children}</h2>;\n};\n\nexport const InfoParagraph: FunctionComponent = ({ children }) => {\n return <p className='text-justify my-1'>{children}</p>;\n};\n\nexport const InfoLink: FunctionComponent<{ href: string }> = ({ children, href }) => {\n return (\n <a className='text-blue-600 hover:text-blue-800' href={href} target='_blank' rel='noopener noreferrer'>\n {children}\n </a>\n );\n};\n\nexport default Info;\n","import { type FunctionComponent } from 'preact';\n\nexport const LoadingDisplay: FunctionComponent = () => {\n return <div aria-label={'Loading'} className='h-full w-full skeleton' />;\n};\n","import { type FunctionComponent } from 'preact/compat';\n\nimport { type CheckboxItem, CheckboxSelector } from './checkbox-selector';\nimport type { SubstitutionOrDeletion } from '../../types';\n\nexport type DisplayedMutationType = CheckboxItem & {\n type: SubstitutionOrDeletion;\n};\n\nexport type MutationTypeSelectorProps = {\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (mutationTypes: DisplayedMutationType[]) => void;\n};\n\nexport const MutationTypeSelector: FunctionComponent<MutationTypeSelectorProps> = ({\n displayedMutationTypes,\n setDisplayedMutationTypes,\n}) => {\n const checkedLabels = displayedMutationTypes.filter((type) => type.checked).map((type) => type.label);\n const mutationTypesSelectorLabel = `Types: ${checkedLabels.length > 0 ? checkedLabels.join(', ') : 'None'}`;\n\n return (\n <CheckboxSelector\n items={displayedMutationTypes}\n label={mutationTypesSelectorLabel}\n setItems={(items) => setDisplayedMutationTypes(items)}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nexport const NoDataDisplay: FunctionComponent = () => {\n return (\n <div className='h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center'>\n <div>No data available.</div>\n </div>\n );\n};\n","import { type FunctionComponent, type JSX } from 'preact';\nimport { useState } from 'preact/hooks';\n\nimport './min-max-percent-slider.css';\n\nexport interface MinMaxPercentSliderProps {\n min: number;\n max: number;\n setMin: (min: number) => void;\n setMax: (max: number) => void;\n rangeMin?: number;\n rangeMax?: number;\n step?: number;\n}\n\nexport const MinMaxRangeSlider: FunctionComponent<MinMaxPercentSliderProps> = ({\n min,\n max,\n setMin,\n setMax,\n rangeMin = 0,\n rangeMax = 100,\n step = 0.1,\n}) => {\n const sliderColor = '#C6C6C6';\n const rangeColor = '#387bbe';\n\n const [zIndexTo, setZIndexTo] = useState(0);\n\n const onMinChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const minValue = Number(input.value);\n\n if (minValue > max) {\n setMax(minValue);\n setMin(minValue);\n } else {\n setMin(minValue);\n }\n };\n\n const onMaxChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const maxValue = Number(input.value);\n\n if (maxValue <= 0) {\n setZIndexTo(2);\n } else {\n setZIndexTo(0);\n }\n\n if (maxValue < min) {\n setMin(maxValue);\n setMax(maxValue);\n } else {\n setMax(maxValue);\n }\n };\n\n const background = `\n linear-gradient(\n to right,\n ${sliderColor} 0%,\n ${sliderColor} ${min}%,\n ${rangeColor} ${min}%,\n ${rangeColor} ${max}%,\n ${sliderColor} ${max}%,\n ${sliderColor} 100%)\n `;\n\n return (\n <div class='my-4 relative'>\n <input\n id='fromSlider'\n type='range'\n value={min}\n onInput={onMinChange}\n min={rangeMin}\n max={rangeMax}\n step={step}\n style={{ background, zIndex: 1, height: 0 }}\n />\n <input\n id='toSlider'\n type='range'\n value={max}\n min={rangeMin}\n max={rangeMax}\n step={step}\n onInput={onMaxChange}\n style={{ background, zIndex: zIndexTo }}\n />\n </div>\n );\n};\n","import { type FunctionComponent, type JSX } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\n\nexport type PercentInputProps = {\n percentage: number;\n setPercentage: (percentage: number) => void;\n};\n\nconst percentageInRange = (percentage: number) => {\n return percentage <= 100 && percentage >= 0;\n};\n\nexport const PercentInput: FunctionComponent<PercentInputProps> = ({ percentage, setPercentage }) => {\n const [internalPercentage, setInternalPercentage] = useState(percentage);\n\n useEffect(() => {\n setInternalPercentage(percentage);\n }, [percentage]);\n\n const handleInputChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const value = Number(input.value);\n\n const inRange = percentageInRange(value);\n\n if (inRange) {\n setPercentage(value);\n }\n setInternalPercentage(value);\n };\n\n const isError = !percentageInRange(internalPercentage);\n return (\n <label className={`input input-bordered flex items-center gap-2 w-32 ${isError ? 'input-error' : ''}`}>\n <input\n type='number'\n step={0.1}\n min={0}\n max={100}\n value={internalPercentage}\n onInput={handleInputChange}\n lang='en'\n className={`grow w-16`}\n />\n %\n </label>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { MinMaxRangeSlider } from './min-max-range-slider';\nimport { PercentInput } from './percent-intput';\n\nexport type ProportionInterval = { min: number; max: number };\n\nexport interface ProportionSelectorProps {\n proportionInterval: ProportionInterval;\n setMinProportion: (minProportion: number) => void;\n setMaxProportion: (maxProportion: number) => void;\n}\n\nexport const ProportionSelector: FunctionComponent<ProportionSelectorProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n}) => {\n const { min: minProportion, max: maxProportion } = proportionInterval;\n return (\n <div class='flex flex-col w-64 mb-2'>\n <div class='flex items-center '>\n <PercentInput\n percentage={minProportion * 100}\n setPercentage={(percentage) => setMinProportion(percentage / 100)}\n />\n <div class='m-2'>-</div>\n <PercentInput\n percentage={maxProportion * 100}\n setPercentage={(percentage) => setMaxProportion(percentage / 100)}\n />\n </div>\n <div class='my-1'>\n <MinMaxRangeSlider\n min={minProportion * 100}\n max={maxProportion * 100}\n setMin={(percentage) => setMinProportion(percentage / 100)}\n setMax={(percentage) => setMaxProportion(percentage / 100)}\n />\n </div>\n </div>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Dropdown } from './dropdown';\nimport { ProportionSelector, type ProportionSelectorProps } from './proportion-selector';\n\nexport type ProportionSelectorDropdownProps = ProportionSelectorProps;\n\nexport const ProportionSelectorDropdown: FunctionComponent<ProportionSelectorDropdownProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n}) => {\n const label = `${(proportionInterval.min * 100).toFixed(1)}% - ${(proportionInterval.max * 100).toFixed(1)}%`;\n\n return (\n <Dropdown buttonTitle={`Proportion ${label}`} placement={'bottom-start'}>\n <ProportionSelector\n proportionInterval={proportionInterval}\n setMinProportion={setMinProportion}\n setMaxProportion={setMaxProportion}\n />\n </Dropdown>\n );\n};\n","import { Fragment, type FunctionComponent } from 'preact';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { type JSXInternal } from 'preact/src/jsx';\n\ntype Tab = {\n title: string;\n content: JSXInternal.Element;\n};\n\ninterface ComponentTabsProps {\n tabs: Tab[];\n toolbar?: JSXInternal.Element | ((activeTab: string) => JSXInternal.Element);\n}\n\nconst Tabs: FunctionComponent<ComponentTabsProps> = ({ tabs, toolbar }) => {\n const [activeTab, setActiveTab] = useState(tabs[0].title);\n const [heightOfTabs, setHeightOfTabs] = useState('3rem');\n const tabRef = useRef<HTMLDivElement>(null);\n\n const updateHeightOfTabs = () => {\n if (tabRef.current) {\n const heightOfTabs = tabRef.current.getBoundingClientRect().height;\n setHeightOfTabs(`${heightOfTabs}px`);\n }\n };\n\n useEffect(() => {\n updateHeightOfTabs();\n\n window.addEventListener('resize', updateHeightOfTabs);\n return () => {\n window.removeEventListener('resize', updateHeightOfTabs);\n };\n }, []);\n\n const tabElements = (\n <div className='flex flex-row'>\n {tabs.map((tab) => {\n return (\n <Fragment key={tab.title}>\n <button\n className={`px-4 py-2 text-sm font-medium leading-5 transition-colors duration-150 ${\n activeTab === tab.title\n ? 'border-b-2 border-gray-400'\n : 'text-gray-600 hover:bg-gray-100 hover:text-gray-700'\n }`}\n onClick={() => {\n setActiveTab(tab.title);\n }}\n >\n {tab.title}\n </button>\n </Fragment>\n );\n })}\n </div>\n );\n\n const toolbarElement = typeof toolbar === 'function' ? toolbar(activeTab) : toolbar;\n\n return (\n <div className='h-full w-full'>\n <div ref={tabRef} className='flex flex-row justify-between flex-wrap'>\n {tabElements}\n {toolbar && <div className='py-2 flex flex-wrap gap-y-1'>{toolbarElement}</div>}\n </div>\n <div\n className={`p-2 border-2 border-gray-100 rounded-b-md rounded-tr-md ${activeTab === tabs[0].title ? '' : 'rounded-tl-md'}`}\n style={{ height: `calc(100% - ${heightOfTabs})` }}\n >\n {tabs.map((tab) => (\n <div className='h-full overflow-auto' key={tab.title} hidden={activeTab !== tab.title}>\n {tab.content}\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nexport default Tabs;\n","import { useEffect, useState } from 'preact/hooks';\n\nexport function useQuery<Data>(fetchDataCallback: () => Promise<Data>, dependencies: unknown[] = []) {\n const [data, setData] = useState<Data | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const fetchData = async () => {\n setIsLoading(true);\n try {\n const result = await fetchDataCallback();\n setData(result);\n setError(null);\n } catch (error) {\n setError(error as Error);\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(dependencies)]);\n\n return { data, error, isLoading };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useMemo, useState } from 'preact/hooks';\n\nimport { getMutationComparisonTableData } from './getMutationComparisonTableData';\nimport { MutationComparisonTable } from './mutation-comparison-table';\nimport { MutationComparisonVenn } from './mutation-comparison-venn';\nimport { filterMutationData, type MutationData, queryMutationData } from './queryMutationData';\nimport { type NamedLapisFilter, type SequenceType } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/SegmentSelector';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'table' | 'venn';\n\nexport interface MutationComparisonProps extends MutationComparisonInnerProps {\n width: string;\n height: string;\n}\n\nexport interface MutationComparisonInnerProps {\n lapisFilters: NamedLapisFilter[];\n sequenceType: SequenceType;\n views: View[];\n pageSize: boolean | number;\n}\n\nexport const MutationComparison: FunctionComponent<MutationComparisonProps> = ({ width, height, ...innerProps }) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <MutationComparisonInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationComparisonInner: FunctionComponent<MutationComparisonInnerProps> = ({\n lapisFilters,\n sequenceType,\n views,\n pageSize,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationData(lapisFilters, sequenceType, lapis);\n }, [lapisFilters, sequenceType, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return (\n <MutationComparisonTabs\n data={data.mutationData}\n sequenceType={sequenceType}\n views={views}\n pageSize={pageSize}\n />\n );\n};\n\ntype MutationComparisonTabsProps = {\n data: MutationData[];\n views: View[];\n sequenceType: SequenceType;\n pageSize: boolean | number;\n};\n\nconst MutationComparisonTabs: FunctionComponent<MutationComparisonTabsProps> = ({\n data,\n views,\n sequenceType,\n pageSize,\n}) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.5, max: 1 });\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(sequenceType);\n\n const filteredData = useMemo(\n () => filterMutationData(data, displayedSegments, displayedMutationTypes),\n [data, displayedSegments, displayedMutationTypes],\n );\n\n const getTab = (view: View) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <MutationComparisonTable\n data={{ content: filteredData }}\n proportionInterval={proportionInterval}\n pageSize={pageSize}\n />\n ),\n };\n case 'venn':\n return {\n title: 'Venn',\n content: (\n <MutationComparisonVenn\n data={{ content: filteredData }}\n proportionInterval={proportionInterval}\n />\n ),\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n return (\n <Tabs\n tabs={tabs}\n toolbar={\n <Toolbar\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n filteredData={filteredData}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n />\n }\n />\n );\n};\n\ntype ToolbarProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n filteredData: MutationData[];\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n filteredData,\n proportionInterval,\n setProportionInterval,\n}) => {\n return (\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getMutationComparisonTableData({ content: filteredData }, proportionInterval)}\n filename='mutation_comparison.csv'\n />\n <Info height={'100px'}>Info for mutation comparison</Info>\n </>\n );\n};\n","import { consume } from '@lit/context';\nimport { type PropertyValues, ReactiveElement } from '@lit/reactive-element';\nimport { unsafeCSS } from 'lit';\nimport { render } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nimport { lapisContext } from './lapis-context';\nimport { referenceGenomeContext } from './reference-genome-context';\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\nimport { LapisUrlContext } from '../preact/LapisUrlContext';\nimport { ReferenceGenomeContext } from '../preact/ReferenceGenomeContext';\nimport minMaxPercentSliderCss from '../preact/components/min-max-percent-slider.css?inline';\nimport tailwindStyle from '../styles/tailwind.css?inline';\n\nimport '../styles/tailwind.css';\nimport '../preact/components/min-max-percent-slider.css';\n\nconst tailwindElementCss = unsafeCSS(tailwindStyle);\nconst minMaxPercentSliderElementCss = unsafeCSS(minMaxPercentSliderCss);\n\nexport abstract class PreactLitAdapter extends ReactiveElement {\n static override styles = [tailwindElementCss, minMaxPercentSliderElementCss];\n\n /**\n * @internal\n * The URL of the Lapis instance.\n *\n * This component must be a child of a `gs-app` component.\n * This value will automatically be injected by the parent `gs-app` component.\n */\n @consume({ context: lapisContext })\n lapis: string = '';\n\n /**\n * @internal\n * The reference genomes of the underlying organism.\n * These will be fetched from the Lapis instance.\n *\n * This component must be a child of a `gs-app` component.\n * This value will automatically be injected by the parent `gs-app` component.\n */\n @consume({ context: referenceGenomeContext, subscribe: true })\n referenceGenome: ReferenceGenome = {\n nucleotideSequences: [],\n genes: [],\n };\n\n override update(changedProperties: PropertyValues) {\n const vdom = (\n <LapisUrlContext.Provider value={this.lapis}>\n <ReferenceGenomeContext.Provider value={this.referenceGenome}>\n {this.render()}\n </ReferenceGenomeContext.Provider>\n </LapisUrlContext.Provider>\n );\n super.update(changedProperties);\n render(vdom, this.renderRoot);\n }\n\n protected abstract render(): JSXInternal.Element;\n}\n","import gridJsStyle from 'gridjs/dist/theme/mermaid.css?inline';\nimport { unsafeCSS } from 'lit';\n\nimport { PreactLitAdapter } from './PreactLitAdapter';\n\nimport 'gridjs/dist/theme/mermaid.css';\n\nconst gridJsElementCss = unsafeCSS(gridJsStyle);\n\nexport abstract class PreactLitAdapterWithGridJsStyles extends PreactLitAdapter {\n static override styles = [...PreactLitAdapter.styles, gridJsElementCss];\n}\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { MutationComparison, type MutationComparisonProps } from '../../preact/mutationComparison/mutation-comparison';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component allows to compare mutations between two different datasets.\n * The datasets are selected by LAPIS filters.\n *\n * It only shows substitutions and deletions, it does not show insertions.\n *\n * ## Views\n *\n * ### Table View\n *\n * The table view shows mutations and the proportions with which the mutation occurs in the respective data subsets.\n * It only shows mutations that are present in at least one of the data subsets\n * and where the proportion is within the selected proportion interval for at least one data subset.\n *\n * ### Venn View\n *\n * The Venn view shows the overlap of mutations between the datasets in a Venn diagram.\n * A dataset is considered to have a certain mutation, if the proportion of the mutation in the dataset is within the\n * selected proportion interval.\n * Thus, changing the proportion interval may change a mutations from being \"common\" between the datasets\n * to being \"for one dataset only\".\n */\n@customElement('gs-mutation-comparison')\nexport class MutationComparisonComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * An array of LAPIS filters to select the data to compare.\n *\n * The `lapisFilter` will be sent as is to LAPIS to filter the mutation data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used as the label for the filtered dataset in the views.\n * It should be human-readable.\n */\n @property({ type: Array })\n lapisFilters: {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }[] = [];\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('table' | 'venn')[] = ['table'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <MutationComparison\n lapisFilters={this.lapisFilters}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutation-comparison-component': MutationComparisonComponent;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFiltersMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.lapisFilters, MutationComparisonProps['lapisFilters']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.sequenceType, MutationComparisonProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.views, MutationComparisonProps['views']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type InsertionEntry } from '../../types';\n\nexport function getInsertionsTableData(data: InsertionEntry[]) {\n return data.map((mutationEntry) => {\n return {\n insertion: mutationEntry.mutation,\n count: mutationEntry.count,\n };\n });\n}\n","import { type SubstitutionOrDeletionEntry } from '../../types';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\nexport function getMutationsTableData(data: SubstitutionOrDeletionEntry[], proportionInterval: ProportionInterval) {\n const byProportion = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return mutationEntry.proportion >= proportionInterval.min && mutationEntry.proportion <= proportionInterval.max;\n };\n\n return data.filter(byProportion).map((mutationEntry) => {\n return {\n mutation: mutationEntry.mutation,\n type: mutationEntry.type,\n count: mutationEntry.count,\n proportion: mutationEntry.proportion,\n };\n });\n}\n","const pattern = /(?:([A-Za-z0-9]+):)?(\\d+)$/;\n\nexport const sortMutationPositions = (a: string, b: string) => {\n const aMatch = a.match(pattern);\n const bMatch = b.match(pattern);\n\n if (aMatch && bMatch) {\n if (aMatch[1] !== bMatch[1]) {\n return aMatch[1].localeCompare(bMatch[1]);\n }\n return parseInt(aMatch[2], 10) - parseInt(bMatch[2], 10);\n }\n throw new Error(`Invalid mutation position: ${a} or ${b}`);\n};\n","import { type BaseCell } from './mutations-grid';\nimport type { SequenceType, SubstitutionOrDeletionEntry } from '../../types';\nimport { bases } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { sortMutationPositions } from '../shared/sort/sortMutationPositions';\n\nexport const getMutationsGridData = (\n data: SubstitutionOrDeletionEntry[],\n sequenceType: SequenceType,\n proportionInterval: ProportionInterval,\n) => {\n return accumulateByPosition(data, sequenceType).filter((row) => byProportion(row, proportionInterval));\n};\n\nconst accumulateByPosition = (data: SubstitutionOrDeletionEntry[], sequenceType: SequenceType) => {\n const basesOfView = bases[sequenceType];\n const positionsToProportionAtBase = new Map<string, Map<string | undefined, number>>();\n const referenceBases = new Map<string, string | undefined>();\n\n for (const mutationEntry of data) {\n const position =\n (mutationEntry.mutation.segment ? `${mutationEntry.mutation.segment}:` : '') +\n mutationEntry.mutation.position;\n referenceBases.set(position, mutationEntry.mutation.valueAtReference);\n\n const initiallyFillPositionsToProportionAtBase = () => {\n if (!positionsToProportionAtBase.has(position)) {\n const empty = new Map();\n basesOfView.forEach((base) => empty.set(base, 0));\n empty.set(mutationEntry.mutation.valueAtReference, 1);\n positionsToProportionAtBase.set(position, empty);\n }\n };\n initiallyFillPositionsToProportionAtBase();\n\n const substitutionValue =\n mutationEntry.type === 'substitution' ? mutationEntry.mutation.substitutionValue : '-';\n\n const subtractSubstitutionValue = () => {\n const proportionAtBase = positionsToProportionAtBase.get(position)!;\n proportionAtBase.set(substitutionValue, mutationEntry.proportion);\n proportionAtBase.set(\n mutationEntry.mutation.valueAtReference,\n proportionAtBase.get(mutationEntry.mutation.valueAtReference)! - mutationEntry.proportion,\n );\n };\n subtractSubstitutionValue();\n }\n const orderedPositionsToProportionAtBase = [...positionsToProportionAtBase.entries()]\n .map(([position, proportionsAtBase]) => ({ position, proportions: proportionsAtBase }))\n .sort((a, b) => {\n return sortMutationPositions(a.position, b.position);\n });\n\n return orderedPositionsToProportionAtBase.map((proportionsForBaseAtPosition) => {\n const proportions = bases[sequenceType].map((base) => {\n return {\n [base]: {\n proportion: proportionsForBaseAtPosition.proportions.get(base)!,\n isReference: base === referenceBases.get(proportionsForBaseAtPosition.position),\n },\n };\n });\n\n return {\n position: proportionsForBaseAtPosition.position,\n ...proportions.reduce((acc, curr) => ({ ...acc, ...curr }), {}),\n } as MutationsGridDataRow;\n });\n};\n\nexport type BasesData = {\n [base: string]: BaseCell;\n};\nexport type MutationsGridDataRow = BasesData & { position: string };\n\nconst byProportion = (row: MutationsGridDataRow, proportionInterval: ProportionInterval) => {\n const numbersAndIsReference = Object.values(row).filter(\n (\n cell,\n ): cell is {\n proportion: number;\n isReference: boolean;\n } => typeof cell === 'object',\n );\n\n return numbersAndIsReference.some((cell) => {\n return (\n !cell.isReference && cell.proportion >= proportionInterval.min && cell.proportion <= proportionInterval.max\n );\n });\n};\n","import { type Row } from 'gridjs';\nimport { type FunctionComponent } from 'preact';\n\nimport { getMutationsGridData } from './getMutationsGridData';\nimport { type SequenceType, type SubstitutionOrDeletionEntry } from '../../types';\nimport { bases } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { Table, tableStyle } from '../components/table';\nimport { sortMutationPositions } from '../shared/sort/sortMutationPositions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface MutationsGridProps {\n data: SubstitutionOrDeletionEntry[];\n sequenceType: SequenceType;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nexport type BaseCell = {\n proportion: number;\n isReference: boolean;\n};\n\nexport const MutationsGrid: FunctionComponent<MutationsGridProps> = ({\n data,\n sequenceType,\n proportionInterval,\n pageSize,\n}) => {\n const getHeaders = () => {\n return [\n {\n name: 'Position',\n sort: {\n compare: (a: string, b: string) => {\n return sortMutationPositions(a, b);\n },\n },\n },\n ...getBasesHeaders(),\n ];\n };\n\n const getBasesHeaders = () => {\n return bases[sequenceType].map((base) => {\n return {\n name: base,\n sort: {\n compare: (a: BaseCell, b: BaseCell) => {\n const aProportion = a.proportion;\n const bProportion = b.proportion;\n if (aProportion < bProportion) {\n return -1;\n }\n if (aProportion > bProportion) {\n return 1;\n }\n\n return 0;\n },\n },\n formatter: (cell: BaseCell) => formatProportion(cell.proportion),\n attributes: (cell: BaseCell, row: Row) => {\n // grid-js: the cell and row are null for header cells\n if (row === null) {\n return {};\n }\n\n return styleCells(cell);\n },\n };\n });\n };\n\n const styleCells = (cell: BaseCell) => {\n if (cell.isReference || cell.proportion < 0.0001) {\n return {\n style: {\n ...tableStyle.td,\n color: 'gray',\n },\n };\n }\n return {};\n };\n\n const tableData = getMutationsGridData(data, sequenceType, proportionInterval).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n","import { comparePositions, compareSegments } from './sortSubstitutionsAndDeletions';\nimport { type Insertion } from '../../../utils/mutations';\n\nexport const sortInsertions = (a: Insertion, b: Insertion) => {\n if (a.segment !== b.segment) {\n return compareSegments(a.segment, b.segment);\n }\n\n if (a.position !== b.position) {\n return comparePositions(a.position, b.position);\n }\n\n return a.insertedSymbols.localeCompare(b.insertedSymbols);\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getInsertionsTableData } from './getInsertionsTableData';\nimport { type InsertionEntry } from '../../types';\nimport { type Insertion } from '../../utils/mutations';\nimport { Table } from '../components/table';\nimport { sortInsertions } from '../shared/sort/sortInsertions';\n\nexport interface InsertionsTableProps {\n data: InsertionEntry[];\n pageSize: boolean | number;\n}\n\nexport const InsertionsTable: FunctionComponent<InsertionsTableProps> = ({ data, pageSize }) => {\n const getHeaders = () => {\n return [\n {\n name: 'Insertion',\n sort: {\n compare: (a: Insertion, b: Insertion) => {\n return sortInsertions(a, b);\n },\n },\n formatter: (cell: Insertion) => cell.toString(),\n },\n {\n name: 'Count',\n sort: true,\n },\n ];\n };\n\n const tableData = getInsertionsTableData(data).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getMutationsTableData } from './getMutationsTableData';\nimport { type SubstitutionOrDeletionEntry } from '../../types';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { Table } from '../components/table';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsTableProps {\n data: SubstitutionOrDeletionEntry[];\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nconst MutationsTable: FunctionComponent<MutationsTableProps> = ({ data, proportionInterval, pageSize }) => {\n const getHeaders = () => {\n return [\n {\n name: 'Mutation',\n sort: {\n compare: (a: Substitution | Deletion, b: Substitution | Deletion) => {\n return sortSubstitutionsAndDeletions(a, b);\n },\n },\n formatter: (cell: Substitution | Deletion) => cell.toString(),\n },\n {\n name: 'Type',\n sort: true,\n },\n {\n name: 'Count',\n sort: true,\n },\n {\n name: 'Proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ];\n };\n\n const tableData = getMutationsTableData(data, proportionInterval).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n\nexport default MutationsTable;\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchInsertions } from '../lapisApi/lapisApi';\nimport { type InsertionEntry, type LapisFilter, type SequenceType } from '../types';\nimport { Insertion } from '../utils/mutations';\n\nexport class FetchInsertionsOperator implements Operator<InsertionEntry> {\n constructor(\n private filter: LapisFilter,\n private sequenceType: SequenceType,\n ) {}\n\n async evaluate(lapisUrl: string, signal?: AbortSignal): Promise<Dataset<InsertionEntry>> {\n const insertions = (await fetchInsertions(lapisUrl, this.filter, this.sequenceType, signal)).data;\n\n const content: InsertionEntry[] = insertions.map(({ count, insertedSymbols, sequenceName, position }) => ({\n type: 'insertion',\n mutation: new Insertion(sequenceName ?? undefined, position, insertedSymbols),\n count,\n }));\n\n return { content };\n }\n}\n","import { FetchInsertionsOperator } from '../operator/FetchInsertionsOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter, type SequenceType } from '../types';\n\nexport function queryInsertions(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchInsertionsOperator(lapisFilter, sequenceType);\n const sortData = new SortOperator(fetchData, (a, b) => {\n if (a.mutation.segment !== b.mutation.segment) {\n return (a.mutation.segment ?? '').localeCompare(b.mutation.segment ?? '');\n }\n return a.mutation.position - b.mutation.position;\n });\n return sortData.evaluate(lapis, signal);\n}\n","import { queryInsertions } from '../../query/queryInsertions';\nimport { querySubstitutionsOrDeletions } from '../../query/querySubstitutionsOrDeletions';\nimport {\n type InsertionEntry,\n type LapisFilter,\n type MutationEntry,\n type SubstitutionOrDeletionEntry,\n} from '../../types';\nimport { type DisplayedSegment } from '../components/SegmentSelector';\nimport { type DisplayedMutationType } from '../components/mutation-type-selector';\n\nexport async function queryMutationsData(\n lapisFilter: LapisFilter,\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n) {\n const substitutionsOrDeletions = (await querySubstitutionsOrDeletions(lapisFilter, sequenceType, lapis)).content;\n const insertions = (await queryInsertions(lapisFilter, sequenceType, lapis)).content;\n\n return {\n substitutionsOrDeletions,\n insertions,\n };\n}\n\nexport function filterMutationsData(\n data: { insertions: InsertionEntry[]; substitutionsOrDeletions: SubstitutionOrDeletionEntry[] },\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n function bySelectedSegments(mutationEntry: MutationEntry) {\n if (mutationEntry.mutation.segment === undefined) {\n return true;\n }\n return displayedSegments.some(\n (displayedSegment) =>\n displayedSegment.segment === mutationEntry.mutation.segment && displayedSegment.checked,\n );\n }\n\n const byDisplayedMutationTypes = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return displayedMutationTypes.some(\n (displayedMutationType) =>\n displayedMutationType.checked && displayedMutationType.type === mutationEntry.type,\n );\n };\n\n const filteredSubstitutionsOrDeletions = data.substitutionsOrDeletions.filter(bySelectedSegments);\n\n return {\n insertions: data.insertions.filter(bySelectedSegments),\n tableData: filteredSubstitutionsOrDeletions.filter(byDisplayedMutationTypes),\n gridData: filteredSubstitutionsOrDeletions,\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useState } from 'preact/hooks';\n\nimport { getInsertionsTableData } from './getInsertionsTableData';\nimport { getMutationsTableData } from './getMutationsTableData';\nimport { MutationsGrid } from './mutations-grid';\nimport { InsertionsTable } from './mutations-insertions-table';\nimport MutationsTable from './mutations-table';\nimport { filterMutationsData, queryMutationsData } from './queryMutations';\nimport {\n type InsertionEntry,\n type LapisFilter,\n type SequenceType,\n type SubstitutionOrDeletionEntry,\n} from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/SegmentSelector';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'table' | 'grid' | 'insertions';\n\nexport interface MutationsInnerProps {\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n views: View[];\n pageSize: boolean | number;\n}\n\nexport interface MutationsProps extends MutationsInnerProps {\n width: string;\n height: string;\n}\n\nexport const Mutations: FunctionComponent<MutationsProps> = ({ width, height, ...innerProps }) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <MutationsInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationsInner: FunctionComponent<MutationsInnerProps> = ({\n lapisFilter,\n sequenceType,\n views,\n pageSize,\n}) => {\n const lapis = useContext(LapisUrlContext);\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationsData(lapisFilter, sequenceType, lapis);\n }, [lapisFilter, sequenceType, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MutationsTabs mutationsData={data} sequenceType={sequenceType} views={views} pageSize={pageSize} />;\n};\n\ntype MutationTabsProps = {\n mutationsData: { insertions: InsertionEntry[]; substitutionsOrDeletions: SubstitutionOrDeletionEntry[] };\n sequenceType: SequenceType;\n views: View[];\n pageSize: boolean | number;\n};\n\nconst MutationsTabs: FunctionComponent<MutationTabsProps> = ({ mutationsData, sequenceType, views, pageSize }) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 1 });\n\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(sequenceType);\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n\n const filteredData = filterMutationsData(mutationsData, displayedSegments, displayedMutationTypes);\n\n const getTab = (view: View) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <MutationsTable\n data={filteredData.tableData}\n proportionInterval={proportionInterval}\n pageSize={pageSize}\n />\n ),\n };\n case 'grid':\n return {\n title: 'Grid',\n content: (\n <MutationsGrid\n data={filteredData.gridData}\n sequenceType={sequenceType}\n proportionInterval={proportionInterval}\n pageSize={pageSize}\n />\n ),\n };\n case 'insertions':\n return {\n title: 'Insertions',\n content: <InsertionsTable data={filteredData.insertions} pageSize={pageSize} />,\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n filteredData={filteredData}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n activeTab: string;\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n filteredData: { tableData: SubstitutionOrDeletionEntry[]; insertions: InsertionEntry[] };\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n filteredData,\n proportionInterval,\n setProportionInterval,\n}) => {\n return (\n <>\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n {activeTab === 'Table' && (\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\n />\n )}\n {(activeTab === 'Table' || activeTab === 'Grid') && (\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getMutationsTableData(filteredData.tableData, proportionInterval)}\n filename='substitutions_and_deletions.csv'\n />\n </>\n )}\n {activeTab === 'Insertions' && (\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() =>\n getInsertionsTableData(filteredData.insertions).map((row) => {\n return {\n insertion: row.insertion.toString(),\n count: row.count,\n };\n })\n }\n filename='insertions.csv'\n />\n )}\n <Info height={'100px'}>Info for mutations</Info>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { Mutations, type View } from '../../preact/mutations/mutations';\nimport { type LapisFilter, type SequenceType } from '../../types';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays mutations (substitutions, deletions and insertions) for a dataset selected by a LAPIS filter.\n *\n * ## Views\n *\n * ### Table View\n *\n * The table view shows all substitutions and deletions for the dataset.\n * It shows the type (substitution or deletion), the total count of the mutation\n * and the proportion of the mutation in the dataset.\n * The proportion is relative to the total number of sequences matching\n * the specified sequence filters with non-ambiguous reads at that position.\n *\n * The proportion interval filter can be used to filter the displayed mutations on client side.\n *\n * ### Grid View\n *\n * The grid view shows the proportion of each sequence symbol (nucleotide or amino acid) for each position that has a mutation.\n * Only positions with at least one mutation in the selected proportion interval are shown.\n *\n * ### Insertions View\n *\n * The insertions view shows the count of all insertions for the dataset.\n *\n */\n@customElement('gs-mutations')\nexport class MutationsComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * LAPIS filter to select the displayed data.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('table' | 'grid' | 'insertions')[] = ['table', 'grid'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <Mutations\n lapisFilter={this.lapisFilter}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutations-component': MutationsComponent;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<Equals<typeof MutationsComponent.prototype.lapisFilter, LapisFilter>>;\ntype SequenceTypeMatches = Expect<Equals<typeof MutationsComponent.prototype.sequenceType, SequenceType>>;\ntype ViewsMatches = Expect<Equals<typeof MutationsComponent.prototype.views, View[]>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { type TemporalGranularity } from '../../types';\n\nexport function getPrevalenceOverTimeTableData(data: PrevalenceOverTimeData, granularity: TemporalGranularity) {\n return data[0].content.map((row, rowNumber) => {\n const otherColumns = data\n .map((dataset) => ({\n [`${dataset.displayName} prevalence`]: dataset.content[rowNumber].prevalence.toFixed(4),\n [`${dataset.displayName} count`]: dataset.content[rowNumber].count,\n }))\n .reduce((acc, val) => ({ ...acc, ...val }), {});\n\n return {\n [granularity]: row.dateRange?.toString() ?? 'Unknown',\n ...otherColumns,\n };\n });\n}\n","import type { Temporal } from './temporal';\n\nexport function sortNullToBeginningThenByDate(a: { dateRange: Temporal | null }, b: { dateRange: Temporal | null }) {\n return a.dateRange === null\n ? -1\n : b.dateRange === null\n ? 1\n : a.dateRange.toString().localeCompare(b.dateRange.toString());\n}\n","import { type Chart, type CoreScaleOptions, Scale } from 'chart.js';\n\nexport class LogitScale extends Scale {\n static id = 'logit';\n\n constructor(cfg: { id: string; type: string; ctx: CanvasRenderingContext2D; chart: Chart }) {\n super(cfg);\n this.min = 0.001;\n this.max = 0.999;\n }\n\n override buildTicks() {\n const tickValues = [this.min, 0.01, 0.1, 0.5, 0.9, 0.99, this.max];\n\n this.ticks = tickValues.map((value) => ({ value }));\n return this.ticks;\n }\n\n getLogit(value: number): number {\n if (value <= 0) {\n return -Infinity;\n }\n if (value >= 1) {\n return Infinity;\n }\n\n return Math.log(value / (1 - value));\n }\n\n override getPixelForValue(value: number): number {\n const logitMin = this.getLogit(this.min);\n const logitMax = this.getLogit(this.max);\n\n const logitValue = this.getLogit(value);\n\n const decimal = (logitValue - logitMin) / (logitMax - logitMin);\n\n return this.getPixelForDecimal(decimal);\n }\n}\n\ndeclare module 'chart.js' {\n export interface CartesianScaleTypeRegistry {\n logit: {\n options: CoreScaleOptions;\n };\n }\n}\n","// colorblind friendly colors taken from https://personal.sron.nl/~pault/\n\nconst ColorsRGB = {\n indigo: [51, 34, 136],\n green: [17, 119, 51],\n cyan: [136, 204, 238],\n teal: [68, 170, 153],\n olive: [153, 153, 51],\n sand: [221, 204, 119],\n rose: [204, 102, 119],\n wine: [136, 34, 85],\n purple: [170, 68, 153],\n};\n\ntype GraphColor = keyof typeof ColorsRGB;\n\nexport const singleGraphColorRGBAById = (id: number, alpha = 1) => {\n const keys = Object.keys(ColorsRGB) as GraphColor[];\n const key = keys[id % keys.length];\n\n return `rgba(${ColorsRGB[key].join(',')},${alpha})`;\n};\n\nexport const singleGraphColorRGBByName = (name: GraphColor, alpha = 1) => {\n return `rgba(${ColorsRGB[name].join(',')},${alpha})`;\n};\n","// calculateWilsonInterval calculates the Wilson score interval for 95% confidence.\n//\n// This function is based on https://github.com/erikfox/wilson-interval, but without\n// high precision math.\n//\n// observed - number of observed positive outcomes\n// sample - number of experiments or size of the sample\nexport function wilson95PercentConfidenceInterval(observed: number, sample: number) {\n const p = observed / sample;\n const n = sample;\n const z = 1.9599639715843482;\n\n const numerator = p + (z * z) / (2 * n);\n const w_plus_minus = z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * (n * n)));\n const denominator = 1 + (z * z) / n;\n\n return {\n lowerLimit: (numerator - w_plus_minus) / denominator,\n upperLimit: (numerator + w_plus_minus) / denominator,\n };\n}\n\nexport const confidenceIntervalDataLabel = (\n value: number,\n lowerLimit?: number,\n upperLimit?: number,\n prefix?: string,\n) => {\n const label = prefix ? `${prefix}: ` : '';\n\n return `${label}${value.toFixed(3)} (${lowerLimit?.toFixed(3)} - ${upperLimit?.toFixed(3)})`;\n};\n\nexport type ConfidenceIntervalMethod = 'wilson' | 'none';\n","export interface YAxisMaxConfig {\n linear?: AxisMax;\n logarithmic?: AxisMax;\n}\n\nexport type AxisMax = 'maxInData' | 'limitTo1' | number;\n\nexport const getYAxisMax = (maxInData: number, axisMax?: AxisMax) => {\n if (!axisMax) {\n return 1;\n }\n\n switch (axisMax) {\n case 'limitTo1': {\n return maxInData > 1 ? 1 : maxInData;\n }\n case 'maxInData': {\n return maxInData;\n }\n default: {\n return axisMax;\n }\n }\n};\n","export type ScaleType = 'linear' | 'logarithmic' | 'logit';\n\nexport function getYAxisScale(scaleType: ScaleType) {\n switch (scaleType) {\n case 'linear': {\n return { beginAtZero: true, type: 'linear' as const, min: 0, max: 1 };\n }\n case 'logarithmic': {\n return { type: 'logarithmic' as const, max: 1 };\n }\n case 'logit':\n return { type: 'logit' as const };\n }\n}\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables, type TooltipItem } from 'chart.js';\nimport { BarWithErrorBar, BarWithErrorBarsController } from 'chartjs-chart-error-bars';\n\nimport { maxInData } from './prevalence-over-time';\nimport {\n type PrevalenceOverTimeData,\n type PrevalenceOverTimeVariantData,\n type PrevalenceOverTimeVariantDataPoint,\n} from '../../query/queryPrevalenceOverTime';\nimport { sortNullToBeginningThenByDate } from '../../utils/sort';\nimport GsChart from '../components/chart';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { type ConfidenceIntervalMethod, wilson95PercentConfidenceInterval } from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeBarChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale, BarWithErrorBarsController, BarWithErrorBar);\n\nconst PrevalenceOverTimeBarChart = ({\n data,\n yAxisScaleType,\n confidenceIntervalMethod,\n yAxisMaxConfig,\n}: PrevalenceOverTimeBarChartProps) => {\n const nullFirstData = data.map((variantData) => {\n return {\n content: variantData.content.sort(sortNullToBeginningThenByDate),\n displayName: variantData.displayName,\n };\n });\n\n const datasets = nullFirstData.map((graphData, index) => getDataset(graphData, index, confidenceIntervalMethod));\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nullFirstData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: BarWithErrorBarsController.id,\n data: {\n datasets,\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(confidenceIntervalMethod),\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nconst getDataset = (\n prevalenceOverTimeVariant: PrevalenceOverTimeVariantData,\n index: number,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n): ChartDataset<\n typeof BarWithErrorBarsController.id,\n {\n x: string;\n yMin: number | undefined;\n yMax: number | undefined;\n y: number;\n }[]\n> => {\n return {\n borderWidth: 1,\n label: prevalenceOverTimeVariant.displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: prevalenceOverTimeVariant.content.map(mapDataPoint(confidenceIntervalMethod)),\n };\n};\n\nconst mapDataPoint = (confidenceIntervalMethod: ConfidenceIntervalMethod) => {\n return (dataPoint: PrevalenceOverTimeVariantDataPoint) => {\n const confidenceInterval = getConfidenceInterval(dataPoint, confidenceIntervalMethod);\n return {\n y: dataPoint.prevalence,\n yMin: confidenceInterval.lowerLimit,\n yMax: confidenceInterval.upperLimit,\n x: dataPoint.dateRange?.toString() ?? 'Unknown',\n };\n };\n};\n\nconst getConfidenceInterval = (\n dataPoint: PrevalenceOverTimeVariantDataPoint,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n) => {\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total);\n default:\n return { lowerLimit: undefined, upperLimit: undefined };\n }\n};\n\nconst tooltip = (confidenceIntervalMethod: ConfidenceIntervalMethod) => {\n const generalConfig = {\n mode: 'index' as const,\n intersect: false,\n };\n\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return {\n ...generalConfig,\n callbacks: {\n label: (context: TooltipItem<'barWithErrorBars'>) => {\n const value = context.dataset.data[context.dataIndex] as {\n y: number;\n yMin: number;\n yMax: number;\n };\n\n return `${context.dataset.label}: ${value.y.toFixed(3)} (${value.yMin.toFixed(3)} - ${value.yMax.toFixed(3)})`;\n },\n },\n };\n default:\n return generalConfig;\n }\n};\n\nexport default PrevalenceOverTimeBarChart;\n","export var SECONDS_A_MINUTE = 60;\nexport var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;\nexport var SECONDS_A_DAY = SECONDS_A_HOUR * 24;\nexport var SECONDS_A_WEEK = SECONDS_A_DAY * 7;\nexport var MILLISECONDS_A_SECOND = 1e3;\nexport var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; // English locales\n\nexport var MS = 'millisecond';\nexport var S = 'second';\nexport var MIN = 'minute';\nexport var H = 'hour';\nexport var D = 'day';\nexport var W = 'week';\nexport var M = 'month';\nexport var Q = 'quarter';\nexport var Y = 'year';\nexport var DATE = 'date';\nexport var FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ';\nexport var INVALID_DATE_STRING = 'Invalid Date'; // regex\n\nexport var REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/;\nexport var REGEX_FORMAT = /\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;","// English [en]\n// We don't need weekdaysShort, weekdaysMin, monthsShort in en.js locale\nexport default {\n name: 'en',\n weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n ordinal: function ordinal(n) {\n var s = ['th', 'st', 'nd', 'rd'];\n var v = n % 100;\n return \"[\" + n + (s[(v - 20) % 10] || s[v] || s[0]) + \"]\";\n }\n};","import * as C from './constant';\n\nvar padStart = function padStart(string, length, pad) {\n var s = String(string);\n if (!s || s.length >= length) return string;\n return \"\" + Array(length + 1 - s.length).join(pad) + string;\n};\n\nvar padZoneStr = function padZoneStr(instance) {\n var negMinutes = -instance.utcOffset();\n var minutes = Math.abs(negMinutes);\n var hourOffset = Math.floor(minutes / 60);\n var minuteOffset = minutes % 60;\n return \"\" + (negMinutes <= 0 ? '+' : '-') + padStart(hourOffset, 2, '0') + \":\" + padStart(minuteOffset, 2, '0');\n};\n\nvar monthDiff = function monthDiff(a, b) {\n // function from moment.js in order to keep the same result\n if (a.date() < b.date()) return -monthDiff(b, a);\n var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month());\n var anchor = a.clone().add(wholeMonthDiff, C.M);\n var c = b - anchor < 0;\n var anchor2 = a.clone().add(wholeMonthDiff + (c ? -1 : 1), C.M);\n return +(-(wholeMonthDiff + (b - anchor) / (c ? anchor - anchor2 : anchor2 - anchor)) || 0);\n};\n\nvar absFloor = function absFloor(n) {\n return n < 0 ? Math.ceil(n) || 0 : Math.floor(n);\n};\n\nvar prettyUnit = function prettyUnit(u) {\n var special = {\n M: C.M,\n y: C.Y,\n w: C.W,\n d: C.D,\n D: C.DATE,\n h: C.H,\n m: C.MIN,\n s: C.S,\n ms: C.MS,\n Q: C.Q\n };\n return special[u] || String(u || '').toLowerCase().replace(/s$/, '');\n};\n\nvar isUndefined = function isUndefined(s) {\n return s === undefined;\n};\n\nexport default {\n s: padStart,\n z: padZoneStr,\n m: monthDiff,\n a: absFloor,\n p: prettyUnit,\n u: isUndefined\n};","import * as C from './constant';\nimport en from './locale/en';\nimport U from './utils';\nvar L = 'en'; // global locale\n\nvar Ls = {}; // global loaded locale\n\nLs[L] = en;\nvar IS_DAYJS = '$isDayjsObject'; // eslint-disable-next-line no-use-before-define\n\nvar isDayjs = function isDayjs(d) {\n return d instanceof Dayjs || !!(d && d[IS_DAYJS]);\n};\n\nvar parseLocale = function parseLocale(preset, object, isLocal) {\n var l;\n if (!preset) return L;\n\n if (typeof preset === 'string') {\n var presetLower = preset.toLowerCase();\n\n if (Ls[presetLower]) {\n l = presetLower;\n }\n\n if (object) {\n Ls[presetLower] = object;\n l = presetLower;\n }\n\n var presetSplit = preset.split('-');\n\n if (!l && presetSplit.length > 1) {\n return parseLocale(presetSplit[0]);\n }\n } else {\n var name = preset.name;\n Ls[name] = preset;\n l = name;\n }\n\n if (!isLocal && l) L = l;\n return l || !isLocal && L;\n};\n\nvar dayjs = function dayjs(date, c) {\n if (isDayjs(date)) {\n return date.clone();\n } // eslint-disable-next-line no-nested-ternary\n\n\n var cfg = typeof c === 'object' ? c : {};\n cfg.date = date;\n cfg.args = arguments; // eslint-disable-line prefer-rest-params\n\n return new Dayjs(cfg); // eslint-disable-line no-use-before-define\n};\n\nvar wrapper = function wrapper(date, instance) {\n return dayjs(date, {\n locale: instance.$L,\n utc: instance.$u,\n x: instance.$x,\n $offset: instance.$offset // todo: refactor; do not use this.$offset in you code\n\n });\n};\n\nvar Utils = U; // for plugin use\n\nUtils.l = parseLocale;\nUtils.i = isDayjs;\nUtils.w = wrapper;\n\nvar parseDate = function parseDate(cfg) {\n var date = cfg.date,\n utc = cfg.utc;\n if (date === null) return new Date(NaN); // null is invalid\n\n if (Utils.u(date)) return new Date(); // today\n\n if (date instanceof Date) return new Date(date);\n\n if (typeof date === 'string' && !/Z$/i.test(date)) {\n var d = date.match(C.REGEX_PARSE);\n\n if (d) {\n var m = d[2] - 1 || 0;\n var ms = (d[7] || '0').substring(0, 3);\n\n if (utc) {\n return new Date(Date.UTC(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms));\n }\n\n return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n\n return new Date(date); // everything else\n};\n\nvar Dayjs = /*#__PURE__*/function () {\n function Dayjs(cfg) {\n this.$L = parseLocale(cfg.locale, null, true);\n this.parse(cfg); // for plugin\n\n this.$x = this.$x || cfg.x || {};\n this[IS_DAYJS] = true;\n }\n\n var _proto = Dayjs.prototype;\n\n _proto.parse = function parse(cfg) {\n this.$d = parseDate(cfg);\n this.init();\n };\n\n _proto.init = function init() {\n var $d = this.$d;\n this.$y = $d.getFullYear();\n this.$M = $d.getMonth();\n this.$D = $d.getDate();\n this.$W = $d.getDay();\n this.$H = $d.getHours();\n this.$m = $d.getMinutes();\n this.$s = $d.getSeconds();\n this.$ms = $d.getMilliseconds();\n } // eslint-disable-next-line class-methods-use-this\n ;\n\n _proto.$utils = function $utils() {\n return Utils;\n };\n\n _proto.isValid = function isValid() {\n return !(this.$d.toString() === C.INVALID_DATE_STRING);\n };\n\n _proto.isSame = function isSame(that, units) {\n var other = dayjs(that);\n return this.startOf(units) <= other && other <= this.endOf(units);\n };\n\n _proto.isAfter = function isAfter(that, units) {\n return dayjs(that) < this.startOf(units);\n };\n\n _proto.isBefore = function isBefore(that, units) {\n return this.endOf(units) < dayjs(that);\n };\n\n _proto.$g = function $g(input, get, set) {\n if (Utils.u(input)) return this[get];\n return this.set(set, input);\n };\n\n _proto.unix = function unix() {\n return Math.floor(this.valueOf() / 1000);\n };\n\n _proto.valueOf = function valueOf() {\n // timezone(hour) * 60 * 60 * 1000 => ms\n return this.$d.getTime();\n };\n\n _proto.startOf = function startOf(units, _startOf) {\n var _this = this;\n\n // startOf -> endOf\n var isStartOf = !Utils.u(_startOf) ? _startOf : true;\n var unit = Utils.p(units);\n\n var instanceFactory = function instanceFactory(d, m) {\n var ins = Utils.w(_this.$u ? Date.UTC(_this.$y, m, d) : new Date(_this.$y, m, d), _this);\n return isStartOf ? ins : ins.endOf(C.D);\n };\n\n var instanceFactorySet = function instanceFactorySet(method, slice) {\n var argumentStart = [0, 0, 0, 0];\n var argumentEnd = [23, 59, 59, 999];\n return Utils.w(_this.toDate()[method].apply( // eslint-disable-line prefer-spread\n _this.toDate('s'), (isStartOf ? argumentStart : argumentEnd).slice(slice)), _this);\n };\n\n var $W = this.$W,\n $M = this.$M,\n $D = this.$D;\n var utcPad = \"set\" + (this.$u ? 'UTC' : '');\n\n switch (unit) {\n case C.Y:\n return isStartOf ? instanceFactory(1, 0) : instanceFactory(31, 11);\n\n case C.M:\n return isStartOf ? instanceFactory(1, $M) : instanceFactory(0, $M + 1);\n\n case C.W:\n {\n var weekStart = this.$locale().weekStart || 0;\n var gap = ($W < weekStart ? $W + 7 : $W) - weekStart;\n return instanceFactory(isStartOf ? $D - gap : $D + (6 - gap), $M);\n }\n\n case C.D:\n case C.DATE:\n return instanceFactorySet(utcPad + \"Hours\", 0);\n\n case C.H:\n return instanceFactorySet(utcPad + \"Minutes\", 1);\n\n case C.MIN:\n return instanceFactorySet(utcPad + \"Seconds\", 2);\n\n case C.S:\n return instanceFactorySet(utcPad + \"Milliseconds\", 3);\n\n default:\n return this.clone();\n }\n };\n\n _proto.endOf = function endOf(arg) {\n return this.startOf(arg, false);\n };\n\n _proto.$set = function $set(units, _int) {\n var _C$D$C$DATE$C$M$C$Y$C;\n\n // private set\n var unit = Utils.p(units);\n var utcPad = \"set\" + (this.$u ? 'UTC' : '');\n var name = (_C$D$C$DATE$C$M$C$Y$C = {}, _C$D$C$DATE$C$M$C$Y$C[C.D] = utcPad + \"Date\", _C$D$C$DATE$C$M$C$Y$C[C.DATE] = utcPad + \"Date\", _C$D$C$DATE$C$M$C$Y$C[C.M] = utcPad + \"Month\", _C$D$C$DATE$C$M$C$Y$C[C.Y] = utcPad + \"FullYear\", _C$D$C$DATE$C$M$C$Y$C[C.H] = utcPad + \"Hours\", _C$D$C$DATE$C$M$C$Y$C[C.MIN] = utcPad + \"Minutes\", _C$D$C$DATE$C$M$C$Y$C[C.S] = utcPad + \"Seconds\", _C$D$C$DATE$C$M$C$Y$C[C.MS] = utcPad + \"Milliseconds\", _C$D$C$DATE$C$M$C$Y$C)[unit];\n var arg = unit === C.D ? this.$D + (_int - this.$W) : _int;\n\n if (unit === C.M || unit === C.Y) {\n // clone is for badMutable plugin\n var date = this.clone().set(C.DATE, 1);\n date.$d[name](arg);\n date.init();\n this.$d = date.set(C.DATE, Math.min(this.$D, date.daysInMonth())).$d;\n } else if (name) this.$d[name](arg);\n\n this.init();\n return this;\n };\n\n _proto.set = function set(string, _int2) {\n return this.clone().$set(string, _int2);\n };\n\n _proto.get = function get(unit) {\n return this[Utils.p(unit)]();\n };\n\n _proto.add = function add(number, units) {\n var _this2 = this,\n _C$MIN$C$H$C$S$unit;\n\n number = Number(number); // eslint-disable-line no-param-reassign\n\n var unit = Utils.p(units);\n\n var instanceFactorySet = function instanceFactorySet(n) {\n var d = dayjs(_this2);\n return Utils.w(d.date(d.date() + Math.round(n * number)), _this2);\n };\n\n if (unit === C.M) {\n return this.set(C.M, this.$M + number);\n }\n\n if (unit === C.Y) {\n return this.set(C.Y, this.$y + number);\n }\n\n if (unit === C.D) {\n return instanceFactorySet(1);\n }\n\n if (unit === C.W) {\n return instanceFactorySet(7);\n }\n\n var step = (_C$MIN$C$H$C$S$unit = {}, _C$MIN$C$H$C$S$unit[C.MIN] = C.MILLISECONDS_A_MINUTE, _C$MIN$C$H$C$S$unit[C.H] = C.MILLISECONDS_A_HOUR, _C$MIN$C$H$C$S$unit[C.S] = C.MILLISECONDS_A_SECOND, _C$MIN$C$H$C$S$unit)[unit] || 1; // ms\n\n var nextTimeStamp = this.$d.getTime() + number * step;\n return Utils.w(nextTimeStamp, this);\n };\n\n _proto.subtract = function subtract(number, string) {\n return this.add(number * -1, string);\n };\n\n _proto.format = function format(formatStr) {\n var _this3 = this;\n\n var locale = this.$locale();\n if (!this.isValid()) return locale.invalidDate || C.INVALID_DATE_STRING;\n var str = formatStr || C.FORMAT_DEFAULT;\n var zoneStr = Utils.z(this);\n var $H = this.$H,\n $m = this.$m,\n $M = this.$M;\n var weekdays = locale.weekdays,\n months = locale.months,\n meridiem = locale.meridiem;\n\n var getShort = function getShort(arr, index, full, length) {\n return arr && (arr[index] || arr(_this3, str)) || full[index].slice(0, length);\n };\n\n var get$H = function get$H(num) {\n return Utils.s($H % 12 || 12, num, '0');\n };\n\n var meridiemFunc = meridiem || function (hour, minute, isLowercase) {\n var m = hour < 12 ? 'AM' : 'PM';\n return isLowercase ? m.toLowerCase() : m;\n };\n\n var matches = function matches(match) {\n switch (match) {\n case 'YY':\n return String(_this3.$y).slice(-2);\n\n case 'YYYY':\n return Utils.s(_this3.$y, 4, '0');\n\n case 'M':\n return $M + 1;\n\n case 'MM':\n return Utils.s($M + 1, 2, '0');\n\n case 'MMM':\n return getShort(locale.monthsShort, $M, months, 3);\n\n case 'MMMM':\n return getShort(months, $M);\n\n case 'D':\n return _this3.$D;\n\n case 'DD':\n return Utils.s(_this3.$D, 2, '0');\n\n case 'd':\n return String(_this3.$W);\n\n case 'dd':\n return getShort(locale.weekdaysMin, _this3.$W, weekdays, 2);\n\n case 'ddd':\n return getShort(locale.weekdaysShort, _this3.$W, weekdays, 3);\n\n case 'dddd':\n return weekdays[_this3.$W];\n\n case 'H':\n return String($H);\n\n case 'HH':\n return Utils.s($H, 2, '0');\n\n case 'h':\n return get$H(1);\n\n case 'hh':\n return get$H(2);\n\n case 'a':\n return meridiemFunc($H, $m, true);\n\n case 'A':\n return meridiemFunc($H, $m, false);\n\n case 'm':\n return String($m);\n\n case 'mm':\n return Utils.s($m, 2, '0');\n\n case 's':\n return String(_this3.$s);\n\n case 'ss':\n return Utils.s(_this3.$s, 2, '0');\n\n case 'SSS':\n return Utils.s(_this3.$ms, 3, '0');\n\n case 'Z':\n return zoneStr;\n // 'ZZ' logic below\n\n default:\n break;\n }\n\n return null;\n };\n\n return str.replace(C.REGEX_FORMAT, function (match, $1) {\n return $1 || matches(match) || zoneStr.replace(':', '');\n }); // 'ZZ'\n };\n\n _proto.utcOffset = function utcOffset() {\n // Because a bug at FF24, we're rounding the timezone offset around 15 minutes\n // https://github.com/moment/moment/pull/1871\n return -Math.round(this.$d.getTimezoneOffset() / 15) * 15;\n };\n\n _proto.diff = function diff(input, units, _float) {\n var _this4 = this;\n\n var unit = Utils.p(units);\n var that = dayjs(input);\n var zoneDelta = (that.utcOffset() - this.utcOffset()) * C.MILLISECONDS_A_MINUTE;\n var diff = this - that;\n\n var getMonth = function getMonth() {\n return Utils.m(_this4, that);\n };\n\n var result;\n\n switch (unit) {\n case C.Y:\n result = getMonth() / 12;\n break;\n\n case C.M:\n result = getMonth();\n break;\n\n case C.Q:\n result = getMonth() / 3;\n break;\n\n case C.W:\n result = (diff - zoneDelta) / C.MILLISECONDS_A_WEEK;\n break;\n\n case C.D:\n result = (diff - zoneDelta) / C.MILLISECONDS_A_DAY;\n break;\n\n case C.H:\n result = diff / C.MILLISECONDS_A_HOUR;\n break;\n\n case C.MIN:\n result = diff / C.MILLISECONDS_A_MINUTE;\n break;\n\n case C.S:\n result = diff / C.MILLISECONDS_A_SECOND;\n break;\n\n default:\n result = diff; // milliseconds\n\n break;\n }\n\n return _float ? result : Utils.a(result);\n };\n\n _proto.daysInMonth = function daysInMonth() {\n return this.endOf(C.M).$D;\n };\n\n _proto.$locale = function $locale() {\n // get locale object\n return Ls[this.$L];\n };\n\n _proto.locale = function locale(preset, object) {\n if (!preset) return this.$L;\n var that = this.clone();\n var nextLocaleName = parseLocale(preset, object, true);\n if (nextLocaleName) that.$L = nextLocaleName;\n return that;\n };\n\n _proto.clone = function clone() {\n return Utils.w(this.$d, this);\n };\n\n _proto.toDate = function toDate() {\n return new Date(this.valueOf());\n };\n\n _proto.toJSON = function toJSON() {\n return this.isValid() ? this.toISOString() : null;\n };\n\n _proto.toISOString = function toISOString() {\n // ie 8 return\n // new Dayjs(this.valueOf() + this.$d.getTimezoneOffset() * 60000)\n // .format('YYYY-MM-DDTHH:mm:ss.SSS[Z]')\n return this.$d.toISOString();\n };\n\n _proto.toString = function toString() {\n return this.$d.toUTCString();\n };\n\n return Dayjs;\n}();\n\nvar proto = Dayjs.prototype;\ndayjs.prototype = proto;\n[['$ms', C.MS], ['$s', C.S], ['$m', C.MIN], ['$H', C.H], ['$W', C.D], ['$M', C.M], ['$y', C.Y], ['$D', C.DATE]].forEach(function (g) {\n proto[g[1]] = function (input) {\n return this.$g(input, g[0], g[1]);\n };\n});\n\ndayjs.extend = function (plugin, option) {\n if (!plugin.$i) {\n // install plugin only once\n plugin(option, Dayjs, dayjs);\n plugin.$i = true;\n }\n\n return dayjs;\n};\n\ndayjs.locale = parseLocale;\ndayjs.isDayjs = isDayjs;\n\ndayjs.unix = function (timestamp) {\n return dayjs(timestamp * 1e3);\n};\n\ndayjs.en = Ls[L];\ndayjs.Ls = Ls;\ndayjs.p = {};\nexport default dayjs;","import { FORMAT_DEFAULT } from '../../constant';\nexport default (function (o, c) {\n // locale needed later\n var proto = c.prototype;\n var oldFormat = proto.format;\n\n proto.format = function (formatStr) {\n var _this = this;\n\n var locale = this.$locale();\n\n if (!this.isValid()) {\n return oldFormat.bind(this)(formatStr);\n }\n\n var utils = this.$utils();\n var str = formatStr || FORMAT_DEFAULT;\n var result = str.replace(/\\[([^\\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, function (match) {\n switch (match) {\n case 'Q':\n return Math.ceil((_this.$M + 1) / 3);\n\n case 'Do':\n return locale.ordinal(_this.$D);\n\n case 'gggg':\n return _this.weekYear();\n\n case 'GGGG':\n return _this.isoWeekYear();\n\n case 'wo':\n return locale.ordinal(_this.week(), 'W');\n // W for week\n\n case 'w':\n case 'ww':\n return utils.s(_this.week(), match === 'w' ? 1 : 2, '0');\n\n case 'W':\n case 'WW':\n return utils.s(_this.isoWeek(), match === 'W' ? 1 : 2, '0');\n\n case 'k':\n case 'kk':\n return utils.s(String(_this.$H === 0 ? 24 : _this.$H), match === 'k' ? 1 : 2, '0');\n\n case 'X':\n return Math.floor(_this.$d.getTime() / 1000);\n\n case 'x':\n return _this.$d.getTime();\n\n case 'z':\n return \"[\" + _this.offsetName() + \"]\";\n\n case 'zzz':\n return \"[\" + _this.offsetName('long') + \"]\";\n\n default:\n return match;\n }\n });\n return oldFormat.bind(this)(result);\n };\n});","import { D, W, Y } from '../../constant';\nvar isoWeekPrettyUnit = 'isoweek';\nexport default (function (o, c, d) {\n var getYearFirstThursday = function getYearFirstThursday(year, isUtc) {\n var yearFirstDay = (isUtc ? d.utc : d)().year(year).startOf(Y);\n var addDiffDays = 4 - yearFirstDay.isoWeekday();\n\n if (yearFirstDay.isoWeekday() > 4) {\n addDiffDays += 7;\n }\n\n return yearFirstDay.add(addDiffDays, D);\n };\n\n var getCurrentWeekThursday = function getCurrentWeekThursday(ins) {\n return ins.add(4 - ins.isoWeekday(), D);\n };\n\n var proto = c.prototype;\n\n proto.isoWeekYear = function () {\n var nowWeekThursday = getCurrentWeekThursday(this);\n return nowWeekThursday.year();\n };\n\n proto.isoWeek = function (week) {\n if (!this.$utils().u(week)) {\n return this.add((week - this.isoWeek()) * 7, D);\n }\n\n var nowWeekThursday = getCurrentWeekThursday(this);\n var diffWeekThursday = getYearFirstThursday(this.isoWeekYear(), this.$u);\n return nowWeekThursday.diff(diffWeekThursday, W) + 1;\n };\n\n proto.isoWeekday = function (week) {\n if (!this.$utils().u(week)) {\n return this.day(this.day() % 7 ? week : week - 7);\n }\n\n return this.day() || 7;\n };\n\n var oldStartOf = proto.startOf;\n\n proto.startOf = function (units, startOf) {\n var utils = this.$utils();\n var isStartOf = !utils.u(startOf) ? startOf : true;\n var unit = utils.p(units);\n\n if (unit === isoWeekPrettyUnit) {\n return isStartOf ? this.date(this.date() - (this.isoWeekday() - 1)).startOf('day') : this.date(this.date() - 1 - (this.isoWeekday() - 1) + 7).endOf('day');\n }\n\n return oldStartOf.bind(this)(units, startOf);\n };\n});","import dayjs from 'dayjs/esm';\nimport advancedFormat from 'dayjs/esm/plugin/advancedFormat';\nimport isoWeek from 'dayjs/esm/plugin/isoWeek';\n\nimport type { TemporalGranularity } from '../types';\n\ndayjs.extend(isoWeek);\ndayjs.extend(advancedFormat);\n\nexport class TemporalCache {\n private yearMonthDayCache = new Map<string, YearMonthDay>();\n private yearWeekCache = new Map<string, YearWeek>();\n private yearMonthCache = new Map<string, YearMonth>();\n private yearCache = new Map<string, Year>();\n\n private constructor() {}\n\n getYearMonthDay(s: string): YearMonthDay {\n if (!this.yearMonthDayCache.has(s)) {\n this.yearMonthDayCache.set(s, YearMonthDay.parse(s, this));\n }\n return this.yearMonthDayCache.get(s)!;\n }\n\n getYearMonth(s: string): YearMonth {\n if (!this.yearMonthCache.has(s)) {\n this.yearMonthCache.set(s, YearMonth.parse(s, this));\n }\n return this.yearMonthCache.get(s)!;\n }\n\n getYearWeek(s: string): YearWeek {\n if (!this.yearWeekCache.has(s)) {\n this.yearWeekCache.set(s, YearWeek.parse(s, this));\n }\n return this.yearWeekCache.get(s)!;\n }\n\n getYear(s: string): Year {\n if (!this.yearCache.has(s)) {\n this.yearCache.set(s, Year.parse(s, this));\n }\n return this.yearCache.get(s)!;\n }\n\n private static instance = new TemporalCache();\n\n static getInstance(): TemporalCache {\n return this.instance;\n }\n}\n\nexport class YearMonthDay {\n readonly date;\n readonly dayjs;\n\n constructor(\n readonly yearNumber: number,\n readonly monthNumber: number,\n readonly dayNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.date = new Date(this.yearNumber, this.monthNumber - 1, this.dayNumber);\n this.dayjs = dayjs(this.date);\n }\n\n get text(): string {\n return this.dayjs.format('YYYY-MM-DD');\n }\n\n toString(): string {\n return this.text;\n }\n\n get firstDay(): YearMonthDay {\n return this;\n }\n\n get lastDay(): YearMonthDay {\n return this;\n }\n\n get year(): Year {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n\n get month(): YearMonth {\n return this.cache.getYearMonth(this.dayjs.format('YYYY-MM'));\n }\n\n get week(): YearWeek {\n return this.cache.getYearWeek(this.dayjs.format('GGGG-WW'));\n }\n\n addDays(days: number): YearMonthDay {\n const date = this.dayjs.add(days, 'day');\n const s = date.format('YYYY-MM-DD');\n return this.cache.getYearMonthDay(s);\n }\n\n minus(other: YearMonthDay): number {\n return this.dayjs.diff(other.dayjs, 'day');\n }\n\n static parse(s: string, cache: TemporalCache): YearMonthDay {\n const [year, month, day] = s.split('-').map((s) => parseInt(s, 10));\n return new YearMonthDay(year, month, day, cache);\n }\n}\n\nexport class YearWeek {\n constructor(\n readonly isoYearNumber: number,\n readonly isoWeekNumber: number,\n readonly cache: TemporalCache,\n ) {}\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY-WW');\n }\n\n toString(): string {\n return this.text;\n }\n\n get firstDay(): YearMonthDay {\n // \"The first week of the year, hence, always contains 4 January.\" https://en.wikipedia.org/wiki/ISO_week_date\n const firstDay = dayjs()\n .year(this.isoYearNumber)\n .month(1)\n .date(4)\n .isoWeek(this.isoWeekNumber)\n .startOf('isoWeek');\n return this.cache.getYearMonthDay(firstDay.format('YYYY-MM-DD'));\n }\n\n get lastDay(): YearMonthDay {\n const lastDay = dayjs()\n .year(this.isoYearNumber)\n .month(12)\n .date(31)\n .isoWeek(this.isoWeekNumber)\n .endOf('isoWeek');\n return this.cache.getYearMonthDay(lastDay.format('YYYY-MM-DD'));\n }\n\n get year(): Year {\n return this.cache.getYear(`${this.isoYearNumber}`);\n }\n\n addWeeks(weeks: number): YearWeek {\n const date = this.firstDay.dayjs.add(weeks, 'week');\n const s = date.format('YYYY-WW');\n return this.cache.getYearWeek(s);\n }\n\n minus(other: YearWeek): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'week');\n }\n\n static parse(s: string, cache: TemporalCache): YearWeek {\n const [year, week] = s.split('-').map((s) => parseInt(s, 10));\n return new YearWeek(year, week, cache);\n }\n}\n\nexport class YearMonth {\n constructor(\n readonly yearNumber: number,\n readonly monthNumber: number,\n readonly cache: TemporalCache,\n ) {}\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY-MM');\n }\n\n toString(): string {\n return this.text;\n }\n\n get firstDay(): YearMonthDay {\n return this.cache.getYearMonthDay(dayjs(`${this.yearNumber}-${this.monthNumber}-01`).format('YYYY-MM-DD'));\n }\n\n get lastDay(): YearMonthDay {\n return this.cache.getYearMonthDay(\n dayjs(`${this.yearNumber}-${this.monthNumber}-01`).endOf('month').format('YYYY-MM-DD'),\n );\n }\n\n get year(): Year {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n\n addMonths(months: number): YearMonth {\n const date = this.firstDay.dayjs.add(months, 'month');\n const s = date.format('YYYY-MM');\n return this.cache.getYearMonth(s);\n }\n\n minus(other: YearMonth): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'month');\n }\n\n static parse(s: string, cache: TemporalCache): YearMonth {\n const [year, month] = s.split('-').map((s) => parseInt(s, 10));\n return new YearMonth(year, month, cache);\n }\n}\n\nexport class Year {\n constructor(\n readonly year: number,\n readonly cache: TemporalCache,\n ) {}\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY');\n }\n\n toString(): string {\n return this.text;\n }\n\n get firstMonth(): YearMonth {\n return this.cache.getYearMonth(`${this.year}-01`);\n }\n\n get lastMonth(): YearMonth {\n return this.cache.getYearMonth(`${this.year}-12`);\n }\n\n get firstDay(): YearMonthDay {\n return this.firstMonth.firstDay;\n }\n\n get lastDay(): YearMonthDay {\n return this.lastMonth.lastDay;\n }\n\n addYears(years: number): Year {\n const date = this.firstDay.dayjs.add(years, 'year');\n const s = date.format('YYYY');\n return this.cache.getYear(s);\n }\n\n minus(other: Year): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'year');\n }\n\n static parse(s: string, cache: TemporalCache): Year {\n const year = parseInt(s, 10);\n return new Year(year, cache);\n }\n}\n\nexport type Temporal = YearMonthDay | YearWeek | YearMonth | Year;\n\nexport function generateAllDaysInRange(start: YearMonthDay, end: YearMonthDay): YearMonthDay[] {\n const days = [];\n const daysInBetween = end.minus(start);\n for (let i = 0; i <= daysInBetween; i++) {\n days.push(start.addDays(i));\n }\n return days;\n}\n\nexport function generateAllWeeksInRange(start: YearWeek, end: YearWeek): YearWeek[] {\n const weeks = [];\n const weeksInBetween = end.minus(start);\n for (let i = 0; i <= weeksInBetween; i++) {\n weeks.push(start.addWeeks(i));\n }\n return weeks;\n}\n\nexport function generateAllMonthsInRange(start: YearMonth, end: YearMonth): YearMonth[] {\n const months = [];\n const monthsInBetween = end.minus(start);\n for (let i = 0; i <= monthsInBetween; i++) {\n months.push(start.addMonths(i));\n }\n return months;\n}\n\nexport function generateAllYearsInRange(start: Year, end: Year): Year[] {\n const years = [];\n const yearsInBetween = end.minus(start);\n for (let i = 0; i <= yearsInBetween; i++) {\n years.push(start.addYears(i));\n }\n return years;\n}\n\nexport function generateAllInRange(start: Temporal | null, end: Temporal | null): Temporal[] {\n if (start === null || end === null) {\n return [];\n }\n if (start instanceof YearMonthDay && end instanceof YearMonthDay) {\n return generateAllDaysInRange(start, end);\n }\n if (start instanceof YearWeek && end instanceof YearWeek) {\n return generateAllWeeksInRange(start, end);\n }\n if (start instanceof YearMonth && end instanceof YearMonth) {\n return generateAllMonthsInRange(start, end);\n }\n if (start instanceof Year && end instanceof Year) {\n return generateAllYearsInRange(start, end);\n }\n throw new Error(`Invalid arguments: start and end must be of the same type: ${start}, ${end}`);\n}\n\nexport function minusTemporal(a: Temporal, b: Temporal): number {\n if (a instanceof YearMonthDay && b instanceof YearMonthDay) {\n return a.minus(b);\n }\n if (a instanceof YearWeek && b instanceof YearWeek) {\n return a.minus(b);\n }\n if (a instanceof YearMonth && b instanceof YearMonth) {\n return a.minus(b);\n }\n if (a instanceof Year && b instanceof Year) {\n return a.minus(b);\n }\n throw new Error(`Cannot compare ${a} and ${b}`);\n}\n\nexport function compareTemporal(a: Temporal | null, b: Temporal | null): number {\n if (a === null) {\n return 1;\n }\n if (b === null) {\n return -1;\n }\n const diff = minusTemporal(a, b);\n if (diff < 0) {\n return -1;\n }\n if (diff > 0) {\n return 1;\n }\n return 0;\n}\n\nexport function getMinMaxTemporal<T extends Temporal>(values: Iterable<T | null>) {\n let min: T | null = null;\n let max: T | null = null;\n for (const value of values) {\n if (value === null) {\n continue;\n }\n if (min === null || compareTemporal(value, min) < 0) {\n min = value;\n }\n if (max === null || compareTemporal(value, max) > 0) {\n max = value;\n }\n }\n if (min === null || max === null) {\n return { min: null, max: null };\n }\n return { min, max };\n}\n\nexport function addUnit(temporal: Temporal, amount: number): Temporal {\n if (temporal instanceof YearMonthDay) {\n return temporal.addDays(amount);\n }\n if (temporal instanceof YearWeek) {\n return temporal.addWeeks(amount);\n }\n if (temporal instanceof YearMonth) {\n return temporal.addMonths(amount);\n }\n if (temporal instanceof Year) {\n return temporal.addYears(amount);\n }\n throw new Error(`Invalid argument: ${temporal}`);\n}\n\nexport function parseDateStringToTemporal(date: string, granularity: TemporalGranularity) {\n const cache = TemporalCache.getInstance();\n const day = cache.getYearMonthDay(date);\n switch (granularity) {\n case 'day':\n return day;\n case 'week':\n return day.week;\n case 'month':\n return day.month;\n case 'year':\n return day.year;\n }\n}\n\nexport function dateRangeCompare(a: { dateRange: Temporal | null }, b: { dateRange: Temporal | null }) {\n if (a.dateRange === null) {\n return 1;\n }\n if (b.dateRange === null) {\n return -1;\n }\n return compareTemporal(a.dateRange, b.dateRange);\n}\n","import { type LapisFilter } from '../types';\n\nexport function getMinMaxNumber(values: Iterable<number>): [number, number] | null {\n let min = null;\n let max = null;\n for (const value of values) {\n if (min === null || value < min) {\n min = value;\n }\n if (max === null || value > max) {\n max = value;\n }\n }\n if (min === null || max === null) {\n return null;\n }\n return [min, max];\n}\n\nexport function mapLapisFilterToUrlParams(filter: LapisFilter): URLSearchParams {\n const params = Object.entries(filter).map(([key, value]) => [key, stringifyLapisFilterValue(value)]);\n\n return new URLSearchParams(params);\n}\n\nfunction stringifyLapisFilterValue(value: LapisFilter[string]) {\n if (value === null) {\n return 'null';\n }\n switch (typeof value) {\n case 'boolean':\n return value ? 'true' : 'false';\n case 'number':\n return value.toString();\n case 'string':\n return value;\n }\n}\n\nexport function makeArray<T>(arrayOrSingleItem: T | T[]) {\n if (Array.isArray(arrayOrSingleItem)) {\n return arrayOrSingleItem;\n }\n return [arrayOrSingleItem];\n}\n","import { Chart, type ChartConfiguration, registerables } from 'chart.js';\n\nimport { maxInData } from './prevalence-over-time';\nimport { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { addUnit, minusTemporal } from '../../utils/temporal';\nimport { getMinMaxNumber } from '../../utils/utils';\nimport GsChart from '../components/chart';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeBubbleChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst PrevalenceOverTimeBubbleChart = ({\n data,\n yAxisScaleType,\n yAxisMaxConfig,\n}: PrevalenceOverTimeBubbleChartProps) => {\n const nonNullDateRangeData = data.map((variantData) => {\n return {\n content: variantData.content.filter((dataPoint) => dataPoint.dateRange !== null),\n displayName: variantData.displayName,\n };\n });\n\n const firstDate = nonNullDateRangeData[0].content[0].dateRange!;\n const total = nonNullDateRangeData.map((graphData) => graphData.content.map((dataPoint) => dataPoint.total)).flat();\n const [minTotal, maxTotal] = getMinMaxNumber(total)!;\n const scaleBubble = (value: number) => {\n return ((value - minTotal) / (maxTotal - minTotal)) * 4.5 + 0.5;\n };\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nonNullDateRangeData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'bubble',\n data: {\n datasets: nonNullDateRangeData.map((graphData, index) => ({\n label: graphData.displayName,\n data: graphData.content\n .filter((dataPoint) => dataPoint.dateRange !== null)\n .map((dataPoint) => ({\n x: minusTemporal(dataPoint.dateRange!, firstDate),\n y: dataPoint.prevalence,\n r: scaleBubble(dataPoint.total),\n })),\n borderWidth: 1,\n pointRadius: 0,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n })),\n },\n options: {\n animation: false,\n maintainAspectRatio: false,\n scales: {\n x: {\n ticks: {\n callback: (value) => addUnit(firstDate, value as number).toString(),\n },\n },\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n callbacks: {\n title: (context) => {\n const dataset = nonNullDateRangeData[context[0].datasetIndex!];\n const dataPoint = dataset.content[context[0].dataIndex!];\n return dataPoint.dateRange?.toString();\n },\n label: (context) => {\n const dataset = nonNullDateRangeData[context.datasetIndex!];\n const dataPoint = dataset.content[context.dataIndex!];\n\n const percentage = (dataPoint.prevalence * 100).toFixed(2);\n const count = dataPoint.count.toFixed(0);\n const total = dataPoint.total.toFixed(0);\n\n return `${dataset.displayName}: ${percentage}%, ${count}/${total} samples`;\n },\n },\n },\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nexport default PrevalenceOverTimeBubbleChart;\n","import { Chart, type ChartConfiguration, registerables } from 'chart.js';\nimport { type TooltipItem } from 'chart.js/dist/types';\n\nimport { maxInData } from './prevalence-over-time';\nimport { type PrevalenceOverTimeData, type PrevalenceOverTimeVariantData } from '../../query/queryPrevalenceOverTime';\nimport GsChart from '../components/chart';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport {\n confidenceIntervalDataLabel,\n type ConfidenceIntervalMethod,\n wilson95PercentConfidenceInterval,\n} from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeLineChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst PrevalenceOverTimeLineChart = ({\n data,\n yAxisScaleType,\n confidenceIntervalMethod,\n yAxisMaxConfig,\n}: PrevalenceOverTimeLineChartProps) => {\n const nonNullDateRangeData = data.map((variantData) => {\n return {\n content: variantData.content.filter((dataPoint) => dataPoint.dateRange !== null),\n displayName: variantData.displayName,\n };\n });\n\n const datasets = nonNullDateRangeData\n .map((graphData, index) => getDataset(graphData, index, confidenceIntervalMethod))\n .flat();\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nonNullDateRangeData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'line',\n data: {\n datasets,\n },\n options: {\n animation: false,\n maintainAspectRatio: false,\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(confidenceIntervalMethod),\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nconst getDataset = (\n prevalenceOverTimeVariant: PrevalenceOverTimeVariantData,\n dataIndex: number,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n) => {\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return [\n getDatasetCIUpper(prevalenceOverTimeVariant, dataIndex),\n getDatasetLine(prevalenceOverTimeVariant, dataIndex),\n getDatasetCILower(prevalenceOverTimeVariant, dataIndex),\n ].flat();\n default:\n return getDatasetLine(prevalenceOverTimeVariant, dataIndex);\n }\n};\n\nconst getDatasetCIUpper = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: `${prevalenceOverTimeVariant.displayName} CI upper`,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n return {\n y: wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total).upperLimit,\n x: dataPoint.dateRange?.toString(),\n };\n }),\n borderWidth: 0,\n pointRadius: 0,\n fill: '+1',\n backgroundColor: singleGraphColorRGBAById(dataIndex, 0.3),\n});\n\nconst getDatasetCILower = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: `${prevalenceOverTimeVariant.displayName} CI lower`,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n return {\n y: wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total).lowerLimit,\n x: dataPoint.dateRange?.toString(),\n };\n }),\n borderWidth: 0,\n pointRadius: 0,\n fill: '-1',\n backgroundColor: singleGraphColorRGBAById(dataIndex, 0.3),\n});\n\nconst getDatasetLine = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: prevalenceOverTimeVariant.displayName,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n const ciLimits = wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total);\n\n return {\n y: dataPoint.prevalence,\n x: dataPoint.dateRange?.toString(),\n yCiUpper: ciLimits.upperLimit,\n yCiLower: ciLimits.lowerLimit,\n };\n }),\n borderWidth: 1,\n pointRadius: 0,\n borderColor: singleGraphColorRGBAById(dataIndex),\n backgroundColor: singleGraphColorRGBAById(dataIndex),\n});\n\ninterface Datapoint {\n y: number;\n yCiLower?: number;\n yCiUpper?: number;\n x?: string;\n}\n\nconst tooltip = (confidenceIntervalMethod?: ConfidenceIntervalMethod) => {\n const generalConfig = {\n mode: 'index' as const,\n intersect: false,\n };\n\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return {\n ...generalConfig,\n filter: ({ datasetIndex }: TooltipItem<'line'>) => {\n return isNotCiIndex(datasetIndex);\n },\n callbacks: {\n label: (context: TooltipItem<'line'>) => {\n const dataPoint = context.dataset.data[context.dataIndex] as unknown as Datapoint;\n\n return confidenceIntervalDataLabel(\n dataPoint.y,\n dataPoint.yCiLower,\n dataPoint.yCiUpper,\n context.dataset.label,\n );\n },\n },\n };\n default:\n return generalConfig;\n }\n};\n\nfunction isNotCiIndex(datasetIndex: number) {\n return datasetIndex % 3 === 1;\n}\n\nexport default PrevalenceOverTimeLineChart;\n","import { getPrevalenceOverTimeTableData } from './getPrevalenceOverTimeTableData';\nimport { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { type TemporalGranularity } from '../../types';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface PrevalenceOverTimeTableProps {\n data: PrevalenceOverTimeData;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nconst PrevalenceOverTimeTable = ({ data, granularity, pageSize }: PrevalenceOverTimeTableProps) => {\n const getSplitColumns = (data: PrevalenceOverTimeData) => {\n return data.map((dataset) => ({\n name: dataset.displayName,\n columns: [\n {\n name: 'prevalence',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n {\n name: 'count',\n sort: true,\n },\n ],\n }));\n };\n\n const getColumns = (data: PrevalenceOverTimeData) => [\n {\n name: granularity,\n sort: true,\n },\n ...getSplitColumns(data),\n ];\n\n const getData = (data: PrevalenceOverTimeData, granularity: TemporalGranularity) => {\n const dataByHeader = getPrevalenceOverTimeTableData(data, granularity);\n return Object.values(dataByHeader).map((row) => Object.values(row));\n };\n\n return <Table data={getData(data, granularity)} columns={getColumns(data)} pageSize={pageSize} />;\n};\n\nexport default PrevalenceOverTimeTable;\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchAggregated } from '../lapisApi/lapisApi';\nimport { type AggregatedItem } from '../lapisApi/lapisTypes';\nimport { type LapisFilter } from '../types';\n\nexport class FetchAggregatedOperator<Fields extends Record<string, unknown>>\n implements\n Operator<\n Fields & {\n count: number;\n }\n >\n{\n constructor(\n private filter: LapisFilter,\n private fields: string[],\n ) {}\n\n async evaluate(lapisUrl: string, signal?: AbortSignal): Promise<Dataset<Fields & { count: number }>> {\n const aggregatedResponse = (\n await fetchAggregated(\n lapisUrl,\n {\n ...this.filter,\n fields: this.fields,\n },\n signal,\n )\n ).data;\n\n if (isFieldsArrayWithCount<Fields & { count: number }>(aggregatedResponse)) {\n return {\n content: aggregatedResponse,\n };\n }\n\n throw new Error('Aggregated response does not have count');\n }\n}\n\nfunction isFieldsArrayWithCount<T>(data: AggregatedItem[]): data is (T & { count: number })[] {\n return data.every((item) => typeof item === 'object' && 'count' in item && typeof item.count === 'number');\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class FillMissingOperator<Data, KeyToFill extends keyof Data> implements Operator<Data> {\n constructor(\n private child: Operator<Data>,\n private keyField: KeyToFill,\n private getMinMaxFn: (\n values: Iterable<Data[KeyToFill]>,\n ) => { min: Data[KeyToFill]; max: Data[KeyToFill] } | null,\n private getAllRequiredKeysFn: (min: Data[KeyToFill], max: Data[KeyToFill]) => Data[KeyToFill][],\n private defaultValueFn: (key: Data[KeyToFill]) => Data,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<Data>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const existingKeys = new Set(childEvaluated.content.map((row) => row[this.keyField]));\n const minMax = this.getMinMaxFn(existingKeys);\n if (minMax === null) {\n return childEvaluated;\n }\n const { min, max } = minMax;\n const requiredKeys = this.getAllRequiredKeysFn(min, max);\n const content = childEvaluated.content;\n for (const key of requiredKeys) {\n if (!existingKeys.has(key)) {\n content.push(this.defaultValueFn(key));\n }\n }\n return { content };\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class GroupByOperator<Data, AggregationResult, KeyToGroupBy extends keyof Data>\n implements Operator<AggregationResult>\n{\n constructor(\n private child: Operator<Data>,\n private field: KeyToGroupBy,\n private aggregate: (values: Data[]) => AggregationResult,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<AggregationResult>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const grouped = new Map<Data[KeyToGroupBy], Data[]>();\n for (const row of childEvaluated.content) {\n const key = row[this.field];\n if (!grouped.has(key)) {\n grouped.set(key, []);\n }\n grouped.get(key)!.push(row);\n }\n const result = new Array<AggregationResult>();\n for (const [, values] of grouped) {\n result.push(this.aggregate(values));\n }\n\n return {\n content: result,\n };\n }\n}\n","import { GroupByOperator } from './GroupByOperator';\nimport { type Operator } from './Operator';\nimport { type NumberFields } from '../utils/type-utils';\n\ntype Result<Data, KeyToGroupBy extends keyof Data, KeyToSumBy extends keyof Data> = {\n [P in KeyToGroupBy | KeyToSumBy]: P extends KeyToGroupBy ? Data[KeyToGroupBy] : number;\n};\n\nexport class GroupByAndSumOperator<\n Data,\n KeyToGroupBy extends keyof Data,\n KeySoSumBy extends NumberFields<Data>,\n> extends GroupByOperator<Data, Result<Data, KeyToGroupBy, KeySoSumBy>, KeyToGroupBy> {\n constructor(child: Operator<Data>, groupByField: KeyToGroupBy, sumField: KeySoSumBy) {\n super(child, groupByField, (values: Data[]) => {\n let n = 0;\n for (const value of values) {\n n += value[sumField] as number;\n }\n return {\n [groupByField]: values[0][groupByField],\n [sumField]: n,\n } as Result<Data, KeyToGroupBy, KeySoSumBy>;\n });\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class MapOperator<S, T> implements Operator<T> {\n constructor(\n private child: Operator<S>,\n private func: (value: S) => T,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<T>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.map(this.func),\n };\n }\n}\n","import { MapOperator } from './MapOperator';\nimport type { Operator } from './Operator';\n\nexport class RenameFieldOperator<\n OldFieldName extends string,\n NewFieldName extends string,\n Data extends { [key in OldFieldName]: unknown },\n> extends MapOperator<Data, Data & { [key in NewFieldName]: Data[OldFieldName] }> {\n constructor(child: Operator<Data>, oldFieldName: OldFieldName, newFieldName: NewFieldName) {\n super(\n child,\n (value) =>\n ({\n ...value,\n [newFieldName]: value[oldFieldName],\n }) as Data & { [key in NewFieldName]: Data[OldFieldName] },\n );\n }\n}\n","import { type Operator } from './Operator';\n\nexport class SlidingOperator<Data, AggregationResult> implements Operator<AggregationResult> {\n constructor(\n private child: Operator<Data>,\n private windowSize: number,\n private aggregate: (values: Data[]) => AggregationResult,\n ) {\n if (windowSize < 1) {\n throw new Error('Window size must be at least 1');\n }\n }\n\n async evaluate(lapis: string, signal?: AbortSignal) {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const content = new Array<AggregationResult>();\n const numberOfWindows = Math.max(childEvaluated.content.length - this.windowSize, 0) + 1;\n for (let i = 0; i < numberOfWindows; i++) {\n content.push(this.aggregate(childEvaluated.content.slice(i, i + this.windowSize)));\n }\n return { content };\n }\n}\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { FillMissingOperator } from '../operator/FillMissingOperator';\nimport { GroupByAndSumOperator } from '../operator/GroupByAndSumOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { SlidingOperator } from '../operator/SlidingOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport type { LapisFilter, TemporalGranularity } from '../types';\nimport {\n dateRangeCompare,\n generateAllInRange,\n getMinMaxTemporal,\n parseDateStringToTemporal,\n type Temporal,\n} from '../utils/temporal';\n\nexport function queryAggregatedDataOverTime<LapisDateField extends string>(\n filter: LapisFilter,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n lapisDateField: LapisDateField,\n) {\n const fetchData = new FetchAggregatedOperator<{ [key in LapisDateField]: string | null }>(filter, [lapisDateField]);\n const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, 'date');\n const mapData = new MapOperator(dataWithFixedDateKey, (d) => mapDateToGranularityRange(d, granularity));\n const groupByData = new GroupByAndSumOperator(mapData, 'dateRange', 'count');\n const fillData = new FillMissingOperator(\n groupByData,\n 'dateRange',\n getMinMaxTemporal,\n generateAllInRange,\n (key) => ({ dateRange: key, count: 0 }),\n );\n const sortData = new SortOperator(fillData, dateRangeCompare);\n\n return smoothingWindow >= 1 ? new SlidingOperator(sortData, smoothingWindow, averageSmoothing) : sortData;\n}\n\nexport function mapDateToGranularityRange(\n data: { date: string | null; count: number },\n granularity: TemporalGranularity,\n) {\n return {\n dateRange: data.date === null ? null : parseDateStringToTemporal(data.date, granularity),\n count: data.count,\n };\n}\n\nfunction averageSmoothing(slidingWindow: { dateRange: Temporal | null; count: number }[]) {\n const average = slidingWindow.reduce((acc, curr) => acc + curr.count, 0) / slidingWindow.length;\n const centerIndex = Math.floor(slidingWindow.length / 2);\n return { dateRange: slidingWindow[centerIndex].dateRange, count: average };\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { type MappedNumber, type NumberFields } from '../utils/type-utils';\n\nexport type DivisionOperatorResult<\n KeyField extends keyof ValueObject,\n ValueObject,\n ResultField extends string,\n NumeratorField extends string,\n DenominatorField extends string,\n> = { [P in KeyField]: ValueObject[KeyField] } & MappedNumber<ResultField> &\n MappedNumber<NumeratorField> &\n MappedNumber<DenominatorField>;\n\nexport class DivisionOperator<\n ValueObject,\n KeyField extends keyof ValueObject,\n ValueField extends NumberFields<ValueObject>,\n ResultField extends string,\n NumeratorField extends string,\n DenominatorField extends string,\n> implements Operator<DivisionOperatorResult<KeyField, ValueObject, ResultField, NumeratorField, DenominatorField>>\n{\n constructor(\n private numerator: Operator<ValueObject>,\n private denominator: Operator<ValueObject>,\n private keyField: KeyField,\n private valueField: ValueField,\n private resultField: ResultField,\n private numeratorField: NumeratorField,\n private denominatorField: DenominatorField,\n ) {}\n\n async evaluate(\n lapis: string,\n signal?: AbortSignal,\n ): Promise<Dataset<DivisionOperatorResult<KeyField, ValueObject, ResultField, NumeratorField, DenominatorField>>> {\n const numeratorEvaluated = await this.numerator.evaluate(lapis, signal);\n const denominatorEvaluated = await this.denominator.evaluate(lapis, signal);\n\n const numeratorMap = new Map<ValueObject[KeyField], ValueObject[ValueField]>();\n numeratorEvaluated.content.forEach((row) => {\n numeratorMap.set(row[this.keyField], row[this.valueField]);\n });\n\n const content = denominatorEvaluated.content.map((row) => {\n const numeratorValue = numeratorMap.get(row[this.keyField]) ?? 0;\n return {\n [this.keyField]: row[this.keyField],\n [this.numeratorField]: numeratorValue as number,\n [this.denominatorField]: row[this.valueField] as number,\n [this.resultField]: (numeratorValue as number) / (row[this.valueField] as number),\n } as { [P in KeyField]: ValueObject[KeyField] } & MappedNumber<ResultField> &\n MappedNumber<NumeratorField> &\n MappedNumber<DenominatorField>;\n });\n\n return { content };\n }\n}\n","import { queryAggregatedDataOverTime } from './queryAggregatedDataOverTime';\nimport { DivisionOperator } from '../operator/DivisionOperator';\nimport { type LapisFilter, type NamedLapisFilter, type TemporalGranularity } from '../types';\nimport { type Temporal } from '../utils/temporal';\nimport { makeArray } from '../utils/utils';\n\nexport type PrevalenceOverTimeData = PrevalenceOverTimeVariantData[];\n\nexport type PrevalenceOverTimeVariantData = {\n displayName: string;\n content: PrevalenceOverTimeVariantDataPoint[];\n};\n\nexport type PrevalenceOverTimeVariantDataPoint = {\n count: number;\n prevalence: number;\n total: number;\n dateRange: Temporal | null;\n};\n\nexport function queryPrevalenceOverTime(\n numeratorFilter: NamedLapisFilter | NamedLapisFilter[],\n denominatorFilter: LapisFilter,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n lapis: string,\n lapisDateField: string,\n signal?: AbortSignal,\n): Promise<PrevalenceOverTimeData> {\n const numeratorFilters = makeArray(numeratorFilter);\n\n const denominatorData = queryAggregatedDataOverTime(\n denominatorFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n );\n const subQueries = numeratorFilters.map(async (namedLapisFilter) => {\n const { displayName, lapisFilter } = namedLapisFilter;\n const numeratorData = queryAggregatedDataOverTime(lapisFilter, granularity, smoothingWindow, lapisDateField);\n const divide = new DivisionOperator(\n numeratorData,\n denominatorData,\n 'dateRange',\n 'count',\n 'prevalence',\n 'count',\n 'total',\n );\n const dataset = await divide.evaluate(lapis, signal);\n return {\n displayName,\n content: dataset.content,\n };\n });\n return Promise.all(subQueries);\n}\n","import { type FunctionComponent } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nexport interface SelectProps {\n items: { label: string; value: string; disabled?: boolean }[];\n selected: string;\n onChange: JSXInternal.GenericEventHandler<HTMLSelectElement>;\n selectStyle?: string;\n}\n\nexport const Select: FunctionComponent<SelectProps> = ({ items, selected, onChange, selectStyle }) => {\n return (\n <select class={`select select-bordered ${selectStyle}`} value={selected} onChange={onChange}>\n {items.map((item) => (\n <option key={item.value} value={item.value} disabled={item.disabled}>\n {item.label}\n </option>\n ))}\n </select>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Select } from './select';\nimport type { ConfidenceIntervalMethod } from '../shared/charts/confideceInterval';\n\ntype ConfidenceIntervalSelectorProps = {\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n setConfidenceIntervalMethod: (method: ConfidenceIntervalMethod) => void;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n};\n\nexport const ConfidenceIntervalSelector: FunctionComponent<ConfidenceIntervalSelectorProps> = ({\n confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n confidenceIntervalMethods,\n}) => {\n if (confidenceIntervalMethods.length === 0) {\n return null;\n }\n\n const items = [\n { label: 'Confidence interval method', value: 'none', disabled: true },\n ...confidenceIntervalMethods.concat('none').map((method) => {\n switch (method) {\n case 'wilson':\n return { label: 'Wilson, 95% CI', value: 'wilson' };\n case 'none':\n return { label: 'None', value: 'none' };\n }\n }),\n ];\n\n return (\n <Select\n items={items}\n selected={confidenceIntervalMethod === undefined ? 'none' : confidenceIntervalMethod}\n onChange={(event: Event) => {\n const select = event.target as HTMLSelectElement;\n const value = select.value as ConfidenceIntervalMethod;\n setConfidenceIntervalMethod(value);\n }}\n selectStyle={'select-xs select-bordered'}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Select } from './select';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\n\nexport type ScalingSelectorProps = {\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n className?: string;\n enabledTypes?: ScaleType[];\n};\n\nconst scaleTypeItem: { label: string; value: ScaleType }[] = [\n { label: 'Linear', value: 'linear' },\n { label: 'Logarithmic', value: 'logarithmic' },\n { label: 'Logit', value: 'logit' },\n];\n\nexport const ScalingSelector: FunctionComponent<ScalingSelectorProps> = ({\n yAxisScaleType,\n setYAxisScaleType,\n className,\n enabledTypes,\n}) => {\n const items = [\n { label: 'y axis scaling type', value: 'none', disabled: true },\n ...scaleTypeItem.filter((item) => enabledTypes === undefined || enabledTypes.includes(item.value)),\n ];\n\n return (\n <Select\n items={items}\n selected={yAxisScaleType}\n onChange={(event: Event) => {\n const select = event.target as HTMLSelectElement;\n const value = select.value as ScaleType;\n setYAxisScaleType(value);\n }}\n selectStyle={`${className} select-xs select-bordered`}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport { getPrevalenceOverTimeTableData } from './getPrevalenceOverTimeTableData';\nimport PrevalenceOverTimeBarChart from './prevalence-over-time-bar-chart';\nimport PrevalenceOverTimeBubbleChart from './prevalence-over-time-bubble-chart';\nimport PrevalenceOverTimeLineChart from './prevalence-over-time-line-chart';\nimport PrevalenceOverTimeTable from './prevalence-over-time-table';\nimport { type PrevalenceOverTimeData, queryPrevalenceOverTime } from '../../query/queryPrevalenceOverTime';\nimport { type LapisFilter, type NamedLapisFilter, type TemporalGranularity } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ConfidenceIntervalSelector } from '../components/confidence-interval-selector';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info, { InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport { type ConfidenceIntervalMethod } from '../shared/charts/confideceInterval';\nimport type { YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { type ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'bar' | 'line' | 'bubble' | 'table';\n\nexport interface PrevalenceOverTimeProps extends PrevalenceOverTimeInnerProps {\n width: string;\n height: string;\n}\n\nexport interface PrevalenceOverTimeInnerProps {\n numeratorFilter: NamedLapisFilter | NamedLapisFilter[];\n denominatorFilter: LapisFilter;\n granularity: TemporalGranularity;\n smoothingWindow: number;\n views: View[];\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n lapisDateField: string;\n pageSize: boolean | number;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nexport const PrevalenceOverTime: FunctionComponent<PrevalenceOverTimeProps> = ({ width, height, ...innerProps }) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <PrevalenceOverTimeInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const PrevalenceOverTimeInner: FunctionComponent<PrevalenceOverTimeInnerProps> = ({\n numeratorFilter,\n denominatorFilter,\n granularity,\n smoothingWindow,\n views,\n confidenceIntervalMethods,\n lapisDateField,\n pageSize,\n yAxisMaxConfig,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(\n () =>\n queryPrevalenceOverTime(\n numeratorFilter,\n denominatorFilter,\n granularity,\n smoothingWindow,\n lapis,\n lapisDateField,\n ),\n [lapis, numeratorFilter, denominatorFilter, granularity, smoothingWindow],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return (\n <PrevalenceOverTimeTabs\n views={views}\n data={data}\n granularity={granularity}\n confidenceIntervalMethods={confidenceIntervalMethods}\n pageSize={pageSize}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n );\n};\n\ntype PrevalenceOverTimeTabsProps = {\n views: View[];\n data: PrevalenceOverTimeData;\n granularity: TemporalGranularity;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n pageSize: boolean | number;\n yAxisMaxConfig: YAxisMaxConfig;\n};\n\nconst PrevalenceOverTimeTabs: FunctionComponent<PrevalenceOverTimeTabsProps> = ({\n views,\n data,\n granularity,\n confidenceIntervalMethods,\n pageSize,\n yAxisMaxConfig,\n}) => {\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n const [confidenceIntervalMethod, setConfidenceIntervalMethod] = useState<ConfidenceIntervalMethod>(\n confidenceIntervalMethods.length > 0 ? confidenceIntervalMethods[0] : 'none',\n );\n\n const getTab = (view: View) => {\n switch (view) {\n case 'bar':\n return {\n title: 'Bar',\n content: (\n <PrevalenceOverTimeBarChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n confidenceIntervalMethod={confidenceIntervalMethod}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'line':\n return {\n title: 'Line',\n content: (\n <PrevalenceOverTimeLineChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n confidenceIntervalMethod={confidenceIntervalMethod}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'bubble':\n return {\n title: 'Bubble',\n content: (\n <PrevalenceOverTimeBubbleChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'table':\n return {\n title: 'Table',\n content: <PrevalenceOverTimeTable data={data} granularity={granularity} pageSize={pageSize} />,\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n data={data}\n granularity={granularity}\n confidenceIntervalMethods={confidenceIntervalMethods}\n confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n activeTab: string;\n data: PrevalenceOverTimeData;\n granularity: TemporalGranularity;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n setConfidenceIntervalMethod: (confidenceIntervalMethod: ConfidenceIntervalMethod) => void;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n yAxisScaleType,\n setYAxisScaleType,\n confidenceIntervalMethods,\n confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n data,\n granularity,\n}) => {\n return (\n <>\n {activeTab !== 'Table' && (\n <ScalingSelector yAxisScaleType={yAxisScaleType} setYAxisScaleType={setYAxisScaleType} />\n )}\n {(activeTab === 'Bar' || activeTab === 'Line') && (\n <ConfidenceIntervalSelector\n confidenceIntervalMethods={confidenceIntervalMethods}\n confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n />\n )}\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getPrevalenceOverTimeTableData(data, granularity)}\n filename='prevalence_over_time.csv'\n />\n\n <PrevalenceOverTimeInfo />\n </>\n );\n};\n\nconst PrevalenceOverTimeInfo: FunctionComponent = () => {\n return (\n <Info height={'100px'}>\n <InfoHeadline1>Prevalence over time</InfoHeadline1>\n <InfoParagraph>Prevalence over time info.</InfoParagraph>\n </Info>\n );\n};\n\nexport const maxInData = (data: PrevalenceOverTimeData) =>\n Math.max(...data.flatMap((variant) => variant.content.map((dataPoint) => dataPoint.prevalence)));\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { PrevalenceOverTime, type PrevalenceOverTimeProps } from '../../preact/prevalenceOverTime/prevalence-over-time';\nimport { type AxisMax } from '../../preact/shared/charts/getYAxisMax';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays the prevalence over time of one or more datasets, selected by LAPIS filters.\n * The prevalence is calculated as the ratio of the number of cases of each dataset to the number of cases of a reference dataset.\n * The reference dataset is also selected by a LAPIS filter.\n *\n * In the chart views,\n * - the user can select whether to display a confidence interval (not available in the bubble chart).\n * The confidence interval is calculated using [Wilson score interval](https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval),\n * with a confidence level of 95%.\n * - the x-axis shows time steps in the selected `granularity`.\n * - the user can select the y-axis scale (linear, logistic, logit).\n *\n * ## Views\n *\n * ### Bar View\n *\n * Displays the prevalence over time as a bar chart.\n * Shows a bar for each dataset of the `numeratorFilter` on every time step.\n *\n * ### Line View\n *\n * Displays the prevalence over time as a line chart.\n * Each data point is connected for better visibility.\n * Shows a line for each dataset of the `numeratorFilter`.\n *\n * ### Bubble View\n *\n * Displays the prevalence over time as a bubble chart.\n * The size of the bubbles represents the number of cases of the reference, defined by the `denominatorFilter`.\n * The height of the bubbles represents the prevalence of the datasets selected by the `numeratorFilters`.\n *\n * ### Table View\n *\n * Displays the prevalence over time as a table with one row per time point.\n */\n@customElement('gs-prevalence-over-time')\nexport class PrevalenceOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * Required.\n * Either a LAPIS filter or an array of LAPIS filters to calculate the prevalence for.\n *\n * The `lapisFilter` will be sent as is to LAPIS to select the data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used as the label the prevalence in the views.\n * It should be human-readable.\n *\n */\n @property({ type: Object })\n numeratorFilter:\n {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }\n | {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }[] = { displayName: '', lapisFilter: {} };\n\n /**\n * Required.\n *\n * The LAPIS filter, to select the data of the reference.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'day';\n\n /**\n * The number of time steps to use for smoothing the data.\n * `0` means no smoothing.\n * Must be a non-negative integer.\n *\n * For a given time, the shown value is the mean of the neighbouring measured values.\n * The `smoothingWindow` value provides the number of neighbouring values to take into account.\n * The resulting time is computed via `Math.floor(smoothingWindow / 2)`.\n */\n @property({ type: Number })\n smoothingWindow: number = 0;\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('bar' | 'line' | 'bubble' | 'table')[] = ['bar', 'line', 'bubble', 'table'];\n\n /**\n * A list of methods to calculate the confidence interval.\n * The option `none` is always available and disables confidence intervals.\n * Pass an empty array to disable the confidence interval selector.\n */\n @property({ type: Array })\n confidenceIntervalMethods: ('wilson' | 'none')[] = ['wilson'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n /**\n * The maximum value for the y-axis on all graphs in linear view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLinear: 'maxInData' | 'limitTo1' | number = 1;\n\n /**\n * The maximum value for the y-axis on all graphs in logarithmic view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLogarithmic: 'maxInData' | 'limitTo1' | number = 1;\n\n override render() {\n return (\n <PrevalenceOverTime\n numeratorFilter={this.numeratorFilter}\n denominatorFilter={this.denominatorFilter}\n granularity={this.granularity}\n smoothingWindow={this.smoothingWindow}\n views={this.views}\n confidenceIntervalMethods={this.confidenceIntervalMethods}\n width={this.width}\n height={this.height}\n lapisDateField={this.lapisDateField}\n pageSize={this.pageSize}\n yAxisMaxConfig={{\n linear: this.yAxisMaxLinear,\n logarithmic: this.yAxisMaxLogarithmic,\n }}\n />\n );\n }\n}\n\nexport interface PrevalenceOverTimeComponentProps extends Omit<PrevalenceOverTimeProps, 'yAxisMaxConfig'> {\n yAxisMaxLinear?: AxisMax;\n yAxisMaxLogarithmic?: AxisMax;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-prevalence-over-time': PrevalenceOverTimeComponent;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype NumeratorMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.numeratorFilter, PrevalenceOverTimeProps['numeratorFilter']>\n>;\ntype DenominatorMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.denominatorFilter, PrevalenceOverTimeProps['denominatorFilter']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.granularity, PrevalenceOverTimeProps['granularity']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.views, PrevalenceOverTimeProps['views']>\n>;\ntype ConfidenceIntervalMethodsMatches = Expect<\n Equals<\n typeof PrevalenceOverTimeComponent.prototype.confidenceIntervalMethods,\n PrevalenceOverTimeProps['confidenceIntervalMethods']\n >\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { Chart, type ChartConfiguration, registerables, type TooltipItem } from 'chart.js';\n\nimport { type YearMonthDay } from '../../utils/temporal';\nimport GsChart from '../components/chart';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { confidenceIntervalDataLabel } from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface RelativeGrowthAdvantageChartData {\n t: YearMonthDay[];\n proportion: number[];\n ciLower: number[];\n ciUpper: number[];\n observed: number[];\n params: {\n fd: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n };\n}\n\ninterface RelativeGrowthAdvantageChartProps {\n data: RelativeGrowthAdvantageChartData;\n yAxisScaleType: ScaleType;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst RelativeGrowthAdvantageChart = ({ data, yAxisScaleType, yAxisMaxConfig }: RelativeGrowthAdvantageChartProps) => {\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(Math.max(...data.proportion), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'line',\n data: {\n labels: data.t,\n datasets: datasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(),\n },\n },\n };\n\n return (\n <div className='flex h-full flex-col'>\n <RelativeGrowthAdvantageDisplay\n relativeAdvantage={data.params.fd.value}\n relativeAdvantageLowerBound={data.params.fd.ciLower}\n relativeAdvantageUpperBound={data.params.fd.ciUpper}\n />\n <div className='flex-1'>\n <GsChart configuration={config} />\n </div>\n </div>\n );\n};\n\nconst RelativeGrowthAdvantageDisplay = ({\n relativeAdvantage,\n relativeAdvantageLowerBound,\n relativeAdvantageUpperBound,\n}: {\n relativeAdvantage: number;\n relativeAdvantageLowerBound: number;\n relativeAdvantageUpperBound: number;\n}) => {\n return (\n <div class='mx-auto flex items-end flex-wrap'>\n <span class='text-[#606060]'>Relative advantage:</span>\n <div>\n <span class='text-2xl ml-3'> {formatProportion(relativeAdvantage)} </span>\n <span class='ml-2.5'>\n ({formatProportion(relativeAdvantageLowerBound)} - {formatProportion(relativeAdvantageUpperBound)})\n </span>\n </div>\n </div>\n );\n};\n\nconst datasets = (data: RelativeGrowthAdvantageChartData) => {\n return [\n {\n type: 'line' as const,\n label: 'Prevalence',\n data: data.proportion,\n borderWidth: 1,\n pointRadius: 0,\n borderColor: singleGraphColorRGBByName('indigo'),\n backgroundColor: singleGraphColorRGBByName('indigo'),\n },\n {\n type: 'line' as const,\n label: 'CI Lower',\n data: data.ciLower,\n borderWidth: 1,\n pointRadius: 0,\n fill: '+1',\n backgroundColor: singleGraphColorRGBByName('indigo', 0.3),\n },\n {\n type: 'line' as const,\n label: 'CI Upper',\n data: data.ciUpper,\n borderWidth: 1,\n pointRadius: 0,\n fill: '-1',\n backgroundColor: singleGraphColorRGBByName('indigo', 0.3),\n },\n {\n type: 'scatter' as const,\n label: 'Observed',\n data: data.observed,\n pointBackgroundColor: singleGraphColorRGBByName('green'),\n pointRadius: 2,\n },\n ];\n};\n\nconst tooltip = () => {\n return {\n mode: 'index' as const,\n intersect: false,\n filter: ({ datasetIndex }: TooltipItem<'line'>) => {\n return datasetIndex !== 1 && datasetIndex !== 2;\n },\n callbacks: {\n label: (context: TooltipItem<'line'>) => {\n switch (context.datasetIndex) {\n case 0: {\n const value = context.dataset.data[context.dataIndex];\n const ciLower = context.dataset.data[context.dataIndex + 1];\n const ciUpper = context.dataset.data[context.dataIndex + 2];\n if (typeof value !== 'number' || typeof ciLower !== 'number' || typeof ciUpper !== 'number') {\n return '';\n }\n return confidenceIntervalDataLabel(value, ciLower, ciUpper, context.dataset.label);\n }\n\n case 3: {\n const value = context.dataset.data[context.dataIndex];\n if (typeof value !== 'number') {\n return '';\n }\n return `Observed: ${value.toFixed(3)}`;\n }\n default:\n return '';\n }\n },\n },\n };\n};\n\nexport default RelativeGrowthAdvantageChart;\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { type LapisFilter } from '../types';\nimport { getMinMaxTemporal, TemporalCache, type YearMonthDay } from '../utils/temporal';\n\nexport type RelativeGrowthAdvantageData = Awaited<ReturnType<typeof queryRelativeGrowthAdvantage>>;\n\nexport async function queryRelativeGrowthAdvantage<LapisDateField extends string>(\n numerator: LapisFilter,\n denominator: LapisFilter,\n generationTime: number,\n lapis: string,\n lapisDateField: LapisDateField,\n signal?: AbortSignal,\n) {\n const fetchNumerator = new FetchAggregatedOperator<{\n [key in LapisDateField]: string | null;\n }>(numerator, [lapisDateField]);\n const fetchDenominator = new FetchAggregatedOperator<{\n [key in LapisDateField]: string | null;\n }>(denominator, [lapisDateField]);\n const mapToFixedDateKeyNumerator = new RenameFieldOperator(fetchNumerator, lapisDateField, 'date');\n const mapToFixedDateKeyDenominator = new RenameFieldOperator(fetchDenominator, lapisDateField, 'date');\n const mapNumerator = new MapOperator(mapToFixedDateKeyNumerator, toYearMonthDay);\n const mapDenominator = new MapOperator(mapToFixedDateKeyDenominator, toYearMonthDay);\n const [numeratorData, denominatorData] = await Promise.all([\n mapNumerator.evaluate(lapis, signal),\n mapDenominator.evaluate(lapis, signal),\n ]);\n const { min: minDate, max: maxDate } = getMinMaxTemporal(denominatorData.content.map((d) => d.date));\n if (!minDate && !maxDate) {\n return null;\n }\n\n const numeratorCounts = new Map<YearMonthDay, number>();\n numeratorData.content.forEach((d) => {\n if (d.date) {\n numeratorCounts.set(d.date, d.count);\n }\n });\n const denominatorCounts = new Map<YearMonthDay, number>();\n const requestData = {\n t: [] as number[],\n n: [] as number[],\n k: [] as number[],\n };\n denominatorData.content.forEach((d) => {\n if (d.date) {\n denominatorCounts.set(d.date, d.count);\n const t = d.date.minus(minDate);\n requestData.t.push(t);\n requestData.n.push(d.count);\n requestData.k.push(numeratorCounts.get(d.date) ?? 0);\n }\n });\n const requestPayload = {\n config: {\n alpha: 0.95,\n generationTime,\n initialCasesVariant: 1,\n initialCasesWildtype: 1,\n reproductionNumberWildtype: 1,\n tStart: 0,\n tEnd: maxDate.minus(minDate),\n },\n data: requestData,\n };\n const response = await fetch('https://cov-spectrum.org/api/v2/computed/model/chen2021Fitness', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestPayload),\n signal,\n });\n const responseData = (await response.json()) as {\n estimatedAbsoluteNumbers: {\n t: number[];\n variantCases: number[];\n wildtypeCases: number[];\n };\n estimatedProportions: {\n t: number[];\n proportion: number[];\n ciLower: number[];\n ciUpper: number[];\n };\n params: {\n a: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n fc: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n fd: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n t0: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n };\n };\n const transformed = {\n ...responseData,\n estimatedProportions: {\n ...responseData.estimatedProportions,\n t: responseData.estimatedProportions.t.map((t) => minDate.addDays(t)),\n },\n };\n const observedProportions = transformed.estimatedProportions.t.map(\n (t) => (numeratorCounts.get(t) ?? 0) / (denominatorCounts.get(t) ?? 0),\n );\n\n return {\n ...transformed,\n observedProportions,\n };\n}\n\nfunction toYearMonthDay(d: { date: string | null; count: number }) {\n const temporalCache = TemporalCache.getInstance();\n return {\n date: d.date ? temporalCache.getYearMonthDay(d.date) : null,\n count: d.count,\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport RelativeGrowthAdvantageChart from './relative-growth-advantage-chart';\nimport {\n queryRelativeGrowthAdvantage,\n type RelativeGrowthAdvantageData,\n} from '../../query/queryRelativeGrowthAdvantage';\nimport { type LapisFilter } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info, { InfoHeadline1, InfoHeadline2, InfoLink, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport { type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { type ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'line';\n\nexport interface RelativeGrowthAdvantageProps extends RelativeGrowthAdvantagePropsInner {\n width: string;\n height: string;\n}\n\nexport interface RelativeGrowthAdvantagePropsInner {\n numeratorFilter: LapisFilter;\n denominatorFilter: LapisFilter;\n generationTime: number;\n views: View[];\n lapisDateField: string;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nexport const RelativeGrowthAdvantage: FunctionComponent<RelativeGrowthAdvantageProps> = ({\n width,\n height,\n ...innerProps\n}) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <RelativeGrowthAdvantageInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const RelativeGrowthAdvantageInner: FunctionComponent<RelativeGrowthAdvantagePropsInner> = ({\n numeratorFilter,\n denominatorFilter,\n generationTime,\n views,\n lapisDateField,\n yAxisMaxConfig,\n}) => {\n const lapis = useContext(LapisUrlContext);\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n\n const { data, error, isLoading } = useQuery(\n () => queryRelativeGrowthAdvantage(numeratorFilter, denominatorFilter, generationTime, lapis, lapisDateField),\n [lapis, numeratorFilter, denominatorFilter, generationTime, views],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return (\n <RelativeGrowthAdvantageTabs\n data={data}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n views={views}\n generationTime={generationTime}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n );\n};\n\ntype RelativeGrowthAdvantageTabsProps = {\n data: NonNullable<RelativeGrowthAdvantageData>;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n views: View[];\n generationTime: number;\n yAxisMaxConfig: YAxisMaxConfig;\n};\n\nconst RelativeGrowthAdvantageTabs: FunctionComponent<RelativeGrowthAdvantageTabsProps> = ({\n data,\n yAxisScaleType,\n setYAxisScaleType,\n views,\n generationTime,\n yAxisMaxConfig,\n}) => {\n const getTab = (view: View) => {\n switch (view) {\n case 'line':\n return {\n title: 'Line',\n content: (\n <RelativeGrowthAdvantageChart\n data={{\n ...data.estimatedProportions,\n observed: data.observedProportions,\n params: data.params,\n }}\n yAxisScaleType={yAxisScaleType}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n const toolbar = () => (\n <RelativeGrowthAdvantageToolbar\n generationTime={generationTime}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype RelativeGrowthAdvantageToolbarProps = {\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n generationTime: number;\n};\n\nconst RelativeGrowthAdvantageToolbar: FunctionComponent<RelativeGrowthAdvantageToolbarProps> = ({\n yAxisScaleType,\n setYAxisScaleType,\n generationTime,\n}) => {\n return (\n <>\n <ScalingSelector yAxisScaleType={yAxisScaleType} setYAxisScaleType={setYAxisScaleType} />\n <RelativeGrowthAdvantageInfo generationTime={generationTime} />\n </>\n );\n};\n\nconst RelativeGrowthAdvantageInfo: FunctionComponent<{ generationTime: number }> = ({ generationTime }) => {\n return (\n <Info>\n <InfoHeadline1>Relative growth advantage</InfoHeadline1>\n <InfoParagraph>\n If variants spread pre-dominantly by local transmission across demographic groups, this estimate\n reflects the relative viral intrinsic growth advantage of the focal variant in the selected country and\n time frame. We report the relative growth advantage per {generationTime} days (in percentage; 0% means\n equal growth). Importantly, the relative growth advantage estimate reflects the advantage compared to\n the co-circulating variants. Thus, as new variants spread, the advantage of the focal variant may\n decrease. Different mechanisms can alter the intrinsic growth rate, including an intrinsic transmission\n advantage, immune evasion, and a prolonged infectious period. When absolute numbers of a variant are\n low, the growth advantage may merely reflect the current importance of introductions from abroad or the\n variant spreading in a particular demographic group. In this case, the estimate does not provide\n information on any intrinsic fitness advantages.\n </InfoParagraph>\n <InfoParagraph>\n Example: Assume that 10 infections from the focal variant and 100 infections from the co-circulating\n variants occur today and that the focal variant has a relative growth advantage of 50%. Then, if the\n number of new infections from the co-circulating variants remains at 100 in {generationTime} days from\n today, we expect the number of new infections from the focal variant to be 15.\n </InfoParagraph>\n\n <InfoHeadline2>Reference</InfoHeadline2>\n <InfoParagraph>\n Chen, Chaoran, et al. \"Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland.\"\n Epidemics (2021); doi:{' '}\n <InfoLink href='https://www.sciencedirect.com/science/article/pii/S1755436521000335?via=ihub'>\n 10.1016/j.epidem.2021.100480\n </InfoLink>\n </InfoParagraph>\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport {\n RelativeGrowthAdvantage,\n type RelativeGrowthAdvantageProps,\n type View,\n} from '../../preact/relativeGrowthAdvantage/relative-growth-advantage';\nimport { type AxisMax } from '../../preact/shared/charts/getYAxisMax';\nimport type { LapisFilter } from '../../types';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n *\n * For this component, we assume a discrete time model, where new infections happen exactly every `generationTime` days.\n * This is what we call a \"generation\".\n *\n * This component estimates the relative growth advantage of a variant (defined by its LAPIS filter) by performing a logistic regression.\n * Based on the inferred logistic growth rate, we derive the relative growth advantage (per generation).\n *\n * For details on the scientific method, see:\n * Chen, Chaoran, et al. \"Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland.\" Epidemics (2021);\n * doi: [10.1016/j.epidem.2021.100480](https://doi.org/10.1016/j.epidem.2021.100480)\n *\n * This component fetches aggregated data from LAPIS.\n * Then the data is sent to `https://cov-spectrum.org/api/v2/computed/model/chen2021Fitness`\n * which performs the logistic regression and calculates the relative growth advantage.\n *\n * ## Views\n *\n * ### Line View\n *\n * The line view shows the relative growth advantage over time in a line chart.\n * The dots in the plot show the proportions of the focal variant (defined by the `numeratorFilter`) to the baseline variant (defined by the `denominatorFilter`)\n * for every day as observed in the data.\n * The line shows a logistic curve fitted to the data points, including a 95% confidence interval.\n */\n@customElement('gs-relative-growth-advantage')\nexport class RelativeGrowthAdvantageComponent extends PreactLitAdapter {\n /**\n * Required.\n *\n * LAPIS filter to select the data of the focal variant.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n numeratorFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * Required.\n *\n * LAPIS filter to select the data of the baseline variant.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The generation time represents the number of days over which the variant's relative growth advantage is measured.\n * For example, if we set a generation time of 7 days, then we estimate the growth advantage per week.\n */\n @property({ type: Number })\n generationTime: number = 7;\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: 'line'[] = ['line'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n /**\n * The maximum value for the y-axis on all graphs in linear view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLinear: 'maxInData' | 'limitTo1' | number = 1;\n\n /**\n * The maximum value for the y-axis on all graphs in logarithmic view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLogarithmic: 'maxInData' | 'limitTo1' | number = 1;\n\n override render() {\n return (\n <RelativeGrowthAdvantage\n numeratorFilter={this.numeratorFilter}\n denominatorFilter={this.denominatorFilter}\n generationTime={this.generationTime}\n views={this.views}\n width={this.width}\n height={this.height}\n lapisDateField={this.lapisDateField}\n yAxisMaxConfig={{\n linear: this.yAxisMaxLinear,\n logarithmic: this.yAxisMaxLogarithmic,\n }}\n />\n );\n }\n}\n\nexport interface RelativeGrowthAdvantageComponentProps extends Omit<RelativeGrowthAdvantageProps, 'yAxisMaxConfig'> {\n yAxisMaxLinear?: AxisMax;\n yAxisMaxLogarithmic?: AxisMax;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype NumeratorMatches = Expect<Equals<typeof RelativeGrowthAdvantageComponent.prototype.numeratorFilter, LapisFilter>>;\ntype DenominatorMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.denominatorFilter, LapisFilter>\n>;\ntype ViewsMatches = Expect<Equals<typeof RelativeGrowthAdvantageComponent.prototype.views, View[]>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type InitialSort } from '../preact/aggregatedData/aggregate';\nimport { type LapisFilter } from '../types';\n\nexport type AggregateData = (Record<string, string | null | number | boolean> & {\n count: number;\n proportion: number;\n})[];\n\nexport const compareAscending = (a: string | null | number, b: string | null | number) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n const strA = a != null ? String(a) : '';\n const strB = b != null ? String(b) : '';\n\n return strA.localeCompare(strB);\n};\n\nexport async function queryAggregateData(\n lapisFilter: LapisFilter,\n fields: string[],\n lapis: string,\n initialSort: InitialSort = { field: 'count', direction: 'descending' },\n signal?: AbortSignal,\n) {\n const validSortFields = ['count', 'proportion', ...fields];\n if (!validSortFields.includes(initialSort.field)) {\n throw new Error(`InitialSort field not in fields. Valid fields are: ${validSortFields.join(', ')}`);\n }\n\n const fetchData = new FetchAggregatedOperator<Record<string, string | null | number>>(lapisFilter, fields);\n const sortData = new SortOperator(fetchData, (a, b) => {\n return initialSort.direction === 'ascending'\n ? compareAscending(a[initialSort.field], b[initialSort.field])\n : compareAscending(b[initialSort.field], a[initialSort.field]);\n });\n const data = (await sortData.evaluate(lapis, signal)).content;\n\n const total = data.reduce((acc, row) => acc + row.count, 0);\n\n return data.map(\n (row) =>\n ({\n ...row,\n proportion: row.count / total,\n }) as Record<string, string | null | number | boolean> & {\n count: number;\n proportion: number;\n },\n );\n}\n","import { type FunctionComponent } from 'preact';\n\nimport { type AggregateData, compareAscending } from '../../query/queryAggregateData';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ntype AggregateTableProps = {\n fields: string[];\n data: AggregateData;\n pageSize: boolean | number;\n};\n\nexport const AggregateTable: FunctionComponent<AggregateTableProps> = ({ data, fields, pageSize }) => {\n const headers = [\n ...fields.map((field) => {\n return {\n name: field,\n sort: {\n compare: compareAscending,\n },\n };\n }),\n {\n name: 'count',\n sort: true,\n },\n {\n name: 'proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ];\n\n return <Table data={data} columns={headers} pageSize={pageSize} />;\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\n\nimport { AggregateTable } from './aggregate-table';\nimport { type AggregateData, queryAggregateData } from '../../query/queryAggregateData';\nimport { type LapisFilter } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'table';\nexport type InitialSort = { field: string; direction: 'ascending' | 'descending' };\n\nexport type AggregateProps = {\n width: string;\n height: string;\n} & AggregateInnerProps;\n\nexport interface AggregateInnerProps {\n filter: LapisFilter;\n fields: string[];\n views: View[];\n initialSortField: string;\n initialSortDirection: 'ascending' | 'descending';\n pageSize: boolean | number;\n}\n\nexport const Aggregate: FunctionComponent<AggregateProps> = ({ width, height, ...innerProps }) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <AggregateInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const AggregateInner: FunctionComponent<AggregateInnerProps> = ({\n fields,\n views,\n filter,\n initialSortField,\n initialSortDirection,\n pageSize,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryAggregateData(filter, fields, lapis, { field: initialSortField, direction: initialSortDirection });\n }, [filter, fields, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <AggregatedDataTabs data={data} views={views} fields={fields} pageSize={pageSize} />;\n};\n\ntype AggregatedDataTabsProps = {\n data: AggregateData;\n fields: string[];\n views: View[];\n pageSize: boolean | number;\n};\n\nconst AggregatedDataTabs: FunctionComponent<AggregatedDataTabsProps> = ({ data, views, fields, pageSize }) => {\n const getTab = (view: View) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: <AggregateTable data={data} fields={fields} pageSize={pageSize} />,\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n return <Tabs tabs={tabs} toolbar={<Toolbar data={data} />} />;\n};\n\ntype ToolbarProps = {\n data: AggregateData;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({ data }) => {\n return (\n <div class='flex flex-row'>\n <CsvDownloadButton className='mx-1 btn btn-xs' getData={() => data} filename='aggregate.csv' />\n <Info height={'100px'}>Info for aggregate</Info>\n </div>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { Aggregate, type View } from '../../preact/aggregatedData/aggregate';\nimport { type LapisFilter } from '../../types';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays aggregated data in a table, which can provide an overview of the underlying data.\n *\n * It expects a list of `fields` to aggregate by and a `filter` to apply to the data.\n *\n * ## Views\n *\n * ### Table View\n *\n * In the table view, the data is presented in a table format where each field is a column,\n * along with the aggregated value and its proportion.\n * The proportion represents the ratio of the aggregated value to the total count of the data\n * (considering the applied filter).\n */\n@customElement('gs-aggregate')\nexport class AggregateComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * The fields to aggregate by.\n * Every field will be a table column.\n * Every field must exist in the backing LAPIS instance.\n *\n * If left empty, the component will only show the absolute count of the provided `filter` and proportion `100%`.\n */\n @property({ type: Array })\n fields: string[] = [];\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: View[] = ['table'];\n\n /**\n * The filter to apply to the data.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n filter: LapisFilter = {};\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The field by which the table is initially sorted.\n * Must be one of the fields specified in the fields property, 'count', or 'proportion'.\n */\n @property({ type: String })\n initialSortField: string = 'count';\n\n /**\n * The initial sort direction of the table.\n */\n @property({ type: String })\n initialSortDirection: 'ascending' | 'descending' = 'descending';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <Aggregate\n fields={this.fields}\n views={this.views}\n filter={this.filter}\n width={this.width}\n height={this.height}\n initialSortField={this.initialSortField}\n initialSortDirection={this.initialSortDirection}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-aggregate-component': AggregateComponent;\n }\n}\n","import type { NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport { generateAllInRange, getMinMaxTemporal, type Temporal } from '../../utils/temporal';\n\ntype TableRow<DateRangeKey extends string> = { [K in DateRangeKey]: string } & { [key: string]: number };\n\nexport const getNumberOfSequencesOverTimeTableData = <DateRangeKey extends string>(\n data: NumberOfSequencesDatasets,\n dateRangeKey: DateRangeKey,\n) => {\n const datasetsWithCountByDate = data.map(({ displayName, content }) => ({\n displayName,\n content: new Map(content.map((datum) => [datum.dateRange?.toString(), datum])),\n }));\n\n const allDateRangesThatOccurInData = datasetsWithCountByDate\n .map(({ content }) => [...content.values()].map((datum) => datum.dateRange))\n .reduce((acc, keys) => new Set([...acc, ...keys]), new Set<Temporal | null>());\n\n const minMax = getMinMaxTemporal(allDateRangesThatOccurInData);\n if (minMax === null) {\n return [];\n }\n\n const allDateRanges: (Temporal | null)[] = generateAllInRange(minMax.min, minMax.max);\n\n if (allDateRangesThatOccurInData.has(null)) {\n allDateRanges.unshift(null);\n }\n\n return allDateRanges.map((dateRange) => {\n return datasetsWithCountByDate.reduce(\n (acc, dataset) => ({\n ...acc,\n [dataset.displayName]: dataset.content.get(dateRange?.toString())?.count ?? 0,\n }),\n { [dateRangeKey]: dateRange?.toString() ?? 'Unknown' } as TableRow<DateRangeKey>,\n );\n });\n};\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport GsChart from '../components/chart';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface NumberSequencesOverBarChartProps {\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n}\n\nChart.register(...registerables);\n\nexport const NumberSequencesOverTimeBarChart = ({ data, yAxisScaleType }: NumberSequencesOverBarChartProps) => {\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'bar',\n data: {\n datasets: getDatasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: {\n type: getYAxisScale(yAxisScaleType).type,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n },\n },\n },\n }),\n [data, yAxisScaleType],\n );\n\n return <GsChart configuration={config} />;\n};\n\nconst getDatasets = (data: NumberOfSequencesDatasets) => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, 'date');\n\n return data.map(\n ({ displayName }, index) =>\n ({\n borderWidth: 1,\n label: displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: tableData.map((row) => ({\n x: row.date,\n y: row[displayName],\n })),\n }) as ChartDataset<'bar', { x: string; y: number }[]>,\n );\n};\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport GsChart from '../components/chart';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface NumberSequencesOverBarChartProps {\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n}\n\nChart.register(...registerables);\n\nexport const NumberSequencesOverTimeLineChart = ({ data, yAxisScaleType }: NumberSequencesOverBarChartProps) => {\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'line',\n data: {\n datasets: getDatasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: {\n type: getYAxisScale(yAxisScaleType).type,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n },\n },\n },\n }),\n [data, yAxisScaleType],\n );\n\n return <GsChart configuration={config} />;\n};\n\nconst getDatasets = (data: NumberOfSequencesDatasets) => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, 'date');\n\n return data.map(\n ({ displayName }, index) =>\n ({\n borderWidth: 1,\n pointRadius: 0,\n label: displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: tableData.map((row) => ({\n x: row.date,\n y: row[displayName],\n })),\n }) as ChartDataset<'line', { x: string; y: number }[]>,\n );\n};\n","import { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport { type TemporalGranularity } from '../../types';\nimport { Table } from '../components/table';\n\ninterface NumberSequencesOverTimeTableProps {\n data: NumberOfSequencesDatasets;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nexport const NumberSequencesOverTimeTable = ({ data, granularity, pageSize }: NumberSequencesOverTimeTableProps) => {\n const columns = [\n {\n name: granularity,\n sort: true,\n },\n ...data.map((dataset) => ({\n name: dataset.displayName,\n sort: true,\n })),\n ];\n\n const flatTableData = useMemo(() => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, granularity);\n return Object.values(tableData).map((row) => Object.values(row));\n }, [data, granularity]);\n\n return <Table data={flatTableData} columns={columns} pageSize={pageSize} />;\n};\n","import { queryAggregatedDataOverTime } from './queryAggregatedDataOverTime';\nimport { type NamedLapisFilter, type TemporalGranularity } from '../types';\nimport { sortNullToBeginningThenByDate } from '../utils/sort';\nimport { makeArray } from '../utils/utils';\n\nexport type NumberOfSequencesDatasets = Awaited<ReturnType<typeof queryNumberOfSequencesOverTime>>;\n\nexport async function queryNumberOfSequencesOverTime(\n lapis: string,\n lapisFilter: NamedLapisFilter | NamedLapisFilter[],\n lapisDateField: string,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n) {\n const lapisFilters = makeArray(lapisFilter);\n\n const queries = lapisFilters.map(async ({ displayName, lapisFilter }) => {\n const { content } = await queryAggregatedDataOverTime(\n lapisFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n ).evaluate(lapis);\n\n return {\n displayName,\n content: content.sort(sortNullToBeginningThenByDate),\n };\n });\n\n return Promise.all(queries);\n}\n","import { useContext, useState } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { NumberSequencesOverTimeBarChart } from './number-sequences-over-time-bar-chart';\nimport { NumberSequencesOverTimeLineChart } from './number-sequences-over-time-line-chart';\nimport { NumberSequencesOverTimeTable } from './number-sequences-over-time-table';\nimport {\n type NumberOfSequencesDatasets,\n queryNumberOfSequencesOverTime,\n} from '../../query/queryNumberOfSequencesOverTime';\nimport type { NamedLapisFilter, TemporalGranularity } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info, { InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\ntype NumberSequencesOverTimeView = 'bar' | 'line' | 'table';\n\nexport interface NumberSequencesOverTimeProps extends NumberSequencesOverTimeInnerProps {\n width: string;\n height: string;\n}\n\ninterface NumberSequencesOverTimeInnerProps {\n lapisFilter: NamedLapisFilter | NamedLapisFilter[];\n lapisDateField: string;\n views: NumberSequencesOverTimeView[];\n granularity: TemporalGranularity;\n smoothingWindow: number;\n pageSize: boolean | number;\n}\n\nexport const NumberSequencesOverTime = ({ width, height, ...innerProps }: NumberSequencesOverTimeProps) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <NumberSequencesOverTimeInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst NumberSequencesOverTimeInner = ({\n lapisFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n views,\n pageSize,\n}: NumberSequencesOverTimeInnerProps) => {\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(() =>\n queryNumberOfSequencesOverTime(lapis, lapisFilter, lapisDateField, granularity, smoothingWindow),\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <NumberSequencesOverTimeTabs views={views} data={data} granularity={granularity} pageSize={pageSize} />;\n};\n\ninterface NumberSequencesOverTimeTabsProps {\n views: NumberSequencesOverTimeView[];\n data: NumberOfSequencesDatasets;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nconst NumberSequencesOverTimeTabs = ({ views, data, granularity, pageSize }: NumberSequencesOverTimeTabsProps) => {\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n\n const getTab = (view: NumberSequencesOverTimeView) => {\n switch (view) {\n case 'bar':\n return {\n title: 'Bar',\n content: <NumberSequencesOverTimeBarChart data={data} yAxisScaleType={yAxisScaleType} />,\n };\n case 'line':\n return {\n title: 'Line',\n content: <NumberSequencesOverTimeLineChart data={data} yAxisScaleType={yAxisScaleType} />,\n };\n case 'table':\n return {\n title: 'Table',\n content: <NumberSequencesOverTimeTable data={data} granularity={granularity} pageSize={pageSize} />,\n };\n default:\n throw new Error(`Unknown view: ${view}`);\n }\n };\n\n return (\n <Tabs\n tabs={views.map((view) => getTab(view))}\n toolbar={(activeTab) => (\n <Toolbar\n activeTab={activeTab}\n data={data}\n granularity={granularity}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n />\n )}\n />\n );\n};\n\ninterface ToolbarProps {\n activeTab: string;\n data: NumberOfSequencesDatasets;\n granularity: TemporalGranularity;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n}\n\nconst Toolbar = ({ activeTab, data, granularity, yAxisScaleType, setYAxisScaleType }: ToolbarProps) => {\n return (\n <>\n {activeTab !== 'Table' && (\n <ScalingSelector\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n enabledTypes={['linear', 'logarithmic']}\n />\n )}\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getNumberOfSequencesOverTimeTableData(data, granularity)}\n filename='number_of_sequences_over_time.csv'\n />\n <NumberSequencesOverTimeInfo />\n </>\n );\n};\n\nconst NumberSequencesOverTimeInfo = () => (\n <Info height='100px'>\n <InfoHeadline1>Number of sequences over time</InfoHeadline1>\n <InfoParagraph>\n <a href='https://github.com/GenSpectrum/dashboard-components/issues/315'>TODO</a>\n </InfoParagraph>\n </Info>\n);\n","import { customElement, property } from 'lit/decorators.js';\n\nimport {\n NumberSequencesOverTime,\n type NumberSequencesOverTimeProps,\n} from '../../preact/numberSequencesOverTime/number-sequences-over-time';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays the number of sequences over time of one or more datasets,\n * selected by LAPIS filters.\n *\n * In the chart views, the user can select the y-axis scale (linear, logistic).\n * The x-axis shows all available time intervals available in the datasets in the selected `granularity`.\n * Thus, the `lapisFilter` implicitly also defines the range that is shown on the x-axis.\n * If you want to restrict the x-axis to a smaller date range,\n * then you need to set appropriate filter values in the `lapisFilter`.\n */\n@customElement('gs-number-sequences-over-time')\nexport class NumberSequencesOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * Required.\n *\n * Either a LAPIS filter or an array of LAPIS filters to fetch the number of sequences for.\n *\n * The `lapisFilter` will be sent as is to LAPIS to select the data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used to label the component views.\n * It should be human-readable.\n *\n */ @property({type: Object})\n lapisFilter:\n {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }\n | {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }[]= { displayName: '', lapisFilter: {} };\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('bar' | 'line' | 'table')[] = ['bar', 'line', 'table'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'day';\n\n /**\n * The number of time steps to use for smoothing the data.\n * `0` means no smoothing.\n * Must be a non-negative integer.\n *\n * For a given time, the shown value is the mean of the neighbouring measured values.\n * The `smoothingWindow` value provides the number of neighbouring values to take into account.\n * The resulting time is computed via `Math.floor(smoothingWindow / 2)`.\n */\n @property({ type: Number })\n smoothingWindow: number = 0;\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <NumberSequencesOverTime\n lapisFilter={this.lapisFilter}\n lapisDateField={this.lapisDateField}\n views={this.views}\n width={this.width}\n height={this.height}\n granularity={this.granularity}\n smoothingWindow={this.smoothingWindow}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.lapisFilter, NumberSequencesOverTimeProps['lapisFilter']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.views, NumberSequencesOverTimeProps['views']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.granularity, NumberSequencesOverTimeProps['granularity']>\n>;\ntype SmoothingWindowMatches = Expect<\n Equals<\n typeof NumberSequencesOverTimeComponent.prototype.smoothingWindow,\n NumberSequencesOverTimeProps['smoothingWindow']\n >\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type MutationOverTimeDataGroupedByMutation } from '../../query/queryMutationsOverTime';\nimport type { DisplayedSegment } from '../components/SegmentSelector';\nimport type { DisplayedMutationType } from '../components/mutation-type-selector';\n\nexport function getFilteredMutationOverTimeData(\n data: MutationOverTimeDataGroupedByMutation,\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n proportionInterval: { min: number; max: number },\n) {\n const filteredData = data.copy();\n filterDisplayedSegments(displayedSegments, filteredData);\n filterMutationTypes(displayedMutationTypes, filteredData);\n filterProportion(filteredData, proportionInterval);\n\n return filteredData;\n}\n\nexport function filterDisplayedSegments(\n displayedSegments: DisplayedSegment[],\n data: MutationOverTimeDataGroupedByMutation,\n) {\n displayedSegments.forEach((segment) => {\n if (!segment.checked) {\n data.getFirstAxisKeys().forEach((mutation) => {\n if (mutation.segment === segment.segment) {\n data.deleteRow(mutation);\n }\n });\n }\n });\n}\n\nexport function filterMutationTypes(\n displayedMutationTypes: DisplayedMutationType[],\n data: MutationOverTimeDataGroupedByMutation,\n) {\n displayedMutationTypes.forEach((mutationType) => {\n if (!mutationType.checked) {\n data.getFirstAxisKeys().forEach((mutation) => {\n if (mutationType.type === mutation.type) {\n data.deleteRow(mutation);\n }\n });\n }\n });\n}\n\nexport function filterProportion(\n data: MutationOverTimeDataGroupedByMutation,\n proportionInterval: {\n min: number;\n max: number;\n },\n) {\n data.getFirstAxisKeys().forEach((mutation) => {\n const row = data.getRow(mutation, 0);\n if (!row.some((value) => value >= proportionInterval.min && value <= proportionInterval.max)) {\n data.deleteRow(mutation);\n }\n });\n}\n","import { Fragment, type FunctionComponent } from 'preact';\n\nimport {\n type MutationOverTimeDataGroupedByMutation,\n type MutationOverTimeMutationValue,\n} from '../../query/queryMutationsOverTime';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { compareTemporal, type Temporal } from '../../utils/temporal';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsOverTimeGridProps {\n data: MutationOverTimeDataGroupedByMutation;\n}\n\nconst MutationsOverTimeGrid: FunctionComponent<MutationsOverTimeGridProps> = ({ data }) => {\n const mutations = data.getFirstAxisKeys();\n const dates = data.getSecondAxisKeys().sort((a, b) => compareTemporal(a, b));\n\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateRows: `repeat(${mutations.length}, 24px)`,\n gridTemplateColumns: `8rem repeat(${dates.length}, minmax(1.5rem, 1fr))`,\n }}\n >\n {mutations.map((mutation, i) => {\n return (\n <Fragment key={`fragment-${mutation.toString()}`}>\n <div\n key={`mutation-${mutation.toString()}`}\n style={{ gridRowStart: i + 1, gridColumnStart: 1 }}\n >\n <MutationCell mutation={mutation} />\n </div>\n {dates.map((date, j) => {\n const value = data.get(mutation, date) ?? 0;\n return (\n <div\n style={{ gridRowStart: i + 1, gridColumnStart: j + 2 }}\n key={`${mutation.toString()}-${date.toString()}`}\n >\n <ProportionCell value={value} date={date} mutation={mutation} />\n </div>\n );\n })}\n </Fragment>\n );\n })}\n </div>\n );\n};\n\nconst ProportionCell: FunctionComponent<{\n value: MutationOverTimeMutationValue;\n date: Temporal;\n mutation: Substitution | Deletion;\n}> = ({ value }) => {\n // TODO(#353): Add tooltip with date, mutation and proportion\n return (\n <>\n <div className={'py-1'}>\n <div\n style={{ backgroundColor: backgroundColor(value), color: textColor(value) }}\n className='text-center hover:font-bold text-xs'\n >\n {formatProportion(value, 0)}\n </div>\n </div>\n </>\n );\n};\n\nconst backgroundColor = (proportion: number) => {\n // TODO(#353): Make minAlpha and maxAlpha configurable\n const minAlpha = 0.0;\n const maxAlpha = 1;\n\n const alpha = minAlpha + (maxAlpha - minAlpha) * proportion;\n return singleGraphColorRGBByName('indigo', alpha);\n};\n\nconst textColor = (proportion: number) => {\n return proportion > 0.5 ? 'white' : 'black';\n};\n\nconst MutationCell: FunctionComponent<{ mutation: Substitution | Deletion }> = ({ mutation }) => {\n return <div className='text-center'>{mutation.toString()}</div>;\n};\n\nexport default MutationsOverTimeGrid;\n","import hash from 'object-hash';\n\nexport class Map2d<Key1 extends object | string, Key2 extends object | string, Value> {\n readonly data: Map<string, Map<string, Value>> = new Map<string, Map<string, Value>>();\n readonly keysFirstAxis = new Map<string, Key1>();\n readonly keysSecondAxis = new Map<string, Key2>();\n\n constructor(\n readonly serializeFirstAxis: (key: Key1) => string = (key) => (typeof key === 'string' ? key : hash(key)),\n readonly serializeSecondAxis: (key: Key2) => string = (key) => (typeof key === 'string' ? key : hash(key)),\n ) {}\n\n get(keyFirstAxis: Key1, keySecondAxis: Key2) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n return this.data.get(serializedKeyFirstAxis)?.get(serializedKeySecondAxis);\n }\n\n getRow(key: Key1, fillEmptyWith: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n const row = this.data.get(serializedKeyFirstAxis);\n if (row === undefined) {\n return [];\n }\n return Array.from(this.keysSecondAxis.keys()).map((key) => row.get(key) ?? fillEmptyWith);\n }\n\n set(keyFirstAxis: Key1, keySecondAxis: Key2, value: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n\n if (!this.data.has(serializedKeyFirstAxis)) {\n this.data.set(serializedKeyFirstAxis, new Map<string, Value>());\n }\n\n this.data.get(serializedKeyFirstAxis)!.set(serializedKeySecondAxis, value);\n\n this.keysFirstAxis.set(serializedKeyFirstAxis, keyFirstAxis);\n this.keysSecondAxis.set(serializedKeySecondAxis, keySecondAxis);\n }\n\n deleteRow(key: Key1) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n this.data.delete(serializedKeyFirstAxis);\n this.keysFirstAxis.delete(serializedKeyFirstAxis);\n }\n\n getFirstAxisKeys() {\n return Array.from(this.keysFirstAxis.values());\n }\n\n getSecondAxisKeys() {\n return Array.from(this.keysSecondAxis.values());\n }\n\n getAsArray(fillEmptyWith: Value) {\n return this.getFirstAxisKeys().map((firstAxisKey) => {\n return this.getSecondAxisKeys().map((secondAxisKey) => {\n return this.get(firstAxisKey, secondAxisKey) ?? fillEmptyWith;\n });\n });\n }\n\n copy() {\n const copy = new Map2d<Key1, Key2, Value>(this.serializeFirstAxis, this.serializeSecondAxis);\n this.data.forEach((value, key) => {\n const keyFirstAxis = this.keysFirstAxis.get(key);\n value.forEach((value, key) => {\n const keySecondAxis = this.keysSecondAxis.get(key);\n copy.set(keyFirstAxis!, keySecondAxis!, value);\n });\n });\n return copy;\n }\n}\n","import { mapDateToGranularityRange } from './queryAggregatedDataOverTime';\nimport { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { FetchSubstitutionsOrDeletionsOperator } from '../operator/FetchSubstitutionsOrDeletionsOperator';\nimport { GroupByAndSumOperator } from '../operator/GroupByAndSumOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport {\n type LapisFilter,\n type SequenceType,\n type SubstitutionOrDeletionEntry,\n type TemporalGranularity,\n} from '../types';\nimport { Map2d } from '../utils/Map2d';\nimport { type Deletion, type Substitution } from '../utils/mutations';\nimport {\n dateRangeCompare,\n generateAllInRange,\n getMinMaxTemporal,\n parseDateStringToTemporal,\n type Temporal,\n} from '../utils/temporal';\n\nexport type MutationOverTimeData = {\n date: Temporal;\n mutations: SubstitutionOrDeletionEntry[];\n};\n\nexport type MutationOverTimeMutationValue = number;\nexport type MutationOverTimeDataGroupedByMutation = Map2d<\n Substitution | Deletion,\n Temporal,\n MutationOverTimeMutationValue\n>;\n\nexport async function queryMutationsOverTimeData(\n lapisFilter: LapisFilter,\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n lapisDateField: string,\n granularity: TemporalGranularity,\n signal?: AbortSignal,\n) {\n const allDates = await getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);\n\n const subQueries = allDates.map(async (date) => {\n const dateFrom = date.firstDay.toString();\n const dateTo = date.lastDay.toString();\n\n const filter = {\n ...lapisFilter,\n [`${lapisDateField}From`]: dateFrom,\n [`${lapisDateField}To`]: dateTo,\n };\n\n const data = await fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType).evaluate(lapis, signal);\n return {\n date,\n mutations: data.content,\n };\n });\n\n const data = await Promise.all(subQueries);\n\n return groupByMutation(data);\n}\n\nasync function getDatesInDataset(\n lapisFilter: LapisFilter,\n lapis: string,\n granularity: TemporalGranularity,\n lapisDateField: string,\n signal: AbortSignal | undefined,\n) {\n const { content: availableDates } = await queryAvailableDates(\n lapisFilter,\n lapis,\n granularity,\n lapisDateField,\n signal,\n );\n\n const { dateFrom, dateTo } = getDateRangeFromFilter(lapisFilter, lapisDateField, granularity);\n const { min, max } = getMinMaxTemporal(availableDates);\n\n return generateAllInRange(dateFrom ?? min, dateTo ?? max);\n}\n\nfunction getDateRangeFromFilter(lapisFilter: LapisFilter, lapisDateField: string, granularity: TemporalGranularity) {\n const valueFromFilter = lapisFilter[lapisDateField] as string | null;\n\n if (valueFromFilter) {\n return {\n dateFrom: parseDateStringToTemporal(valueFromFilter, granularity),\n dateTo: parseDateStringToTemporal(valueFromFilter, granularity),\n };\n }\n\n const minFromFilter = lapisFilter[`${lapisDateField}From`] as string | null;\n const maxFromFilter = lapisFilter[`${lapisDateField}To`] as string | null;\n\n return {\n dateFrom: minFromFilter ? parseDateStringToTemporal(minFromFilter, granularity) : null,\n dateTo: maxFromFilter ? parseDateStringToTemporal(maxFromFilter, granularity) : null,\n };\n}\n\nfunction queryAvailableDates(\n lapisFilter: LapisFilter,\n lapis: string,\n granularity: TemporalGranularity,\n lapisDateField: string,\n signal?: AbortSignal,\n) {\n return fetchAndPrepareDates(lapisFilter, granularity, lapisDateField).evaluate(lapis, signal);\n}\n\nfunction fetchAndPrepareDates<LapisDateField extends string>(\n filter: LapisFilter,\n granularity: TemporalGranularity,\n lapisDateField: LapisDateField,\n) {\n const fetchData = new FetchAggregatedOperator<{ [key in LapisDateField]: string | null }>(filter, [lapisDateField]);\n const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, 'date');\n const mapData = new MapOperator(dataWithFixedDateKey, (data) => mapDateToGranularityRange(data, granularity));\n const groupByData = new GroupByAndSumOperator(mapData, 'dateRange', 'count');\n const sortData = new SortOperator(groupByData, dateRangeCompare);\n return new MapOperator(sortData, (data) => data.dateRange);\n}\n\nfunction fetchAndPrepareSubstitutionsOrDeletions(filter: LapisFilter, sequenceType: SequenceType) {\n return new FetchSubstitutionsOrDeletionsOperator(filter, sequenceType, 0.001);\n}\n\nexport function groupByMutation(data: MutationOverTimeData[]) {\n const dataArray = new Map2d<Substitution | Deletion, Temporal, number>(\n (mutation) => mutation.code,\n (date) => date.toString(),\n );\n\n data.forEach((mutationData) => {\n mutationData.mutations.forEach((mutationEntry) => {\n dataArray.set(mutationEntry.mutation, mutationData.date, mutationEntry.proportion);\n });\n });\n\n addZeroValuesForDatesWithNoMutationData(dataArray, data);\n\n return dataArray;\n}\n\nfunction addZeroValuesForDatesWithNoMutationData(\n dataArray: Map2d<Substitution | Deletion, Temporal, number>,\n data: MutationOverTimeData[],\n) {\n if (dataArray.getFirstAxisKeys().length !== 0) {\n const someMutation = dataArray.getFirstAxisKeys()[0];\n data.forEach((mutationData) => {\n if (mutationData.mutations.length === 0) {\n dataArray.set(someMutation, mutationData.date, 0);\n }\n });\n }\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useMemo, useState } from 'preact/hooks';\n\nimport { getFilteredMutationOverTimeData } from './getFilteredMutationsOverTimeData';\nimport MutationsOverTimeGrid from './mutations-over-time-grid';\nimport {\n type MutationOverTimeDataGroupedByMutation,\n queryMutationsOverTimeData,\n} from '../../query/queryMutationsOverTime';\nimport { type LapisFilter, type SequenceType, type TemporalGranularity } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/SegmentSelector';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'grid';\n\nexport interface MutationsOverTimeInnerProps {\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n views: View[];\n granularity: TemporalGranularity;\n lapisDateField: string;\n}\n\nexport interface MutationsOverTimeProps extends MutationsOverTimeInnerProps {\n width: string;\n height: string;\n}\n\nexport const MutationsOverTime: FunctionComponent<MutationsOverTimeProps> = ({ width, height, ...innerProps }) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <MutationsOverTimeInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationsOverTimeInner: FunctionComponent<MutationsOverTimeInnerProps> = ({\n lapisFilter,\n sequenceType,\n views,\n granularity,\n lapisDateField,\n}) => {\n const lapis = useContext(LapisUrlContext);\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationsOverTimeData(lapisFilter, sequenceType, lapis, lapisDateField, granularity);\n }, [lapisFilter, sequenceType, lapis, granularity, lapisDateField]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MutationsOverTimeTabs mutationOverTimeData={data} sequenceType={sequenceType} views={views} />;\n};\n\ntype MutationOverTimeTabsProps = {\n mutationOverTimeData: MutationOverTimeDataGroupedByMutation;\n sequenceType: SequenceType;\n views: View[];\n};\n\nconst MutationsOverTimeTabs: FunctionComponent<MutationOverTimeTabsProps> = ({\n mutationOverTimeData,\n sequenceType,\n views,\n}) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 0.9 });\n\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(sequenceType);\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n\n const filteredData = useMemo(\n () =>\n getFilteredMutationOverTimeData(\n mutationOverTimeData,\n displayedSegments,\n displayedMutationTypes,\n proportionInterval,\n ),\n [mutationOverTimeData, displayedSegments, displayedMutationTypes, proportionInterval],\n );\n\n const getTab = (view: View) => {\n switch (view) {\n case 'grid':\n return {\n title: 'Grid',\n content: <MutationsOverTimeGrid data={filteredData} />,\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n const toolbar = () => (\n <Toolbar\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n proportionInterval,\n setProportionInterval,\n}) => {\n return (\n <>\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\n />\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n {/* TODO(#362): Add download button */}\n </>\n <Info height={'100px'}>Info for mutations over time</Info>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { MutationsOverTime, type MutationsOverTimeProps } from '../../preact/mutationsOverTime/mutations-over-time';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays mutations (substitutions and deletions) over time for a dataset selected by a LAPIS filter.\n * The shown date range is determined by the date field in the LAPIS filter.\n * If the date field is not set, the date range is determined by all available dates in the dataset.\n *\n * ## Views\n *\n * ### Grid View\n *\n * The grid view shows the proportion for each mutation over date ranges.\n *\n */\n@customElement('gs-mutations-over-time')\nexport class MutationsOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * LAPIS filter to select the displayed data.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: 'grid'[] = ['grid'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'week';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used for the columns of the grid.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n override render() {\n return (\n <MutationsOverTime\n lapisFilter={this.lapisFilter}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n granularity={this.granularity}\n lapisDateField={this.lapisDateField}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutations-over-time-component': MutationsOverTimeComponent;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.lapisFilter, MutationsOverTimeProps['lapisFilter']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.sequenceType, MutationsOverTimeProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<Equals<typeof MutationsOverTimeComponent.prototype.views, MutationsOverTimeProps['views']>>;\ntype GranularityMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.granularity, MutationsOverTimeProps['granularity']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","export const PRESET_VALUE_CUSTOM = 'custom';\nexport const PRESET_VALUE_ALL_TIMES = 'allTimes';\nexport const PRESET_VALUE_LAST_2_WEEKS = 'last2Weeks';\nexport const PRESET_VALUE_LAST_MONTH = 'lastMonth';\nexport const PRESET_VALUE_LAST_2_MONTHS = 'last2Months';\nexport const PRESET_VALUE_LAST_3_MONTHS = 'last3Months';\nexport const PRESET_VALUE_LAST_6_MONTHS = 'last6Months';\n\nexport const presets = {\n [PRESET_VALUE_CUSTOM]: { label: 'Custom' },\n [PRESET_VALUE_ALL_TIMES]: { label: 'All times' },\n [PRESET_VALUE_LAST_2_WEEKS]: { label: 'Last 2 weeks' },\n [PRESET_VALUE_LAST_MONTH]: { label: 'Last month' },\n [PRESET_VALUE_LAST_2_MONTHS]: { label: 'Last 2 months' },\n [PRESET_VALUE_LAST_3_MONTHS]: { label: 'Last 3 months' },\n [PRESET_VALUE_LAST_6_MONTHS]: { label: 'Last 6 months' },\n};\n\nexport type PresetOptionValues = keyof typeof presets;\n\nexport type CustomSelectOption<CustomLabel extends string> = { label: CustomLabel; dateFrom: string; dateTo: string };\n\nexport const getSelectableOptions = <Label extends string>(customSelectOptions: CustomSelectOption<Label>[]) => {\n const presetOptions = Object.entries(presets).map(([key, value]) => {\n return { label: value.label, value: key };\n });\n\n const customOptions = customSelectOptions.map((customSelectOption) => {\n return { label: customSelectOption.label, value: customSelectOption.label };\n });\n\n return [...presetOptions, ...customOptions];\n};\n\nexport const getDatesForSelectorValue = <Label extends string>(\n selectorValue: string,\n customSelectOptions: CustomSelectOption<Label>[],\n earliestDate: string,\n) => {\n const today = new Date();\n\n const customSelectOption = customSelectOptions.find((option) => option.label === selectorValue);\n if (customSelectOption) {\n return { dateFrom: new Date(customSelectOption.dateFrom), dateTo: new Date(customSelectOption.dateTo) };\n }\n\n switch (selectorValue) {\n case PRESET_VALUE_LAST_2_WEEKS: {\n const twoWeeksAgo = new Date(today);\n twoWeeksAgo.setDate(today.getDate() - 14);\n return { dateFrom: twoWeeksAgo, dateTo: today };\n }\n case PRESET_VALUE_LAST_MONTH: {\n const lastMonth = new Date(today);\n lastMonth.setMonth(today.getMonth() - 1);\n return { dateFrom: lastMonth, dateTo: today };\n }\n case PRESET_VALUE_LAST_2_MONTHS: {\n const twoMonthsAgo = new Date(today);\n twoMonthsAgo.setMonth(today.getMonth() - 2);\n return { dateFrom: twoMonthsAgo, dateTo: today };\n }\n case PRESET_VALUE_LAST_3_MONTHS: {\n const threeMonthsAgo = new Date(today);\n threeMonthsAgo.setMonth(today.getMonth() - 3);\n return { dateFrom: threeMonthsAgo, dateTo: today };\n }\n case PRESET_VALUE_LAST_6_MONTHS: {\n const sixMonthsAgo = new Date(today);\n sixMonthsAgo.setMonth(today.getMonth() - 6);\n return { dateFrom: sixMonthsAgo, dateTo: today };\n }\n case PRESET_VALUE_ALL_TIMES: {\n return { dateFrom: new Date(earliestDate), dateTo: today };\n }\n default:\n return { dateFrom: today, dateTo: today };\n }\n};\n","import {\n type CustomSelectOption,\n getDatesForSelectorValue,\n getSelectableOptions,\n PRESET_VALUE_CUSTOM,\n PRESET_VALUE_LAST_6_MONTHS,\n type PresetOptionValues,\n} from './selectableOptions';\nimport { UserFacingError } from '../components/error-display';\n\nexport function computeInitialValues<CustomLabel extends string>(\n initialValue: PresetOptionValues | CustomLabel | undefined,\n initialDateFrom: string | undefined,\n initialDateTo: string | undefined,\n earliestDate: string,\n customSelectOptions: CustomSelectOption<CustomLabel>[],\n): {\n initialSelectedDateRange: CustomLabel | PresetOptionValues;\n initialSelectedDateFrom: Date;\n initialSelectedDateTo: Date;\n} {\n if (isUndefinedOrEmpty(initialDateFrom) && isUndefinedOrEmpty(initialDateTo)) {\n const selectableOptions = getSelectableOptions(customSelectOptions);\n const initialSelectedDateRange =\n initialValue !== undefined && selectableOptions.some((option) => option.value === initialValue)\n ? initialValue\n : PRESET_VALUE_LAST_6_MONTHS;\n\n const { dateFrom, dateTo } = getDatesForSelectorValue(\n initialSelectedDateRange,\n customSelectOptions,\n earliestDate,\n );\n\n return {\n initialSelectedDateRange,\n initialSelectedDateFrom: dateFrom,\n initialSelectedDateTo: dateTo,\n };\n }\n\n const initialSelectedDateFrom = isUndefinedOrEmpty(initialDateFrom)\n ? new Date(earliestDate)\n : new Date(initialDateFrom);\n let initialSelectedDateTo = isUndefinedOrEmpty(initialDateTo) ? new Date() : new Date(initialDateTo);\n\n if (isNaN(initialSelectedDateFrom.getTime())) {\n throw new UserFacingError(\n 'Invalid initialDateFrom',\n `Invalid initialDateFrom \"${initialDateFrom}\", It must be of the format YYYY-MM-DD`,\n );\n }\n if (isNaN(initialSelectedDateTo.getTime())) {\n throw new UserFacingError(\n 'Invalid initialDateTo',\n `Invalid initialDateTo \"${initialDateTo}\", It must be of the format YYYY-MM-DD`,\n );\n }\n\n if (initialSelectedDateFrom > initialSelectedDateTo) {\n initialSelectedDateTo = initialSelectedDateFrom;\n }\n\n return {\n initialSelectedDateRange: PRESET_VALUE_CUSTOM,\n initialSelectedDateFrom,\n initialSelectedDateTo,\n };\n}\n\nfunction isUndefinedOrEmpty(value: string | undefined): value is undefined | '' {\n return value === undefined || value === '';\n}\n","export const toYYYYMMDD = (date?: Date) => {\n if (!date) {\n return undefined;\n }\n\n const options: Intl.DateTimeFormatOptions = { year: 'numeric', month: '2-digit', day: '2-digit' };\n return date.toLocaleDateString('en-CA', options);\n};\n","import flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.min.css';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { computeInitialValues } from './computeInitialValues';\nimport { toYYYYMMDD } from './dateConversion';\nimport {\n type CustomSelectOption,\n getDatesForSelectorValue,\n getSelectableOptions,\n type PresetOptionValues,\n} from './selectableOptions';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Select } from '../components/select';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\n\nexport interface DateRangeSelectorProps<CustomLabel extends string> extends DateRangeSelectorPropsInner<CustomLabel> {\n width: string;\n}\n\nexport interface DateRangeSelectorPropsInner<CustomLabel extends string> {\n customSelectOptions: CustomSelectOption<CustomLabel>[];\n earliestDate?: string;\n initialValue?: PresetOptionValues | CustomLabel;\n initialDateFrom?: string;\n initialDateTo?: string;\n dateColumn: string;\n}\n\nexport const DateRangeSelector = <CustomLabel extends string>({\n width,\n ...innerProps\n}: DateRangeSelectorProps<CustomLabel>) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size}>\n <div style={{ width }}>\n <DateRangeSelectorInner {...innerProps} />\n </div>\n </ErrorBoundary>\n );\n};\n\nexport const DateRangeSelectorInner = <CustomLabel extends string>({\n customSelectOptions,\n earliestDate = '1900-01-01',\n initialValue,\n dateColumn,\n initialDateFrom,\n initialDateTo,\n}: DateRangeSelectorPropsInner<CustomLabel>) => {\n const initialValues = computeInitialValues(\n initialValue,\n initialDateFrom,\n initialDateTo,\n earliestDate,\n customSelectOptions,\n );\n\n const fromDatePickerRef = useRef<HTMLInputElement>(null);\n const toDatePickerRef = useRef<HTMLInputElement>(null);\n const divRef = useRef<HTMLDivElement>(null);\n const [dateFromPicker, setDateFromPicker] = useState<flatpickr.Instance | null>(null);\n const [dateToPicker, setDateToPicker] = useState<flatpickr.Instance | null>(null);\n\n const [selectedDateRange, setSelectedDateRange] = useState<CustomLabel | PresetOptionValues>(\n initialValues.initialSelectedDateRange,\n );\n\n const [selectedDates, setSelectedDates] = useState<{ dateFrom: Date; dateTo: Date }>({\n dateFrom: initialValues.initialSelectedDateFrom,\n dateTo: initialValues.initialSelectedDateTo,\n });\n\n useEffect(() => {\n const commonConfig = {\n allowInput: true,\n dateFormat: 'Y-m-d',\n };\n\n if (fromDatePickerRef.current) {\n setDateFromPicker(\n flatpickr(fromDatePickerRef.current, {\n ...commonConfig,\n defaultDate: selectedDates.dateFrom,\n }),\n );\n }\n\n if (toDatePickerRef.current) {\n setDateToPicker(\n flatpickr(toDatePickerRef.current, {\n ...commonConfig,\n defaultDate: selectedDates.dateTo,\n }),\n );\n }\n\n return () => {\n dateFromPicker?.destroy();\n dateToPicker?.destroy();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromDatePickerRef, toDatePickerRef]);\n\n const onSelectChange = (value: CustomLabel | PresetOptionValues) => {\n setSelectedDateRange(value);\n\n const dateRange = getDatesForSelectorValue(value, customSelectOptions, earliestDate);\n\n dateToPicker?.set('minDate', dateRange.dateFrom);\n dateFromPicker?.set('maxDate', dateRange.dateTo);\n\n dateFromPicker?.setDate(dateRange.dateFrom);\n dateToPicker?.setDate(dateRange.dateTo);\n\n setSelectedDates({\n dateFrom: dateRange.dateFrom,\n dateTo: dateRange.dateTo,\n });\n\n submit();\n };\n\n const onChangeDateFrom = () => {\n if (selectedDates.dateFrom.toDateString() === dateFromPicker?.selectedDates[0].toDateString()) {\n return;\n }\n\n selectedDates.dateFrom = dateFromPicker?.selectedDates[0] || new Date();\n dateToPicker?.set('minDate', dateFromPicker?.selectedDates[0]);\n setSelectedDateRange('custom');\n\n submit();\n };\n\n const onChangeDateTo = () => {\n if (selectedDates.dateTo.toDateString() === dateToPicker?.selectedDates[0].toDateString()) {\n return;\n }\n\n selectedDates.dateTo = dateToPicker?.selectedDates[0] || new Date();\n dateFromPicker?.set('maxDate', dateToPicker?.selectedDates[0]);\n setSelectedDateRange('custom');\n\n submit();\n };\n\n const submit = () => {\n const dateFrom = toYYYYMMDD(dateFromPicker?.selectedDates[0]);\n const dateTo = toYYYYMMDD(dateToPicker?.selectedDates[0]);\n\n const detail = {\n ...(dateFrom !== undefined && { [`${dateColumn}From`]: dateFrom }),\n ...(dateTo !== undefined && { [`${dateColumn}To`]: dateTo }),\n };\n\n divRef.current?.dispatchEvent(\n new CustomEvent('gs-date-range-changed', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n return (\n <div class='flex flex-wrap' ref={divRef}>\n <Select\n items={getSelectableOptions(customSelectOptions)}\n selected={selectedDateRange}\n selectStyle='select-bordered rounded-none flex-grow min-w-[7.5rem]'\n onChange={(event: Event) => {\n event.preventDefault();\n const select = event.target as HTMLSelectElement;\n const value = select.value as ScaleType;\n onSelectChange(value as CustomLabel | PresetOptionValues);\n }}\n />\n <div className={'flex flex-wrap flex-grow'}>\n <input\n class='input input-bordered rounded-none flex-grow w-[7.5rem]'\n type='text'\n placeholder='Date from'\n ref={fromDatePickerRef}\n onChange={onChangeDateFrom}\n onBlur={onChangeDateFrom}\n />\n <input\n class='input input-bordered rounded-none flex-grow w-[7.5rem]'\n type='text'\n placeholder='Date to'\n ref={toDatePickerRef}\n onChange={onChangeDateTo}\n onBlur={onChangeDateTo}\n />\n </div>\n </div>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { DateRangeSelector } from '../../preact/dateRangeSelector/date-range-selector';\nimport { type CustomSelectOption, type PresetOptionValues } from '../../preact/dateRangeSelector/selectableOptions';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n * This component is a group of input fields designed to specify date range filters\n * for a given date column of this Lapis instance. It consists of 3 fields:\n *\n * - a select field to choose a predefined date range,\n * - an input field with an attached date picker for the start date,\n * - an input field with an attached date picker for the end date.\n *\n * Setting a value in the select field will overwrite the previous values of the start and end date.\n * Setting a value in either of the date pickers will set the select field to \"custom\",\n * which represents an arbitrary date range.\n *\n * @fires {CustomEvent<{ `${dateColumn}From`: string; `${dateColumn}To`: string; }>} gs-date-range-changed\n * Fired when:\n * - The select field is changed,\n * - A date is selected in either of the date pickers,\n * - A date was typed into either of the date input fields, and the input field loses focus (\"on blur\").\n * Contains the dates in the format `YYYY-MM-DD`.\n *\n * Example: For `dateColumn = yourDate`, an event with `detail` containing\n * ```\n * {\n * yourDataFrom: \"2021-01-01\",\n * yourDataTo: \"2021-12-31\"\n * }\n * ```\n * will be fired.\n */\n@customElement('gs-date-range-selector')\nexport class DateRangeSelectorComponent extends PreactLitAdapter {\n /**\n * An array of custom options that the select field should provide,\n * in addition to the predefined options.\n * The `label` will be shown to the user, and it will be available as `initialValue`.\n * The dates must be in the format `YYYY-MM-DD`.\n */\n @property({ type: Array })\n customSelectOptions: { label: string; dateFrom: string; dateTo: string }[] = [];\n\n /**\n * The `dateFrom` value to use in the `allTimes` preset in the format `YYYY-MM-DD`.\n */\n @property({ type: String })\n earliestDate: string = '1900-01-01';\n\n // prettier-ignore\n // The multiline union type must not start with `| 'custom'` - Storybook will list \"\" as the first type which is wrong\n /**\n * The initial value to use for this date range selector.\n * Must be a valid label from the preset labels or a `label` given in the `customSelectOptions`.\n *\n * If the value is invalid, the component will default to `'last6Months'`.\n *\n * It will be overwritten if `initialDateFrom` or `initialDateTo` is set.\n */\n @property()\n initialValue:\n 'custom'\n | 'allTimes'\n | 'last2Weeks'\n | 'lastMonth'\n | 'last2Months'\n | 'last3Months'\n | 'last6Months'\n | string = 'last6Months';\n\n /**\n * A date string in the format `YYYY-MM-DD`.\n * If set, the date range selector will be initialized with the given date (overwriting `initialValue` to `custom`).\n * If `initialDateTo` is set, but this is unset, it will default to `earliestDate`.\n */\n @property()\n initialDateFrom: string = '';\n\n /**\n * A date string in the format `YYYY-MM-DD`.\n * If set, the date range selector will be initialized with the given date (overwriting `initialValue` to `custom`).\n * If `initialDateFrom` is set, but this is unset, it will default to the current date.\n */\n @property()\n initialDateTo: string = '';\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The name of the column in LAPIS that contains the date information.\n */\n @property({ type: String })\n dateColumn: string = 'date';\n\n override render() {\n return (\n <DateRangeSelector\n customSelectOptions={this.customSelectOptions}\n earliestDate={this.earliestDate}\n initialValue={this.initialValue}\n initialDateFrom={this.initialDateFrom}\n initialDateTo={this.initialDateTo}\n dateColumn={this.dateColumn}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-date-range-selector': DateRangeSelectorComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-date-range-changed': CustomEvent<Record<string, string>>;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype CustomSelectOptionsMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.customSelectOptions, CustomSelectOption<string>[]>\n>;\ntype InitialValueMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialValue, PresetOptionValues | string>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { LapisError } from '../../lapisApi/lapisApi';\nimport { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\nimport { UserFacingError } from '../components/error-display';\n\nexport async function fetchAutocompletionList(fields: string[], lapis: string, signal?: AbortSignal) {\n const toAncestorInHierarchyOverwriteValues = Array(fields.length - 1)\n .fill(0)\n .map((_, i) => i + 1)\n .map((i) => fields.slice(i).reduce((acc, field) => ({ ...acc, [field]: null }), {}));\n\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string | null>>({}, fields);\n\n let data;\n try {\n data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n } catch (error) {\n if (error instanceof LapisError) {\n throw new UserFacingError(\n `Failed to fetch autocomplete list from LAPIS: ${error.problemDetail.status} ${error.problemDetail.title ?? ''}`,\n error.problemDetail.detail ?? error.message,\n );\n }\n throw error;\n }\n\n const locationValues = data\n .map((entry) => fields.reduce((acc, field) => ({ ...acc, [field]: entry[field] }), {}))\n .reduce<Set<string>>((setOfAllHierarchies, entry) => {\n setOfAllHierarchies.add(JSON.stringify(entry));\n toAncestorInHierarchyOverwriteValues.forEach((overwriteValues) => {\n setOfAllHierarchies.add(JSON.stringify({ ...entry, ...overwriteValues }));\n });\n return setOfAllHierarchies;\n }, new Set());\n\n return [...locationValues].map((json) => JSON.parse(json)).sort(compareLocationEntries(fields));\n}\n\nfunction compareLocationEntries(fields: string[]) {\n return (a: Record<string, string | null>, b: Record<string, string | null>) => {\n for (const field of fields) {\n const valueA = a[field];\n const valueB = b[field];\n if (valueA === valueB) {\n continue;\n }\n if (valueA === null) {\n return -1;\n }\n if (valueB === null) {\n return 1;\n }\n return valueA < valueB ? -1 : 1;\n }\n return 0;\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nimport { fetchAutocompletionList } from './fetchAutocompletionList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nexport interface LocationFilterInnerProps {\n initialValue?: string;\n placeholderText?: string;\n fields: string[];\n}\n\nexport interface LocationFilterProps extends LocationFilterInnerProps {\n width: string;\n}\n\nexport const LocationFilter: FunctionComponent<LocationFilterProps> = ({ width, ...innerProps }) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <LocationFilterInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const LocationFilterInner = ({ initialValue, fields, placeholderText }: LocationFilterInnerProps) => {\n const lapis = useContext(LapisUrlContext);\n\n const [value, setValue] = useState(initialValue ?? '');\n const [unknownLocation, setUnknownLocation] = useState(false);\n\n const divRef = useRef<HTMLDivElement>(null);\n\n const { data, error, isLoading } = useQuery(() => fetchAutocompletionList(fields, lapis), [fields, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n if (error) {\n return <ErrorDisplay error={error} />;\n }\n\n const onInput = (event: JSXInternal.TargetedInputEvent<HTMLInputElement>) => {\n const inputValue = event.currentTarget.value;\n setValue(inputValue);\n if (inputValue.trim() === value.trim() && inputValue !== '') {\n return;\n }\n const eventDetail = parseLocation(inputValue, fields);\n if (hasAllUndefined(eventDetail) || hasMatchingEntry(data, eventDetail)) {\n divRef.current?.dispatchEvent(\n new CustomEvent('gs-location-changed', {\n detail: eventDetail,\n bubbles: true,\n composed: true,\n }),\n );\n setUnknownLocation(false);\n } else {\n setUnknownLocation(true);\n }\n };\n\n return (\n <div class='flex w-full' ref={divRef}>\n <input\n type='text'\n class={`input input-bordered grow ${unknownLocation ? 'border-2 border-error' : ''}`}\n value={value}\n onInput={onInput}\n list='countries'\n placeholder={placeholderText}\n />\n <datalist id='countries'>\n {data?.map((v) => {\n const value = fields\n .map((field) => v[field])\n .filter((value) => value !== null)\n .join(' / ');\n return <option key={value} value={value} />;\n })}\n </datalist>\n </div>\n );\n};\n\nconst parseLocation = (location: string, fields: string[]) => {\n if (location === '') {\n return fields.reduce((acc, field) => ({ ...acc, [field]: undefined }), {});\n }\n const fieldValues = location.split('/').map((part) => part.trim());\n\n return fields.reduce((acc, field, i) => ({ ...acc, [field]: fieldValues[i] }), {});\n};\n\nconst hasAllUndefined = (obj: Record<string, string | undefined>) =>\n Object.values(obj).every((value) => value === undefined);\n\nconst hasMatchingEntry = (data: Record<string, string>[] | null, eventDetail: Record<string, string>) => {\n if (data === null) {\n return false;\n }\n\n const matchingEntries = Object.entries(eventDetail)\n .filter(([, value]) => value !== undefined)\n .reduce((filteredData, [key, value]) => filteredData.filter((it) => it[key] === value), data);\n\n return matchingEntries.length > 0;\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { LocationFilter } from '../../preact/locationFilter/location-filter';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n *\n * This component provides an input field to specify filters for locations.\n *\n * It expects a list of fields that form a strict hierarchical order, such as continent, country, and city.\n * The component retrieves a list of all possible values for these fields from the Lapis instance.\n * This list is then utilized to display autocomplete suggestions and to validate the input.\n *\n * Given `fields` are `['field1', 'field2', ..., 'fieldN']`,\n * then valid values for the location filter must be in the form `valueForField1 / valueForField2 / ... / valueForFieldK`,\n * where `1 <= K <= N`.\n * Values for the fields `i > K` are considered `undefined`.\n *\n * @fires {CustomEvent<Record<string, string>>} gs-location-changed\n * Fired when a value from the datalist is selected or when a valid value is typed into the field.\n * The `details` of this event contain an object with all `fields` as keys\n * and the corresponding values as values, even if they are `undefined`.\n * Example:\n * ```\n * {\n * continent: \"Asia\",\n * country: \"China\",\n * city: \"Beijing\",\n * district: undefined,\n * }\n * ```\n */\n@customElement('gs-location-filter')\nexport class LocationFilterComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this location filter.\n * Must be of the form `valueForField1 / valueForField2 / ... / valueForFieldN`.\n */\n @property()\n initialValue = '';\n\n /**\n * Required.\n *\n * The fields to display in the location filter, in hierarchical order.\n * The top-level field should be the first entry in the array.\n * This component assumes that the values for each field form a strict hierarchy\n * (e.g., `fields = ['continent', 'country', 'city']`).\n */\n @property({ type: Array })\n fields: string[] = [];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The placeholder text to display in the input field, if it is empty.\n */\n @property()\n placeholderText: string = '';\n\n override render() {\n return (\n <LocationFilter\n initialValue={this.initialValue}\n fields={this.fields}\n width={this.width}\n placeholderText={this.placeholderText}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-location-filter': LocationFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-location-changed': CustomEvent<Record<string, string>>;\n }\n}\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchAutocompleteList(lapis: string, field: string, signal?: AbortSignal) {\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string>>({}, [field]);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n return data.map((item) => item[field]);\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef } from 'preact/hooks';\n\nimport { fetchAutocompleteList } from './fetchAutocompleteList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nexport interface TextInputInnerProps {\n lapisField: string;\n placeholderText?: string;\n initialValue?: string;\n}\n\nexport interface TextInputProps extends TextInputInnerProps {\n width: string;\n}\n\nexport const TextInput: FunctionComponent<TextInputProps> = ({ width, ...innerProps }) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <TextInputInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst TextInputInner: FunctionComponent<TextInputInnerProps> = ({ lapisField, placeholderText, initialValue }) => {\n const lapis = useContext(LapisUrlContext);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data, error, isLoading } = useQuery(() => fetchAutocompleteList(lapis, lapisField), [lapisField, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n const onInput = () => {\n const value = inputRef.current?.value === '' ? undefined : inputRef.current?.value;\n\n if (isValidValue(value)) {\n inputRef.current?.dispatchEvent(\n new CustomEvent('gs-text-input-changed', {\n detail: { [lapisField]: value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n const isValidValue = (value: string | undefined) => {\n if (value === undefined) {\n return true;\n }\n return data.includes(value);\n };\n\n return (\n <>\n <input\n type='text'\n class='input input-bordered w-full'\n placeholder={placeholderText !== undefined ? placeholderText : lapisField}\n onInput={onInput}\n ref={inputRef}\n list={lapisField}\n value={initialValue}\n />\n <datalist id={lapisField}>\n {data.map((item) => (\n <option value={item} key={item} />\n ))}\n </datalist>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { TextInput } from '../../preact/textInput/text-input';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n *\n * ## Context\n *\n * This component provides a text input field to specify filters for arbitrary fields of this LAPIS instance.\n *\n * @fires {CustomEvent<Record<string, string>>} gs-text-input-changed\n * Fired when the input field is changed.\n * The `details` of this event contain an object with the `lapisField` as key and the input value as value.\n * Example:\n * ```\n * {\n * \"host\": \"Homo sapiens\"\n * }\n * ```\n */\n@customElement('gs-text-input')\nexport class TextInputComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this text input.\n */\n @property()\n initialValue: string = '';\n\n /**\n * Required.\n *\n * The LAPIS field name to use for this text input.\n * The field must exist on this LAPIS instance.\n */\n @property()\n lapisField = '';\n\n /**\n * The placeholder text to display in the input field.\n */\n @property()\n placeholderText: string = '';\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <TextInput\n lapisField={this.lapisField}\n placeholderText={this.placeholderText}\n initialValue={this.initialValue}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-text-input': TextInputComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-text-input-changed': CustomEvent<Record<string, string>>;\n }\n}\n","import { type ComponentChildren, type FunctionalComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\n\nimport { type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\n\n/**\n * Sometimes the reference genome is not immediately available.\n * This component will display a loading spinner until the reference genome is available.\n * Child components can assume that the reference genome is available on the first render,\n * which e.g. matters for initial values of `useState`.\n */\nexport const ReferenceGenomesAwaiter: FunctionalComponent<{ children: ComponentChildren }> = ({ children }) => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n if (isNotInitialized(referenceGenome)) {\n return <div className='laoding loading-spinner loading-md'>Loading...</div>;\n }\n\n return <>{children}</>;\n};\n\nfunction isNotInitialized(referenceGenome: ReferenceGenome) {\n return referenceGenome.nucleotideSequences.length === 0 && referenceGenome.genes.length === 0;\n}\n","import { useContext } from 'preact/hooks';\n\nimport { isSingleSegmented } from '../../lapisApi/ReferenceGenome';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\nimport Info, { InfoHeadline1, InfoHeadline2, InfoParagraph } from '../components/info';\n\nexport const MutationFilterInfo = () => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const firstGene = referenceGenome.genes[0].name;\n return (\n <Info height={'80vh'}>\n <InfoHeadline1> Mutation Filter</InfoHeadline1>\n <InfoParagraph>This component allows you to filter for mutations at specific positions.</InfoParagraph>\n\n <InfoHeadline2> Nucleotide Mutations and Insertions</InfoHeadline2>\n {isSingleSegmented(referenceGenome) ? (\n <SingleSegmentedNucleotideMutationsInfo />\n ) : (\n <MultiSegmentedNucleotideMutationsInfo />\n )}\n\n <InfoHeadline2>Amino Acid Mutations and Insertions</InfoHeadline2>\n <InfoParagraph>\n An amino acid mutation has the format <b><gene>:<position><base></b> or\n <b><gene>:<base_ref><position><base></b>. A <b><base></b> can be one of\n the 20 amino acid codes. It can also be <b>-</b> for deletion and <b>X</b> for unknown. Example:{' '}\n <b>E:57Q</b>.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_{firstGene}:31:N</b> would filter for sequences with an insertion\n of N between positions 31 and 32 in the gene {firstGene}.\n </InfoParagraph>\n <InfoParagraph>\n This organism has the following genes: {referenceGenome.genes.map((gene) => gene.name).join(', ')}.\n </InfoParagraph>\n\n <InfoHeadline2>Insertion Wildcards</InfoHeadline2>\n <InfoParagraph>\n This component supports insertion queries that contain wildcards <b>?</b>. For example{' '}\n <b>ins_{firstGene}:214:?EP?</b> will match all cases where segment <b>{firstGene}</b> has an insertion\n of <b>EP</b> between the positions <b>214</b> and <b>215</b> but also an insertion of other amino acids\n which include the <b>EP</b>, e.g. the insertion <b>EPE</b> will be matched.\n </InfoParagraph>\n <InfoParagraph>\n You can also use wildcards to match any insertion at a given position. For example{' '}\n <b>ins_{firstGene}:214:?</b> match any (but at least one) insertion between the positions 214 and 215.\n </InfoParagraph>\n\n <InfoHeadline2>Multiple Mutations</InfoHeadline2>\n <InfoParagraph>\n Multiple mutation filters can be provided by adding one mutation after the other.\n </InfoParagraph>\n\n <InfoHeadline2>Any Mutation</InfoHeadline2>\n <InfoParagraph>\n To filter for any mutation at a given position you can omit the <b><base></b>. Example:{' '}\n <b>{firstGene}:20</b>.\n </InfoParagraph>\n\n <InfoHeadline2>No Mutation</InfoHeadline2>\n <InfoParagraph>\n You can write a <b>.</b> for the <b><base></b> to filter for sequences for which it is confirmed\n that no mutation occurred, i.e. has the same base as the reference genome at the specified position.\n </InfoParagraph>\n </Info>\n );\n};\n\nconst SingleSegmentedNucleotideMutationsInfo = () => {\n return (\n <>\n <InfoParagraph>\n This organism is single-segmented. Thus, nucleotide mutations have the format{' '}\n <b><position><base></b> or <b><base_ref><position><base></b>. The{' '}\n <b><base_ref></b> is the reference base at the position. It is optional. A <b><base></b> can\n be one of the four nucleotides <b>A</b>, <b>T</b>, <b>C</b>, and <b>G</b>. It can also be <b>-</b> for\n deletion and <b>N</b> for unknown. For example if the reference sequence is <b>A</b> at position{' '}\n <b>23</b> both: <b>23T</b> and <b>A23T</b> will yield the same results.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_1046:A</b> would filter for sequences with an insertion of A\n between the positions 1046 and 1047 in the nucleotide sequence.\n </InfoParagraph>\n </>\n );\n};\n\nconst MultiSegmentedNucleotideMutationsInfo = () => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const firstSegment = referenceGenome.nucleotideSequences[0].name;\n\n return (\n <>\n <InfoParagraph>\n This organism is multi-segmented. Thus, nucleotide mutations have the format{' '}\n <b><segment>:<position><base></b> or{' '}\n <b><segment>:<base_ref><position><base></b>. <b><base_ref></b> is the\n reference base at the position. It is optional. A <b><base></b> can be one of the four nucleotides{' '}\n <b>A</b>, <b>T</b>, <b>C</b>, and <b>G</b>. It can also be <b>-</b> for deletion and <b>N</b> for\n unknown. For example if the reference sequence is <b>A</b> at position <b>23</b> both:{' '}\n <b>{firstSegment}:23T</b> and <b>{firstSegment}:A23T</b> will yield the same results.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_{firstSegment}:10462:A</b>.\n </InfoParagraph>\n <InfoParagraph>\n This organism has the following segments:{' '}\n {referenceGenome.nucleotideSequences.map((gene) => gene.name).join(', ')}.\n </InfoParagraph>{' '}\n </>\n );\n};\n","import { isSingleSegmented, type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport type { SequenceType } from '../../types';\n\nexport const sequenceTypeFromSegment = (\n possibleSegment: string | undefined,\n referenceGenome: ReferenceGenome,\n): SequenceType | undefined => {\n if (possibleSegment === undefined) {\n return isSingleSegmented(referenceGenome) ? 'nucleotide' : undefined;\n }\n\n if (referenceGenome.nucleotideSequences.some((sequence) => sequence.name === possibleSegment)) {\n return 'nucleotide';\n }\n\n if (referenceGenome.genes.some((gene) => gene.name === possibleSegment)) {\n return 'amino acid';\n }\n return undefined;\n};\n","import { type SelectedFilters } from './mutation-filter';\nimport { sequenceTypeFromSegment } from './sequenceTypeFromSegment';\nimport type { ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { Deletion, Insertion, Substitution } from '../../utils/mutations';\n\ntype ParsedMutationFilter = {\n [MutationType in keyof SelectedFilters]: { type: MutationType; value: SelectedFilters[MutationType][number] };\n}[keyof SelectedFilters];\n\nexport const parseAndValidateMutation = (\n value: string,\n referenceGenome: ReferenceGenome,\n): ParsedMutationFilter | null => {\n const possibleInsertion = Insertion.parse(value);\n if (possibleInsertion !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleInsertion.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideInsertions', value: possibleInsertion };\n case 'amino acid':\n return { type: 'aminoAcidInsertions', value: possibleInsertion };\n case undefined:\n return null;\n }\n }\n\n const possibleDeletion = Deletion.parse(value);\n if (possibleDeletion !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleDeletion.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideMutations', value: possibleDeletion };\n case 'amino acid':\n return { type: 'aminoAcidMutations', value: possibleDeletion };\n case undefined:\n return null;\n }\n }\n\n const possibleSubstitution = Substitution.parse(value);\n if (possibleSubstitution !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleSubstitution.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideMutations', value: possibleSubstitution };\n case 'amino acid':\n return { type: 'aminoAcidMutations', value: possibleSubstitution };\n case undefined:\n return null;\n }\n }\n\n return null;\n};\n","import type { FunctionComponent } from 'preact';\n\nexport const DeleteIcon: FunctionComponent = () => {\n return (\n <svg\n fill='currentColor'\n stroke-width='0'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 16 16'\n style='overflow: visible; color: currentcolor;'\n height='1em'\n width='1em'\n >\n <path d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z' />\n </svg>\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\n\nimport { MutationFilterInfo } from './mutation-filter-info';\nimport { parseAndValidateMutation } from './parseAndValidateMutation';\nimport { type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { type Deletion, type Insertion, type Mutation, type Substitution } from '../../utils/mutations';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { DeleteIcon } from '../shared/icons/DeleteIcon';\n\nexport interface MutationFilterInnerProps {\n initialValue?: SelectedMutationFilterStrings | string[] | undefined;\n}\n\nexport interface MutationFilterProps extends MutationFilterInnerProps {\n width: string;\n}\n\nexport type SelectedFilters = {\n nucleotideMutations: (Substitution | Deletion)[];\n aminoAcidMutations: (Substitution | Deletion)[];\n nucleotideInsertions: Insertion[];\n aminoAcidInsertions: Insertion[];\n};\n\nexport type SelectedMutationFilterStrings = {\n [Key in keyof SelectedFilters]: string[];\n};\n\nexport const MutationFilter: FunctionComponent<MutationFilterProps> = ({ initialValue, width }) => {\n return (\n <ErrorBoundary size={{ height: '3.375rem', width }}>\n <div style={width}>\n <MutationFilterInner initialValue={initialValue} />\n </div>\n </ErrorBoundary>\n );\n};\n\nexport const MutationFilterInner: FunctionComponent<MutationFilterInnerProps> = ({ initialValue }) => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n const [selectedFilters, setSelectedFilters] = useState<SelectedFilters>(\n getInitialState(initialValue, referenceGenome),\n );\n const [inputValue, setInputValue] = useState('');\n const [isError, setIsError] = useState(false);\n const formRef = useRef<HTMLFormElement>(null);\n\n const handleSubmit = (event: Event) => {\n event.preventDefault();\n if (inputValue === '') {\n return;\n }\n\n const parsedMutation = parseAndValidateMutation(inputValue, referenceGenome);\n\n if (parsedMutation === null) {\n setIsError(true);\n return;\n }\n\n const newSelectedValues = {\n ...selectedFilters,\n [parsedMutation.type]: [...selectedFilters[parsedMutation.type], parsedMutation.value],\n };\n\n setSelectedFilters(newSelectedValues);\n fireChangeEvent(newSelectedValues);\n setInputValue('');\n };\n\n const fireChangeEvent = (selectedFilters: SelectedFilters) => {\n const detail = mapToMutationFilterStrings(selectedFilters);\n\n formRef.current?.dispatchEvent(\n new CustomEvent<SelectedMutationFilterStrings>('gs-mutation-filter-changed', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n const handleOnBlur = () => {\n const detail = mapToMutationFilterStrings(selectedFilters);\n\n formRef.current?.dispatchEvent(\n new CustomEvent<SelectedMutationFilterStrings>('gs-mutation-filter-on-blur', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n const handleInputChange = (event: Event) => {\n setInputValue((event.target as HTMLInputElement).value);\n setIsError(false);\n };\n\n return (\n <form className='w-full border boder-gray-300 rounded-md relative' onSubmit={handleSubmit} ref={formRef}>\n <div className='absolute -top-3 -right-3'>\n <MutationFilterInfo />\n </div>\n <div className='w-full flex p-2 flex-wrap items-center'>\n <SelectedMutationDisplay\n selectedFilters={selectedFilters}\n setSelectedFilters={setSelectedFilters}\n fireChangeEvent={fireChangeEvent}\n />\n <div\n className={`w-full flex border ${isError ? 'border-red-500' : 'border-gray-300'} border-solid m-2 text-sm focus-within:border-gray-400 `}\n >\n <input\n className='grow flex-1 p-1 border-none focus:outline-none focus:ring-0'\n type='text'\n value={inputValue}\n onInput={handleInputChange}\n placeholder={getPlaceholder(referenceGenome)}\n onBlur={handleOnBlur}\n />\n <button type='submit' className='btn btn-xs m-1'>\n +\n </button>\n </div>\n </div>\n </form>\n );\n};\n\nfunction getInitialState(\n initialValue: SelectedMutationFilterStrings | string[] | undefined,\n referenceGenome: ReferenceGenome,\n) {\n if (initialValue === undefined) {\n return {\n nucleotideMutations: [],\n aminoAcidMutations: [],\n nucleotideInsertions: [],\n aminoAcidInsertions: [],\n };\n }\n\n const values = Array.isArray(initialValue) ? initialValue : Object.values(initialValue).flatMap((it) => it);\n\n return values.reduce(\n (selectedFilters, value) => {\n const parsedMutation = parseAndValidateMutation(value, referenceGenome);\n if (parsedMutation === null) {\n return selectedFilters;\n }\n\n return {\n ...selectedFilters,\n [parsedMutation.type]: [...selectedFilters[parsedMutation.type], parsedMutation.value],\n };\n },\n {\n nucleotideMutations: [],\n aminoAcidMutations: [],\n nucleotideInsertions: [],\n aminoAcidInsertions: [],\n } as SelectedFilters,\n );\n}\n\nfunction getPlaceholder(referenceGenome: ReferenceGenome) {\n const segmentPrefix =\n referenceGenome.nucleotideSequences.length > 1 ? `${referenceGenome.nucleotideSequences[0].name}:` : '';\n const firstGene = referenceGenome.genes[0].name;\n\n return `Enter a mutation (e.g. ${segmentPrefix}A123T, ins_${segmentPrefix}123:AT, ${firstGene}:M123E, ins_${firstGene}:123:ME)`;\n}\n\nconst SelectedMutationDisplay: FunctionComponent<{\n selectedFilters: SelectedFilters;\n setSelectedFilters: (selectedFilters: SelectedFilters) => void;\n fireChangeEvent: (selectedFilters: SelectedFilters) => void;\n}> = ({ selectedFilters, setSelectedFilters, fireChangeEvent }) => {\n const onSelectedRemoved = <MutationType extends keyof SelectedFilters>(\n mutation: SelectedFilters[MutationType][number],\n key: MutationType,\n ) => {\n const newSelectedValues = {\n ...selectedFilters,\n [key]: selectedFilters[key].filter((i) => !mutation.equals(i)),\n };\n\n setSelectedFilters(newSelectedValues);\n\n fireChangeEvent(newSelectedValues);\n };\n\n return (\n <>\n {selectedFilters.nucleotideMutations.map((mutation) => (\n <SelectedNucleotideMutation\n key={mutation.toString()}\n mutation={mutation}\n onDelete={(mutation: Substitution | Deletion) => onSelectedRemoved(mutation, 'nucleotideMutations')}\n />\n ))}\n {selectedFilters.aminoAcidMutations.map((mutation) => (\n <SelectedAminoAcidMutation\n key={mutation.toString()}\n mutation={mutation}\n onDelete={(mutation: Substitution | Deletion) => onSelectedRemoved(mutation, 'aminoAcidMutations')}\n />\n ))}\n {selectedFilters.nucleotideInsertions.map((insertion) => (\n <SelectedNucleotideInsertion\n key={insertion.toString()}\n insertion={insertion}\n onDelete={(insertion) => onSelectedRemoved(insertion, 'nucleotideInsertions')}\n />\n ))}\n {selectedFilters.aminoAcidInsertions.map((insertion) => (\n <SelectedAminoAcidInsertion\n key={insertion.toString()}\n insertion={insertion}\n onDelete={(insertion: Insertion) => onSelectedRemoved(insertion, 'aminoAcidInsertions')}\n />\n ))}\n </>\n );\n};\n\nconst SelectedAminoAcidInsertion: FunctionComponent<{\n insertion: Insertion;\n onDelete: (insertion: Insertion) => void;\n}> = ({ insertion, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('teal', 0.3);\n const textColor = singleGraphColorRGBByName('teal', 1);\n return (\n <SelectedFilter\n mutation={insertion}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\nconst SelectedAminoAcidMutation: FunctionComponent<{\n mutation: Substitution | Deletion;\n onDelete: (mutation: Substitution | Deletion) => void;\n}> = ({ mutation, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('rose', 0.3);\n const textColor = singleGraphColorRGBByName('rose', 1);\n return (\n <SelectedFilter\n mutation={mutation}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\nconst SelectedNucleotideMutation: FunctionComponent<{\n mutation: Substitution | Deletion;\n onDelete: (insertion: Substitution | Deletion) => void;\n}> = ({ mutation, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('indigo', 0.3);\n const textColor = singleGraphColorRGBByName('indigo', 1);\n return (\n <SelectedFilter\n mutation={mutation}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\nconst SelectedNucleotideInsertion: FunctionComponent<{\n insertion: Insertion;\n onDelete: (insertion: Insertion) => void;\n}> = ({ insertion, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('green', 0.3);\n const textColor = singleGraphColorRGBByName('green', 1);\n\n return (\n <SelectedFilter\n mutation={insertion}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\ntype SelectedFilterProps<MutationType extends Mutation> = {\n mutation: MutationType;\n onDelete: (mutation: MutationType) => void;\n backgroundColor: string;\n textColor: string;\n};\n\nconst SelectedFilter = <MutationType extends Mutation>({\n mutation,\n onDelete,\n backgroundColor,\n textColor,\n}: SelectedFilterProps<MutationType>) => {\n return (\n <span\n class='inline-block mx-1 px-2 py-1 font-medium text-xs rounded-full'\n style={{ backgroundColor, color: textColor }}\n >\n {mutation.toString()}\n <button type='button' onClick={() => onDelete(mutation)}>\n <DeleteIcon />\n </button>\n </span>\n );\n};\n\nfunction mapToMutationFilterStrings(selectedFilters: SelectedFilters) {\n return {\n aminoAcidMutations: selectedFilters.aminoAcidMutations.map((mutation) => mutation.toString()),\n nucleotideMutations: selectedFilters.nucleotideMutations.map((mutation) => mutation.toString()),\n aminoAcidInsertions: selectedFilters.aminoAcidInsertions.map((insertion) => insertion.toString()),\n nucleotideInsertions: selectedFilters.nucleotideInsertions.map((insertion) => insertion.toString()),\n };\n}\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { ReferenceGenomesAwaiter } from '../../preact/components/ReferenceGenomesAwaiter';\nimport {\n MutationFilter,\n type MutationFilterProps,\n type SelectedMutationFilterStrings,\n} from '../../preact/mutationFilter/mutation-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n * This component provides an input field to specify filters for nucleotide and amino acid mutations and insertions.\n *\n * Input values have to be provided one at a time and submitted by pressing the Enter key or by clicking the '+' button.\n * After submission, the component validates the input and fires an event with the selected mutations.\n * All previously selected mutations are displayed at the input field and added to the event.\n * Users can remove a mutation by clicking the 'x' button next to the mutation.\n *\n * ## Input Validation\n *\n * Validation of the input is performed according to the following rules:\n *\n * ### Mutations\n *\n * Mutations have to conform to the following format: `<gene/segment>:<symbol at reference><position><Substituted symbol/Deletion>`\n * - Gene/segment: The gene or segment where the mutation occurs. Must be contained in the reference genome.\n * (Optional for elements with only one gene/segment)\n * - Symbol at reference: The symbol at the reference position. (Optional)\n * - Position: The position of the mutation. (Required)\n * - Substituted symbol/Deletion: The substituted symbol or '-' for a deletion. (Required)\n *\n * Examples: `S:614G`, `614G`, `614-`, `614G`\n *\n * ### Insertions\n *\n * Insertions have to conform to the following format: `ins_<gene/segment>:<position>:<Inserted symbols>`\n * - Gene/segment: The gene or segment where the insertion occurs. Must be contained in the reference genome.\n * (Optional for elements with only one gene/segment)\n * - Position: The position of the insertion. (Required)\n * - Inserted symbols: The symbols that are inserted. (Required)\n *\n * Examples: `ins_S:614:G`, `ins_614:G`\n *\n * @fires {CustomEvent<{\n * nucleotideMutations: string[],\n * aminoAcidMutations: string[],\n * nucleotideInsertions: string[],\n * aminoAcidInsertions: string[]\n * }>} gs-mutation-filter-changed\n * Fired when:\n * - The user has submitted a valid mutation or insertion\n * - The user has removed a mutation or insertion\n *\n * @fires {CustomEvent<{\n * nucleotideMutations: string[],\n * aminoAcidMutations: string[],\n * nucleotideInsertions: string[],\n * aminoAcidInsertions: string[]\n * }>} gs-mutation-filter-on-blur\n * Fired when:\n * - the mutation filter has lost focus\n * Contains the selected mutations in the format\n */\n@customElement('gs-mutation-filter')\nexport class MutationFilterComponent extends PreactLitAdapter {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * The initial value to use for this mutation filter.\n * All values provided must be valid mutations or insertions.\n * Invalid values will be ignored.\n */\n @property({ type: Object })\n initialValue:\n {\n nucleotideMutations: string[];\n aminoAcidMutations: string[];\n nucleotideInsertions: string[];\n aminoAcidInsertions: string[];\n }\n | string[]\n | undefined = undefined;\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <ReferenceGenomesAwaiter>\n <MutationFilter initialValue={this.initialValue} width={this.width} />\n </ReferenceGenomesAwaiter>\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutation-filter': MutationFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-mutation-filter-changed': CustomEvent<SelectedMutationFilterStrings>;\n 'gs-mutation-filter-on-blur': CustomEvent<SelectedMutationFilterStrings>;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof MutationFilterComponent.prototype.initialValue, MutationFilterProps['initialValue']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchLineageAutocompleteList(lapis: string, field: string, signal?: AbortSignal) {\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string>>({}, [field]);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n return data.flatMap((item) => [item[field], `${item[field]}*`]).sort();\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef } from 'preact/hooks';\n\nimport { fetchLineageAutocompleteList } from './fetchLineageAutocompleteList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nexport interface LineageFilterInnerProps {\n lapisField: string;\n placeholderText?: string;\n initialValue?: string;\n}\n\nexport interface LineageFilterProps extends LineageFilterInnerProps {\n width: string;\n}\n\nexport const LineageFilter: FunctionComponent<LineageFilterProps> = ({ width, ...innerProps }) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <LineageFilterInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst LineageFilterInner: FunctionComponent<LineageFilterInnerProps> = ({\n lapisField,\n placeholderText,\n initialValue,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data, error, isLoading } = useQuery(\n () => fetchLineageAutocompleteList(lapis, lapisField),\n [lapisField, lapis],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n const onInput = () => {\n const value = inputRef.current?.value === '' ? undefined : inputRef.current?.value;\n\n if (isValidValue(value)) {\n inputRef.current?.dispatchEvent(\n new CustomEvent('gs-lineage-filter-changed', {\n detail: { [lapisField]: value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n const isValidValue = (value: string | undefined) => {\n if (value === undefined) {\n return true;\n }\n return data.includes(value);\n };\n\n return (\n <>\n <input\n type='text'\n class='input input-bordered w-full'\n placeholder={placeholderText !== undefined ? placeholderText : lapisField}\n onInput={onInput}\n ref={inputRef}\n list={lapisField}\n value={initialValue}\n />\n <datalist id={lapisField}>\n {data.map((item) => (\n <option value={item} key={item} />\n ))}\n </datalist>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { LineageFilter } from '../../preact/lineageFilter/lineage-filter';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n *\n * ## Context\n *\n * This component provides a text input field to filter by lineages.\n * Currently, it is designed to work well with Pango Lineages,\n * but it may also be used for other lineage types, if suitable.\n *\n * It fetches all available values of the `lapisField` from the LAPIS instance\n * and provides an autocomplete list with the available values of the lineage and sublineage queries\n * (a `*` appended to the lineage value).\n *\n * @fires {CustomEvent<Record<string, string>>} gs-lineage-filter-changed\n * Fired when the input field is changed.\n * The `details` of this event contain an object with the `lapisField` as key and the input value as value.\n * Example:\n * ```\n * {\n * \"pangoLineage\": \"B.1.1.7\"\n * }\n * ```\n */\n@customElement('gs-lineage-filter')\nexport class LineageFilterComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this lineage filter.\n */\n @property()\n initialValue: string = '';\n\n /**\n * Required.\n *\n * The LAPIS field name to use for this lineage filter.\n * The field must exist on this LAPIS instance.\n */\n @property()\n lapisField = '';\n\n /**\n * The placeholder text to display in the input field.\n */\n @property()\n placeholderText: string = '';\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <LineageFilter\n lapisField={this.lapisField}\n placeholderText={this.placeholderText}\n initialValue={this.initialValue}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-lineage-filter': LineageFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-lineage-filter-changed': CustomEvent<Record<string, string>>;\n }\n}\n"],"names":["t","e","o","s","r","n","S","c","i","h","a","l","p","d","u","f","y","_a","b","z","problemDetail","__decorateClass","property","customElement","D","wrapper","useRef","useEffect","jsx","useState","useMemo","jsxs","createContext","x","item","useContext","size","useErrorBoundary","heightOfTabs","error","Toolbar","byProportion","maxInData","datasets","getDataset","tooltip","v","padStart","padZoneStr","monthDiff","C.M","absFloor","prettyUnit","C.Y","C.W","C.D","C.DATE","C.H","C.MIN","C.S","C.MS","isUndefined","isDayjs","parseLocale","dayjs","parseDate","C.REGEX_PARSE","m","Dayjs","C.INVALID_DATE_STRING","instanceFactory","instanceFactorySet","C.MILLISECONDS_A_MINUTE","C.MILLISECONDS_A_HOUR","C.MILLISECONDS_A_SECOND","C.FORMAT_DEFAULT","getShort","get$H","matches","C.REGEX_FORMAT","diff","getMonth","C.Q","C.MILLISECONDS_A_WEEK","C.MILLISECONDS_A_DAY","proto","getYearFirstThursday","getCurrentWeekThursday","total","data","granularity","aggregatedResponse","getDatasets","lapisFilter","Fragment","j","key","value","options","selectedFilters","mutation","insertion","backgroundColor","textColor"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[0,1,2,3,10,11,69,70,71,72,73,74]}
|
|
1
|
+
{"version":3,"file":"dashboard-components.js","sources":["../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../src/web-components/lapis-context.ts","../src/web-components/reference-genome-context.ts","../src/lapisApi/ReferenceGenome.ts","../src/lapisApi/lapisTypes.ts","../src/lapisApi/lapisApi.ts","../src/web-components/app.ts","../node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","../node_modules/preact/hooks/dist/hooks.module.js","../src/preact/mutationComparison/getMutationComparisonTableData.ts","../src/preact/components/table.tsx","../src/utils/mutations.ts","../src/preact/shared/sort/sortSubstitutionsAndDeletions.ts","../src/preact/shared/table/formatProportion.ts","../src/preact/mutationComparison/mutation-comparison-table.tsx","../src/preact/components/chart.tsx","../src/preact/mutationComparison/mutation-comparison-venn.tsx","../src/operator/FetchSubstitutionsOrDeletionsOperator.ts","../src/operator/SortOperator.ts","../src/query/querySubstitutionsOrDeletions.ts","../src/preact/mutationComparison/queryMutationData.ts","../src/preact/LapisUrlContext.ts","../src/preact/shared/floating-ui/hooks.ts","../src/preact/components/dropdown.tsx","../src/preact/components/checkbox-selector.tsx","../src/preact/ReferenceGenomeContext.ts","../src/preact/components/SegmentSelector.tsx","../src/preact/components/csv-download-button.tsx","../src/preact/components/error-display.tsx","../src/preact/components/resize-container.tsx","../src/preact/components/error-boundary.tsx","../src/preact/components/info.tsx","../src/preact/components/loading-display.tsx","../src/preact/components/mutation-type-selector.tsx","../src/preact/components/no-data-display.tsx","../src/preact/components/min-max-range-slider.tsx","../src/preact/components/percent-intput.tsx","../src/preact/components/proportion-selector.tsx","../src/preact/components/proportion-selector-dropdown.tsx","../src/preact/components/tabs.tsx","../src/preact/useQuery.ts","../src/preact/mutationComparison/mutation-comparison.tsx","../src/web-components/PreactLitAdapter.tsx","../src/web-components/PreactLitAdapterWithGridJsStyles.tsx","../src/web-components/visualization/gs-mutation-comparison.tsx","../src/preact/mutations/getInsertionsTableData.ts","../src/preact/mutations/getMutationsTableData.ts","../src/preact/shared/sort/sortMutationPositions.ts","../src/preact/mutations/getMutationsGridData.ts","../src/preact/mutations/mutations-grid.tsx","../src/preact/shared/sort/sortInsertions.ts","../src/preact/mutations/mutations-insertions-table.tsx","../src/preact/mutations/mutations-table.tsx","../src/operator/FetchInsertionsOperator.ts","../src/query/queryInsertions.ts","../src/preact/mutations/queryMutations.ts","../src/preact/mutations/mutations.tsx","../src/web-components/visualization/gs-mutations.tsx","../src/preact/prevalenceOverTime/getPrevalenceOverTimeTableData.ts","../src/utils/sort.ts","../src/preact/shared/charts/LogitScale.ts","../src/preact/shared/charts/colors.ts","../src/preact/shared/charts/confideceInterval.ts","../src/preact/shared/charts/getYAxisMax.ts","../src/preact/shared/charts/getYAxisScale.ts","../src/preact/prevalenceOverTime/prevalence-over-time-bar-chart.tsx","../node_modules/dayjs/esm/constant.js","../node_modules/dayjs/esm/locale/en.js","../node_modules/dayjs/esm/utils.js","../node_modules/dayjs/esm/index.js","../node_modules/dayjs/esm/plugin/advancedFormat/index.js","../node_modules/dayjs/esm/plugin/isoWeek/index.js","../src/utils/temporal.ts","../src/utils/utils.ts","../src/preact/prevalenceOverTime/prevalence-over-time-bubble-chart.tsx","../src/preact/prevalenceOverTime/prevalence-over-time-line-chart.tsx","../src/preact/prevalenceOverTime/prevalence-over-time-table.tsx","../src/operator/FetchAggregatedOperator.ts","../src/operator/FillMissingOperator.ts","../src/operator/GroupByOperator.ts","../src/operator/GroupByAndSumOperator.ts","../src/operator/MapOperator.ts","../src/operator/RenameFieldOperator.ts","../src/operator/SlidingOperator.ts","../src/query/queryAggregatedDataOverTime.ts","../src/operator/DivisionOperator.ts","../src/query/queryPrevalenceOverTime.ts","../src/preact/components/select.tsx","../src/preact/components/confidence-interval-selector.tsx","../src/preact/components/scaling-selector.tsx","../src/preact/prevalenceOverTime/prevalence-over-time.tsx","../src/web-components/visualization/gs-prevalence-over-time.tsx","../src/preact/relativeGrowthAdvantage/relative-growth-advantage-chart.tsx","../src/query/queryRelativeGrowthAdvantage.ts","../src/preact/relativeGrowthAdvantage/relative-growth-advantage.tsx","../src/web-components/visualization/gs-relative-growth-advantage.tsx","../src/query/queryAggregateData.ts","../src/preact/aggregatedData/aggregate-table.tsx","../src/preact/aggregatedData/aggregate.tsx","../src/web-components/visualization/gs-aggregate.tsx","../src/preact/numberSequencesOverTime/getNumberOfSequencesOverTimeTableData.ts","../src/preact/numberSequencesOverTime/number-sequences-over-time-bar-chart.tsx","../src/preact/numberSequencesOverTime/number-sequences-over-time-line-chart.tsx","../src/preact/numberSequencesOverTime/number-sequences-over-time-table.tsx","../src/query/queryNumberOfSequencesOverTime.ts","../src/preact/numberSequencesOverTime/number-sequences-over-time.tsx","../src/web-components/visualization/gs-number-sequences-over-time.tsx","../src/preact/mutationsOverTime/getFilteredMutationsOverTimeData.ts","../src/preact/components/tooltip.tsx","../src/preact/mutationsOverTime/mutations-over-time-grid.tsx","../src/utils/Map2d.ts","../src/query/queryMutationsOverTime.ts","../src/preact/mutationsOverTime/mutations-over-time.tsx","../src/web-components/visualization/gs-mutations-over-time.tsx","../src/preact/dateRangeSelector/selectableOptions.ts","../src/preact/dateRangeSelector/computeInitialValues.ts","../src/preact/dateRangeSelector/dateConversion.ts","../src/preact/dateRangeSelector/date-range-selector.tsx","../src/web-components/input/gs-date-range-selector.tsx","../src/preact/locationFilter/fetchAutocompletionList.ts","../src/preact/locationFilter/location-filter.tsx","../src/web-components/input/gs-location-filter.tsx","../src/preact/textInput/fetchAutocompleteList.ts","../src/preact/textInput/text-input.tsx","../src/web-components/input/gs-text-input.tsx","../src/preact/components/ReferenceGenomesAwaiter.tsx","../src/preact/mutationFilter/mutation-filter-info.tsx","../src/preact/mutationFilter/sequenceTypeFromSegment.ts","../src/preact/mutationFilter/parseAndValidateMutation.ts","../src/preact/shared/icons/DeleteIcon.tsx","../src/preact/mutationFilter/mutation-filter.tsx","../src/web-components/input/gs-mutation-filter.tsx","../src/preact/lineageFilter/fetchLineageAutocompleteList.ts","../src/preact/lineageFilter/lineage-filter.tsx","../src/web-components/input/gs-lineage-filter.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer((()=>{customElements.define(t,e)})):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce(((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1]),t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,adoptStyles,css,getCompatibleStyle,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:r,getOwnPropertyNames:h,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),y={attribute:!0,type:String,converter:u,reflect:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class b extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=y){if(s.state&&(s.attribute=!1),this._$Ei(),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),r=this.getPropertyDescriptor(t,i,s);void 0!==r&&e(this.prototype,t,r)}}static getPropertyDescriptor(t,s,i){const{get:e,set:h}=r(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get(){return e?.call(this)},set(s){const r=e?.call(this);h.call(this,s),this.requestUpdate(t,r,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??y}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...h(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$EC(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const r=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==r?this.removeAttribute(e):this.setAttribute(e,r),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),r=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e,this[e]=r.fromAttribute(s,t.type),this._$Em=null}}requestUpdate(t,s,i){if(void 0!==t){if(i??=this.constructor.getPropertyOptions(t),!(i.hasChanged??f)(this[t],s))return;this.P(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$ET())}P(t,s,i){this._$AL.has(t)||this._$AL.set(t,s),!0===i.reflect&&this._$Em!==t&&(this._$Ej??=new Set).add(t)}async _$ET(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t)!0!==i.wrapped||this._$AL.has(s)||void 0===this[s]||this.P(s,this[s],i)}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach((t=>t.hostUpdate?.())),this.update(s)):this._$EU()}catch(s){throw t=!1,this._$EU(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EU(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Ej&&=this._$Ej.forEach((t=>this._$EC(t,this[t]))),this._$EU()}updated(t){}firstUpdated(t){}}b.elementStyles=[],b.shadowRootOptions={mode:\"open\"},b[d(\"elementProperties\")]=new Map,b[d(\"finalized\")]=new Map,p?.({ReactiveElement:b}),(a.reactiveElementVersions??=[]).push(\"2.0.4\");export{b as ReactiveElement,u as defaultConverter,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{defaultConverter as t,notEqual as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:t,reflect:!1,hasChanged:e},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t)},init(e){return void 0!==e&&this.P(o,void 0,t),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,r?{...t,wrapped:!0}:t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import { createContext } from '@lit/context';\n\nexport const lapisContext = createContext<string>('lapis-context');\n","import { createContext } from '@lit/context';\n\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\n\nexport const referenceGenomeContext = createContext<ReferenceGenome>('reference-genome-context');\n","import z from 'zod';\n\nimport type { SequenceType } from '../types';\n\nexport const referenceGenomeResponse = z.object({\n nucleotideSequences: z.array(\n z.object({\n name: z.string(),\n sequence: z.string(),\n }),\n ),\n genes: z.array(\n z.object({\n name: z.string(),\n sequence: z.string(),\n }),\n ),\n});\nexport type ReferenceGenome = z.infer<typeof referenceGenomeResponse>;\n\nexport const getSegmentNames = (referenceGenome: ReferenceGenome, sequenceType: SequenceType) => {\n switch (sequenceType) {\n case 'nucleotide': {\n return referenceGenome.nucleotideSequences.map((sequence) => sequence.name);\n }\n case 'amino acid': {\n return referenceGenome.genes.map((gene) => gene.name);\n }\n }\n};\n\nexport const isSingleSegmented = (referenceGenome: ReferenceGenome) => referenceGenome.nucleotideSequences.length === 1;\n","import z, { type ZodTypeAny } from 'zod';\n\nexport const orderByType = z.enum(['ascending', 'descending']);\n\nexport const orderBy = z.object({\n field: z.string(),\n type: orderByType,\n});\n\nexport const lapisBaseRequest = z\n .object({\n limit: z.number().optional(),\n offset: z.number().optional(),\n fields: z.array(z.string()).optional(),\n orderBy: z.array(orderBy).optional(),\n })\n .catchall(z.union([z.boolean(), z.undefined(), z.string(), z.number(), z.null(), z.array(z.string())]));\nexport type LapisBaseRequest = z.infer<typeof lapisBaseRequest>;\n\nexport const mutationsRequest = lapisBaseRequest.extend({ minProportion: z.number().optional() });\nexport type MutationsRequest = z.infer<typeof mutationsRequest>;\n\nconst mutationProportionCount = z.object({\n mutation: z.string(),\n proportion: z.number(),\n count: z.number(),\n sequenceName: z.union([z.string(), z.null()]),\n mutationFrom: z.string(),\n mutationTo: z.string(),\n position: z.number(),\n});\nexport const mutationsResponse = makeLapisResponse(z.array(mutationProportionCount));\nexport type MutationsResponse = z.infer<typeof mutationsResponse>;\n\nconst insertionCount = z.object({\n insertion: z.string(),\n count: z.number(),\n insertedSymbols: z.string(),\n position: z.number(),\n sequenceName: z.union([z.string(), z.null()]),\n});\nexport const insertionsResponse = makeLapisResponse(z.array(insertionCount));\n\nexport const aggregatedItem = z.object({ count: z.number() }).catchall(z.union([z.string(), z.number(), z.null()]));\nexport const aggregatedResponse = makeLapisResponse(z.array(aggregatedItem));\nexport type AggregatedItem = z.infer<typeof aggregatedItem>;\n\nfunction makeLapisResponse<T extends ZodTypeAny>(data: T) {\n return z.object({\n data,\n });\n}\n\nexport const problemDetail = z.object({\n title: z.string().optional(),\n status: z.number(),\n detail: z.string().optional(),\n type: z.string(),\n instance: z.string().optional(),\n});\n\nexport type ProblemDetail = z.infer<typeof problemDetail>;\n\nexport const lapisError = z.object({\n error: problemDetail,\n});\n","import { referenceGenomeResponse } from './ReferenceGenome';\nimport {\n aggregatedResponse,\n insertionsResponse,\n type LapisBaseRequest,\n lapisError,\n type MutationsRequest,\n mutationsResponse,\n problemDetail,\n type ProblemDetail,\n} from './lapisTypes';\nimport { type SequenceType } from '../types';\n\nexport class UnknownLapisError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n ) {\n super(message);\n this.name = 'UnknownLapisError';\n }\n}\n\nexport class LapisError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly problemDetail: ProblemDetail,\n ) {\n super(message);\n this.name = 'LapisError';\n }\n}\n\nexport async function fetchAggregated(lapisUrl: string, body: LapisBaseRequest, signal?: AbortSignal) {\n const response = await fetch(aggregatedEndpoint(lapisUrl), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n await handleErrors(response);\n\n return aggregatedResponse.parse(await response.json());\n}\n\nexport async function fetchInsertions(\n lapisUrl: string,\n body: LapisBaseRequest,\n sequenceType: SequenceType,\n signal?: AbortSignal,\n) {\n const response = await fetch(insertionsEndpoint(lapisUrl, sequenceType), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n await handleErrors(response);\n\n return insertionsResponse.parse(await response.json());\n}\n\nexport async function fetchSubstitutionsOrDeletions(\n lapisUrl: string,\n body: MutationsRequest,\n sequenceType: SequenceType,\n signal?: AbortSignal,\n) {\n const response = await fetch(substitutionsOrDeletionsEndpoint(lapisUrl, sequenceType), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n await handleErrors(response);\n\n return mutationsResponse.parse(await response.json());\n}\n\nexport async function fetchReferenceGenome(lapisUrl: string, signal?: AbortSignal) {\n const response = await fetch(referenceGenomeEndpoint(lapisUrl), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n signal,\n });\n\n await handleErrors(response);\n return referenceGenomeResponse.parse(await response.json());\n}\n\nconst handleErrors = async (response: Response) => {\n if (!response.ok) {\n if (response.status >= 400 && response.status < 500) {\n const json = await response.json();\n\n const lapisErrorResult = lapisError.safeParse(json);\n if (lapisErrorResult.success) {\n throw new LapisError(\n response.statusText + lapisErrorResult.data.error.detail,\n response.status,\n lapisErrorResult.data.error,\n );\n }\n\n const problemDetailResult = problemDetail.safeParse(json);\n if (problemDetailResult.success) {\n throw new LapisError(\n response.statusText + problemDetailResult.data.detail,\n response.status,\n problemDetailResult.data,\n );\n }\n\n throw new UnknownLapisError(`${response.statusText}: ${JSON.stringify(json)}`, response.status);\n }\n throw new UnknownLapisError(`${response.statusText}: ${response.status}`, response.status);\n }\n};\n\nexport const aggregatedEndpoint = (lapisUrl: string) => `${lapisUrl}/sample/aggregated`;\nexport const insertionsEndpoint = (lapisUrl: string, sequenceType: SequenceType) => {\n return sequenceType === 'amino acid'\n ? `${lapisUrl}/sample/aminoAcidInsertions`\n : `${lapisUrl}/sample/nucleotideInsertions`;\n};\nexport const substitutionsOrDeletionsEndpoint = (lapisUrl: string, sequenceType: SequenceType) => {\n return sequenceType === 'amino acid'\n ? `${lapisUrl}/sample/aminoAcidMutations`\n : `${lapisUrl}/sample/nucleotideMutations`;\n};\nexport const referenceGenomeEndpoint = (lapisUrl: string) => `${lapisUrl}/sample/referenceGenome`;\n","import { provide } from '@lit/context';\nimport { Task } from '@lit/task';\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { lapisContext } from './lapis-context';\nimport { referenceGenomeContext } from './reference-genome-context';\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\nimport { fetchReferenceGenome } from '../lapisApi/lapisApi';\n\n/**\n * ## Context\n *\n * This component provides the main application context.\n * All other `gs-*` components must be (possibly nested) children of this component.\n * It makes use of the [Lit Context](https://lit.dev/docs/data/context/) to\n * - provide the URL to the LAPIS instance to all its children\n * - fetch the reference genomes from LAPIS and provide it to all its children\n *\n * This will show an error message if the reference genome cannot be fetched\n * (e.g., due to an invalid LAPIS URL).\n *\n * ## Shadow DOM\n *\n * This component does __not__ use a shadow DOM. Children of this component will be rendered directly in the light DOM.\n */\n@customElement('gs-app')\nexport class App extends LitElement {\n /**\n * Required.\n *\n * The URL of the LAPIS instance that all children of this component will use.\n */\n @provide({ context: lapisContext })\n @property()\n lapis: string = '';\n\n /**\n * @internal\n */\n @provide({ context: referenceGenomeContext })\n referenceGenome: ReferenceGenome = {\n nucleotideSequences: [],\n genes: [],\n };\n\n /**\n * @internal\n */\n private updateReferenceGenome = new Task(this, {\n task: async () => {\n this.referenceGenome = await fetchReferenceGenome(this.lapis);\n },\n args: () => [this.lapis],\n });\n\n override render() {\n return this.updateReferenceGenome.render({\n complete: () => html``, // Children will be rendered in the light DOM anyway. We can't use slots without a shadow DOM.\n error: () =>\n html` <div class=\"m-2 w-full alert alert-error\">\n Error: Cannot fetch reference genome. Is LAPIS available?\n </div>`,\n });\n }\n\n override createRenderRoot() {\n return this;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-app': App;\n }\n}\n","import{options as r,Fragment as e}from\"preact\";export{Fragment}from\"preact\";var t=/[\"&<]/;function n(r){if(0===r.length||!1===t.test(r))return r;for(var e=0,n=0,o=\"\",f=\"\";n<r.length;n++){switch(r.charCodeAt(n)){case 34:f=\""\";break;case 38:f=\"&\";break;case 60:f=\"<\";break;default:continue}n!==e&&(o+=r.slice(e,n)),o+=f,e=n+1}return n!==e&&(o+=r.slice(e,n)),o}var o=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,f=0,i=Array.isArray;function u(e,t,n,o,i,u){t||(t={});var a,c,p=t;if(\"ref\"in p)for(c in p={},t)\"ref\"==c?a=t[c]:p[c]=t[c];var l={type:e,props:p,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:--f,__i:-1,__u:0,__source:i,__self:u};if(\"function\"==typeof e&&(a=e.defaultProps))for(c in a)void 0===p[c]&&(p[c]=a[c]);return r.vnode&&r.vnode(l),l}function a(r){var t=u(e,{tpl:r,exprs:[].slice.call(arguments,1)});return t.key=t.__v,t}var c={},p=/[A-Z]/g;function l(e,t){if(r.attr){var f=r.attr(e,t);if(\"string\"==typeof f)return f}if(\"ref\"===e||\"key\"===e)return\"\";if(\"style\"===e&&\"object\"==typeof t){var i=\"\";for(var u in t){var a=t[u];if(null!=a&&\"\"!==a){var l=\"-\"==u[0]?u:c[u]||(c[u]=u.replace(p,\"-$&\").toLowerCase()),_=\";\";\"number\"!=typeof a||l.startsWith(\"--\")||o.test(l)||(_=\"px;\"),i=i+l+\":\"+a+_}}return e+'=\"'+i+'\"'}return null==t||!1===t||\"function\"==typeof t||\"object\"==typeof t?\"\":!0===t?e:e+'=\"'+n(t)+'\"'}function _(r){if(null==r||\"boolean\"==typeof r||\"function\"==typeof r)return null;if(\"object\"==typeof r){if(void 0===r.constructor)return r;if(i(r)){for(var e=0;e<r.length;e++)r[e]=_(r[e]);return r}}return n(\"\"+r)}export{u as jsx,l as jsxAttr,u as jsxDEV,_ as jsxEscape,a as jsxTemplate,u as jsxs};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function d(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function h(n){return o=1,p(D,n)}function p(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),!(!i&&o.__c.props===n)&&(!c||c.call(this,n,t,r))};r.u=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=d(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__H.__h.push(i))}function _(n,u){var i=d(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function T(n,r){var u=d(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=d(t++,10),i=h();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=d(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.i=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.i=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,p as useReducer,A as useRef,h as useState};\n//# sourceMappingURL=hooks.module.js.map\n","import { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\ntype Proportions = {\n [displayName: string]: number;\n};\n\ntype MutationComparisonRow = {\n mutation: Substitution | Deletion;\n proportions: Proportions;\n};\n\nexport function getMutationComparisonTableData(data: Dataset<MutationData>, proportionInterval: ProportionInterval) {\n const mutationsToProportions = new Map<string, MutationComparisonRow>();\n\n for (const mutationData of data.content) {\n for (const mutationEntry of mutationData.data) {\n const mutationKey = mutationEntry.mutation.toString();\n const existingRow = mutationsToProportions.get(mutationKey);\n\n if (!existingRow) {\n mutationsToProportions.set(\n mutationKey,\n initializeMutationRow(mutationEntry.mutation, mutationData.displayName, mutationEntry.proportion),\n );\n } else {\n existingRow.proportions = updateProportions(\n existingRow.proportions,\n mutationData.displayName,\n mutationEntry.proportion,\n );\n mutationsToProportions.set(mutationKey, existingRow);\n }\n }\n }\n\n return [...mutationsToProportions.values()]\n .map((row) => {\n return {\n mutation: row.mutation,\n ...data.content\n .map((mutationData) => {\n return {\n [`${mutationData.displayName} prevalence`]: row.proportions[mutationData.displayName] || 0,\n };\n })\n .reduce((acc, val) => ({ ...acc, ...val }), {}),\n } as { mutation: Substitution | Deletion } & Proportions;\n })\n .filter((row) =>\n Object.values(row).some(\n (value) =>\n typeof value === 'number' && value >= proportionInterval.min && value <= proportionInterval.max,\n ),\n );\n}\n\nfunction initializeMutationRow(\n mutation: Substitution | Deletion,\n displayName: string,\n proportion: number,\n): MutationComparisonRow {\n return {\n mutation,\n proportions: {\n [displayName]: proportion,\n },\n };\n}\n\nfunction updateProportions(proportions: Proportions, displayName: string, proportion: number): Proportions {\n return { ...proportions, [displayName]: proportion };\n}\n","import { Grid } from 'gridjs';\nimport { type OneDArray, type TColumn, type TData } from 'gridjs/dist/src/types';\nimport { type ComponentChild } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\n\nimport 'gridjs/dist/theme/mermaid.css';\n\nexport const tableStyle = {\n table: {\n fontSize: '12px',\n },\n th: {\n padding: '4px',\n textAlign: 'center',\n },\n td: {\n textAlign: 'center',\n padding: '8px',\n },\n footer: {\n fontSize: '12px',\n },\n};\n\ninterface TableProps {\n data: TData;\n columns: OneDArray<TColumn | string | ComponentChild>;\n pageSize: number | boolean;\n}\n\nexport const Table = ({ data, columns, pageSize }: TableProps) => {\n const pagination = typeof pageSize === 'number' ? { limit: pageSize } : pageSize;\n\n const wrapper = useRef(null);\n\n useEffect(() => {\n if (wrapper.current === null) {\n return;\n }\n const grid = new Grid({\n columns,\n data,\n style: tableStyle,\n pagination,\n }).render(wrapper.current);\n\n return () => {\n grid.destroy();\n };\n });\n\n return <div ref={wrapper} />;\n};\n","import { type MutationType, type SequenceType } from '../types';\n\nexport interface Mutation {\n readonly segment: string | undefined;\n readonly position: number;\n readonly code: string;\n readonly type: MutationType;\n\n equals(other: Mutation): boolean;\n\n toString(): string;\n}\n\nexport const substitutionRegex =\n /^((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Za-z])?(?<position>\\d+)(?<substitutionValue>[A-Za-z.])?$/;\n\nexport class Substitution implements Mutation {\n readonly code;\n readonly type = 'substitution';\n\n constructor(\n readonly segment: string | undefined,\n readonly valueAtReference: string | undefined,\n readonly substitutionValue: string | undefined,\n readonly position: number,\n ) {\n const segmentString = this.segment ? `${this.segment}:` : '';\n const valueAtReferenceString = this.valueAtReference ? `${this.valueAtReference}` : '';\n const substitutionValueString = this.substitutionValue ? `${this.substitutionValue}` : '';\n this.code = `${segmentString}${valueAtReferenceString}${this.position}${substitutionValueString}`;\n }\n\n equals(other: Mutation): boolean {\n if (!(other instanceof Substitution)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.valueAtReference === other.valueAtReference &&\n this.substitutionValue === other.substitutionValue &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): Substitution | null {\n const match = mutationStr.match(substitutionRegex);\n if (match === null || match.groups === undefined) {\n return null;\n }\n return new Substitution(\n match.groups.segment,\n match.groups.valueAtReference,\n match.groups.substitutionValue,\n parseInt(match.groups.position, 10),\n );\n }\n}\n\nexport const deletionRegex = /^((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Za-z])?(?<position>\\d+)(-)$/;\n\nexport class Deletion implements Mutation {\n readonly code;\n readonly type = 'deletion';\n\n constructor(\n readonly segment: string | undefined,\n readonly valueAtReference: string | undefined,\n readonly position: number,\n ) {\n const segmentString = this.segment ? `${this.segment}:` : '';\n const valueAtReferenceString = this.valueAtReference ? `${this.valueAtReference}` : '';\n this.code = `${segmentString}${valueAtReferenceString}${this.position}-`;\n }\n\n equals(other: Mutation): boolean {\n if (!(other instanceof Deletion)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.valueAtReference === other.valueAtReference &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): Deletion | null {\n const match = mutationStr.match(deletionRegex);\n if (match === null || match.groups === undefined) {\n return null;\n }\n\n return new Deletion(match.groups.segment, match.groups.valueAtReference, parseInt(match.groups.position, 10));\n }\n}\n\nexport const insertionRegexp =\n /^ins_((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<position>\\d+):(?<insertedSymbols>(([A-Za-z?]|(\\.\\*))+))$/i;\n\nexport class Insertion implements Mutation {\n readonly code;\n readonly type = 'insertion';\n\n constructor(\n readonly segment: string | undefined,\n readonly position: number,\n readonly insertedSymbols: string,\n ) {\n this.code = `ins_${this.segment ? `${this.segment}:` : ''}${this.position}:${this.insertedSymbols}`;\n }\n\n equals(other: Mutation): boolean {\n if (!(other instanceof Insertion)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.insertedSymbols === other.insertedSymbols &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): Insertion | null {\n const match = mutationStr.match(insertionRegexp);\n if (match === null || match.groups === undefined) {\n return null;\n }\n\n return new Insertion(match.groups.segment, parseInt(match.groups.position, 10), match.groups.insertedSymbols);\n }\n}\n\nexport const bases: { [P in SequenceType]: string[] } = {\n nucleotide: ['A', 'C', 'G', 'T', '-'],\n 'amino acid': [\n 'I',\n 'L',\n 'V',\n 'F',\n 'M',\n 'C',\n 'A',\n 'G',\n 'P',\n 'T',\n 'S',\n 'Y',\n 'W',\n 'Q',\n 'N',\n 'H',\n 'E',\n 'D',\n 'K',\n 'R',\n '-',\n ],\n};\n","import { Deletion, type Substitution } from '../../../utils/mutations';\n\nexport const sortSubstitutionsAndDeletions = (a: Substitution | Deletion, b: Substitution | Deletion) => {\n if (a.segment !== b.segment) {\n compareSegments(a.segment, b.segment);\n }\n\n if (a.position !== b.position) {\n return comparePositions(a.position, b.position);\n }\n\n const aIsDeletion = a instanceof Deletion;\n const bIsDeletion = b instanceof Deletion;\n\n if (aIsDeletion !== bIsDeletion) {\n return aIsDeletion ? 1 : -1;\n }\n\n if (!aIsDeletion && !bIsDeletion) {\n if (a.substitutionValue !== b.substitutionValue) {\n return compareSubstitutionValues(a.substitutionValue, b.substitutionValue);\n }\n }\n\n return 0;\n};\n\nexport const compareSegments = (a: string | undefined, b: string | undefined) => {\n if (a === undefined) {\n return -1;\n }\n if (b === undefined) {\n return 1;\n }\n return a.localeCompare(b);\n};\n\nexport const comparePositions = (a: number, b: number) => {\n return a - b;\n};\n\nconst compareSubstitutionValues = (a: string | undefined, b: string | undefined) => {\n if (a === undefined) {\n return -1;\n }\n if (b === undefined) {\n return 1;\n }\n return a.localeCompare(b);\n};\n","export const formatProportion = (proportion: number, digits: number = 2) => {\n return `${(proportion * 100).toFixed(digits)}%`;\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getMutationComparisonTableData } from './getMutationComparisonTableData';\nimport { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { Table } from '../components/table';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsTableProps {\n data: Dataset<MutationData>;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nexport const MutationComparisonTable: FunctionComponent<MutationsTableProps> = ({\n data,\n proportionInterval,\n pageSize,\n}) => {\n const headers = [\n {\n name: 'Mutation',\n sort: {\n compare: sortSubstitutionsAndDeletions,\n },\n formatter: (cell: Substitution | Deletion) => cell.toString(),\n },\n {\n name: 'Prevalence',\n columns: data.content.map((mutationData) => {\n return {\n name: mutationData.displayName,\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n };\n }),\n },\n ];\n\n const tableData = getMutationComparisonTableData(data, proportionInterval).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={headers} pageSize={pageSize} />;\n};\n","import { Chart, type ChartConfiguration } from 'chart.js';\nimport { useEffect, useRef } from 'preact/hooks';\n\nexport interface GsChartProps {\n configuration: ChartConfiguration;\n}\n\nconst GsChart = ({ configuration }: GsChartProps) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const chartRef = useRef<Chart | null>(null);\n\n useEffect(() => {\n if (canvasRef.current === null) {\n return;\n }\n\n const ctx = canvasRef.current.getContext('2d');\n if (ctx === null) {\n return;\n }\n\n chartRef.current = new Chart(ctx, configuration);\n\n return () => {\n chartRef.current?.destroy();\n };\n }, [canvasRef, configuration]);\n\n return <canvas ref={canvasRef} />;\n};\n\nexport default GsChart;\n","import { type ActiveElement, Chart, type ChartConfiguration, type ChartEvent, registerables } from 'chart.js';\nimport { ArcSlice, extractSets, VennDiagramController } from 'chartjs-chart-venn';\nimport { type FunctionComponent } from 'preact';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\n\nimport { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport GsChart from '../components/chart';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\nChart.register(...registerables, VennDiagramController, ArcSlice);\n\nexport interface MutationComparisonVennProps {\n data: Dataset<MutationData>;\n proportionInterval: ProportionInterval;\n}\n\nexport const MutationComparisonVenn: FunctionComponent<MutationComparisonVennProps> = ({\n data,\n proportionInterval,\n}) => {\n const divRef = useRef<HTMLDivElement>(null);\n const noElementSelectedMessage = 'You have no elements selected. Click in the venn diagram to select.';\n const [selectedDatasetIndex, setSelectedDatasetIndex] = useState<null | number>(null);\n\n const sets = useMemo(\n () =>\n extractSets(\n data.content\n .map((mutationData) => ({\n displayName: mutationData.displayName,\n data: mutationData.data.filter(\n (mutationEntry) =>\n mutationEntry.proportion >= proportionInterval.min &&\n mutationEntry.proportion <= proportionInterval.max,\n ),\n }))\n .map((mutationData) => {\n return {\n label: mutationData.displayName,\n values: mutationData.data.map((mutationEntry) => mutationEntry.mutation.toString()),\n };\n }),\n ),\n [data, proportionInterval],\n );\n\n useEffect(() => {\n if (divRef.current === null) {\n return;\n }\n if (selectedDatasetIndex === null) {\n divRef.current.innerText = noElementSelectedMessage;\n return;\n }\n\n const values = sets.datasets[0].data[selectedDatasetIndex].values;\n const label = sets.datasets[0].data[selectedDatasetIndex].label;\n divRef.current!.innerText = `${label}: ${values.join(', ')}` || '';\n }, [divRef, selectedDatasetIndex, sets]);\n\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'venn',\n data: sets,\n options: {\n maintainAspectRatio: false,\n scales: {\n x: {\n ticks: {\n color: 'black',\n font: {\n size: 20,\n },\n },\n },\n y: {\n ticks: {\n color: 'blue',\n font: {\n size: 20,\n },\n },\n },\n },\n events: ['click'],\n onClick(_: ChartEvent, elements: ActiveElement[]) {\n if (elements.length === 0) {\n setSelectedDatasetIndex(null);\n }\n },\n backgroundColor: '#f5f5f5',\n animation: false,\n layout: {\n padding: 30,\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n filter: ({ dataIndex }) => {\n setSelectedDatasetIndex(dataIndex);\n return false;\n },\n },\n },\n },\n }),\n [sets],\n );\n\n if (data.content.length > 5) {\n return <div>Too many datasets to display. Maximum are five. </div>;\n }\n\n return (\n <div className='h-full flex flex-col'>\n <div className='flex-1'>\n <GsChart configuration={config} />\n </div>\n <div class='flex flex-wrap break-words m-2' ref={divRef} />\n </div>\n );\n};\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchSubstitutionsOrDeletions } from '../lapisApi/lapisApi';\nimport { type LapisFilter, type SequenceType, type SubstitutionOrDeletionEntry } from '../types';\nimport { Deletion, Substitution } from '../utils/mutations';\n\nexport class FetchSubstitutionsOrDeletionsOperator implements Operator<SubstitutionOrDeletionEntry> {\n constructor(\n private filter: LapisFilter,\n private sequenceType: SequenceType,\n private minProportion?: number,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<SubstitutionOrDeletionEntry>> {\n const mutations = await this.fetchMutations(lapis, signal);\n\n const content: SubstitutionOrDeletionEntry[] = mutations.map(\n ({ count, proportion, mutationFrom, mutationTo, position, sequenceName }) => {\n if (mutationTo === '-') {\n return {\n type: 'deletion',\n mutation: new Deletion(sequenceName ?? undefined, mutationFrom, position),\n count,\n proportion,\n };\n }\n return {\n type: 'substitution',\n mutation: new Substitution(sequenceName ?? undefined, mutationFrom, mutationTo, position),\n count,\n proportion,\n };\n },\n );\n\n return { content };\n }\n\n private async fetchMutations(lapis: string, signal?: AbortSignal) {\n const filter = {\n ...this.filter,\n minProportion: this.minProportion,\n };\n\n return fetchSubstitutionsOrDeletions(lapis, filter, this.sequenceType, signal).then(\n (response) => response.data,\n );\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class SortOperator<S> implements Operator<S> {\n constructor(\n private child: Operator<S>,\n private compareFn: (a: S, b: S) => number,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<S>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.sort(this.compareFn),\n };\n }\n}\n","import { FetchSubstitutionsOrDeletionsOperator } from '../operator/FetchSubstitutionsOrDeletionsOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter, type SequenceType } from '../types';\n\nexport function querySubstitutionsOrDeletions(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchSubstitutionsOrDeletionsOperator(lapisFilter, sequenceType, 0);\n const sortData = new SortOperator(fetchData, (a, b) => {\n if (a.mutation.segment !== b.mutation.segment) {\n return (a.mutation.segment ?? '').localeCompare(b.mutation.segment ?? '');\n }\n return a.mutation.position - b.mutation.position;\n });\n return sortData.evaluate(lapis, signal);\n}\n","import { querySubstitutionsOrDeletions } from '../../query/querySubstitutionsOrDeletions';\nimport { type NamedLapisFilter, type SubstitutionOrDeletionEntry } from '../../types';\nimport { type DisplayedSegment } from '../components/SegmentSelector';\nimport { type DisplayedMutationType } from '../components/mutation-type-selector';\n\nexport type MutationData = {\n displayName: string;\n data: SubstitutionOrDeletionEntry[];\n};\n\nexport async function queryMutationData(\n lapisFilters: NamedLapisFilter[],\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n) {\n const mutationData = await Promise.all(\n lapisFilters.map(async (filter) => {\n return {\n displayName: filter.displayName,\n data: (await querySubstitutionsOrDeletions(filter.lapisFilter, sequenceType, lapis)).content,\n };\n }),\n );\n return { mutationData };\n}\n\nexport function filterMutationData(\n data: MutationData[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n return data.map((mutationEntry) => ({\n displayName: mutationEntry.displayName,\n data: filterBySegmentAndMutationType(mutationEntry.data, displayedSegments, displayedMutationTypes),\n }));\n}\n\nexport function filterBySegmentAndMutationType(\n data: SubstitutionOrDeletionEntry[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n const byDisplayedSegments = (mutationEntry: SubstitutionOrDeletionEntry) => {\n if (mutationEntry.mutation.segment === undefined) {\n return true;\n }\n return displayedSegments.some(\n (displayedSegment) =>\n displayedSegment.segment === mutationEntry.mutation.segment && displayedSegment.checked,\n );\n };\n const byDisplayedMutationTypes = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return displayedMutationTypes.some(\n (displayedMutationType) =>\n displayedMutationType.checked && displayedMutationType.type === mutationEntry.type,\n );\n };\n\n return data.filter(byDisplayedSegments).filter(byDisplayedMutationTypes);\n}\n","import { createContext } from 'preact';\n\nexport const LapisUrlContext = createContext('');\n","import { autoUpdate, computePosition, type Middleware } from '@floating-ui/dom';\nimport type { Placement } from '@floating-ui/utils';\nimport { useEffect, useRef } from 'preact/hooks';\nimport type { MutableRefObject } from 'react';\n\nexport function useFloatingUi(\n referenceRef: MutableRefObject<HTMLElement | null>,\n floatingRef: MutableRefObject<HTMLElement | null>,\n middleware?: Array<Middleware | null | undefined | false>,\n placement?: Placement,\n) {\n const cleanupRef = useRef<Function | null>(null);\n\n useEffect(() => {\n if (!referenceRef.current || !floatingRef.current) {\n return;\n }\n\n const { current: reference } = referenceRef;\n const { current: floating } = floatingRef;\n\n const update = () => {\n computePosition(reference, floating, {\n placement,\n middleware,\n }).then(({ x, y }) => {\n floating.style.left = `${x}px`;\n floating.style.top = `${y}px`;\n });\n };\n\n update();\n cleanupRef.current = autoUpdate(reference, floating, update);\n\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current();\n }\n };\n }, [placement, middleware, referenceRef, floatingRef]);\n}\n\nexport function useCloseOnClickOutside(\n floatingRef: MutableRefObject<HTMLElement | null>,\n referenceRef: MutableRefObject<HTMLElement | null>,\n setShowContent: (value: ((prevState: boolean) => boolean) | boolean) => void,\n) {\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const path = event.composedPath();\n if (\n floatingRef.current &&\n !path.includes(floatingRef.current) &&\n referenceRef.current &&\n !path.includes(referenceRef.current)\n ) {\n setShowContent(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [floatingRef, referenceRef, setShowContent]);\n}\n\nexport function useCloseOnEsc(setShowHelp: (value: ((prevState: boolean) => boolean) | boolean) => void) {\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setShowHelp(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [setShowHelp]);\n}\n","import { flip, offset, shift } from '@floating-ui/dom';\nimport { type Placement } from '@floating-ui/utils';\nimport { type FunctionComponent } from 'preact';\nimport { useRef, useState } from 'preact/hooks';\n\nimport { useCloseOnClickOutside, useCloseOnEsc, useFloatingUi } from '../shared/floating-ui/hooks';\n\ninterface DropdownProps {\n buttonTitle: string;\n placement?: Placement;\n}\n\nexport const dropdownClass =\n 'z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200 shadow-lg rounded-md';\n\nexport const Dropdown: FunctionComponent<DropdownProps> = ({ children, buttonTitle, placement }) => {\n const [showContent, setShowContent] = useState(false);\n const referenceRef = useRef<HTMLButtonElement>(null);\n const floatingRef = useRef<HTMLDivElement>(null);\n\n useFloatingUi(referenceRef, floatingRef, [offset(4), shift(), flip()], placement);\n\n useCloseOnClickOutside(floatingRef, referenceRef, setShowContent);\n useCloseOnEsc(setShowContent);\n\n const toggle = () => {\n setShowContent(!showContent);\n };\n\n return (\n <div>\n <button type='button' className='btn btn-xs whitespace-nowrap' onClick={toggle} ref={referenceRef}>\n {buttonTitle}\n </button>\n <div ref={floatingRef} className={`${dropdownClass} ${showContent ? '' : 'hidden'}`}>\n {children}\n </div>\n </div>\n );\n};\n","import { Dropdown } from './dropdown';\n\nexport type CheckboxItem = {\n label: string;\n checked: boolean;\n};\n\nexport interface CheckboxSelectorProps<Item extends CheckboxItem = CheckboxItem> {\n items: Item[];\n label: string;\n setItems: (items: Item[]) => void;\n}\n\nexport const CheckboxSelector = <Item extends CheckboxItem>({\n items,\n label,\n setItems,\n}: CheckboxSelectorProps<Item>) => {\n return (\n <Dropdown buttonTitle={label} placement={'bottom-start'}>\n <ul>\n {items.map((item, index) => (\n <li className='flex flex-row items-center' key={item.label}>\n <label>\n <input\n className={'mr-2'}\n type='checkbox'\n id={`item-${index}`}\n checked={item.checked}\n onChange={() => {\n const newItems = items.map((item, i) =>\n i === index ? { ...item, checked: !item.checked } : item,\n );\n setItems(newItems);\n }}\n />\n {item.label}\n </label>\n </li>\n ))}\n </ul>\n </Dropdown>\n );\n};\n","import { createContext } from 'preact';\n\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\n\nexport const ReferenceGenomeContext = createContext<ReferenceGenome>({ nucleotideSequences: [], genes: [] });\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport { type CheckboxItem, CheckboxSelector } from './checkbox-selector';\nimport { getSegmentNames } from '../../lapisApi/ReferenceGenome';\nimport { type SequenceType } from '../../types';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\n\nexport type DisplayedSegment = CheckboxItem & {\n segment: string;\n};\n\nexport type SegmentSelectorProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (items: DisplayedSegment[]) => void;\n prefix?: string;\n};\n\nconst getSegmentSelectorLabel = (displayedSegments: DisplayedSegment[], prefix: string) => {\n const allSelectedSelected = displayedSegments\n .filter((segment) => segment.checked)\n .map((segment) => segment.segment);\n\n if (allSelectedSelected.length === 0) {\n return `${prefix}none`;\n }\n if (displayedSegments.length === allSelectedSelected.length) {\n return `${prefix}all`;\n }\n return prefix + allSelectedSelected.join(', ');\n};\n\nexport const SegmentSelector: FunctionComponent<SegmentSelectorProps> = ({\n displayedSegments,\n setDisplayedSegments,\n prefix,\n}) => {\n if (displayedSegments.length <= 1) {\n return null;\n }\n\n return (\n <CheckboxSelector\n items={displayedSegments}\n label={getSegmentSelectorLabel(displayedSegments, prefix || 'Segments: ')}\n setItems={(items) => setDisplayedSegments(items)}\n />\n );\n};\n\nexport function useDisplayedSegments(sequenceType: SequenceType) {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const displayedSegments = getSegmentNames(referenceGenome, sequenceType).map((segment) => ({\n segment,\n label: segment,\n checked: true,\n }));\n\n return useState<DisplayedSegment[]>(displayedSegments);\n}\n","import { type FunctionComponent } from 'preact';\n\ntype ToStringable = {\n toString: () => string;\n};\n\ntype DataValue = string | number | boolean | null | ToStringable;\n\nexport interface CsvDownloadButtonProps {\n label?: string;\n filename?: string;\n getData: () => Record<string, DataValue>[];\n className?: string;\n}\n\nexport const CsvDownloadButton: FunctionComponent<CsvDownloadButtonProps> = ({\n label = 'Download',\n filename = 'data.csv',\n getData,\n className,\n}) => {\n const download = () => {\n const content = getDownloadContent();\n const blob = new Blob([content], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n const getDownloadContent = () => {\n const data = getData();\n const keys = getDataKeys(data);\n const header = `${keys.join(',')}\\n`;\n const rows = data.map((row) => keys.map((key) => row[key]).join(',')).join('\\n');\n return header + rows;\n };\n\n const getDataKeys = (data: Record<string, DataValue>[]) => {\n const keysSet = data\n .map((row) => Object.keys(row))\n .reduce((accumulatedKeys, keys) => {\n keys.forEach((key) => accumulatedKeys.add(key));\n return accumulatedKeys;\n }, new Set<string>());\n\n return [...keysSet];\n };\n\n return (\n <button className={className} onClick={download}>\n {label}\n </button>\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useRef } from 'preact/hooks';\n\nexport class UserFacingError extends Error {\n constructor(\n public readonly headline: string,\n message: string,\n ) {\n super(message);\n this.name = 'UserFacingError';\n }\n}\n\nexport const ErrorDisplay: FunctionComponent<{ error: Error }> = ({ error }) => {\n console.error(error);\n\n const ref = useRef<HTMLDialogElement>(null);\n\n return (\n <div className='h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center flex-col'>\n <div className='text-red-700 font-bold'>Error</div>\n <div>\n Oops! Something went wrong.\n {error instanceof UserFacingError && (\n <>\n {' '}\n <button\n className='text-sm text-gray-600 hover:text-gray-300'\n onClick={() => ref.current?.showModal()}\n >\n Show details.\n </button>\n <dialog ref={ref} class='modal'>\n <div class='modal-box'>\n <form method='dialog'>\n <button className='btn btn-sm btn-circle btn-ghost absolute right-2 top-2'>\n ✕\n </button>\n </form>\n <h1 class='text-lg'>{error.headline}</h1>\n <p class='py-4'>{error.message}</p>\n </div>\n <form method='dialog' class='modal-backdrop'>\n <button>close</button>\n </form>\n </dialog>\n </>\n )}\n </div>\n </div>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nexport type Size = {\n width: string;\n height: string;\n};\n\nexport interface ResizeContainerProps {\n size: Size;\n}\n\nexport const ResizeContainer: FunctionComponent<ResizeContainerProps> = ({ children, size }) => {\n return <div style={size}>{children}</div>;\n};\n","import type { FunctionComponent } from 'preact';\nimport { useErrorBoundary } from 'preact/hooks';\n\nimport { ErrorDisplay } from './error-display';\nimport { ResizeContainer, type Size } from './resize-container';\n\nexport const ErrorBoundary: FunctionComponent<{ size: Size }> = ({ size, children }) => {\n const [internalError] = useErrorBoundary();\n\n if (internalError) {\n return (\n <ResizeContainer size={size}>\n <ErrorDisplay error={internalError} />\n </ResizeContainer>\n );\n }\n\n return <>{children}</>;\n};\n","import { offset, shift, size } from '@floating-ui/dom';\nimport { type FunctionComponent } from 'preact';\nimport { useRef, useState } from 'preact/hooks';\n\nimport { dropdownClass } from './dropdown';\nimport { useCloseOnClickOutside, useCloseOnEsc, useFloatingUi } from '../shared/floating-ui/hooks';\n\nexport interface InfoProps {\n height?: string;\n}\n\nconst Info: FunctionComponent<InfoProps> = ({ children, height }) => {\n const [showHelp, setShowHelp] = useState(false);\n const referenceRef = useRef<HTMLButtonElement>(null);\n const floatingRef = useRef<HTMLDivElement>(null);\n\n useFloatingUi(referenceRef, floatingRef, [\n offset(10),\n shift(),\n size({\n apply() {\n if (!floatingRef.current) {\n return;\n }\n floatingRef.current.style.width = '100vw';\n floatingRef.current.style.height = height ? height : '50vh';\n },\n }),\n ]);\n\n const toggleHelp = () => {\n setShowHelp(!showHelp);\n };\n\n useCloseOnEsc(setShowHelp);\n useCloseOnClickOutside(floatingRef, referenceRef, setShowHelp);\n\n return (\n <div className='relative'>\n <button type='button' className='btn btn-xs' onClick={toggleHelp} ref={referenceRef}>\n ?\n </button>\n <div\n ref={floatingRef}\n className={`${dropdownClass} overflow-y-auto opacity-90 ${showHelp ? '' : 'hidden'}`}\n >\n <div className={'flex flex-col'}>{children}</div>\n <button\n onClick={() => setShowHelp(false)}\n className={'float-right underline text-sm hover:text-blue-700 mr-2'}\n >\n Close\n </button>\n </div>\n </div>\n );\n};\n\nexport const InfoHeadline1: FunctionComponent = ({ children }) => {\n return <h1 className='text-lg font-bold'>{children}</h1>;\n};\n\nexport const InfoHeadline2: FunctionComponent = ({ children }) => {\n return <h2 className='text-base font-bold mt-4'>{children}</h2>;\n};\n\nexport const InfoParagraph: FunctionComponent = ({ children }) => {\n return <p className='text-justify my-1'>{children}</p>;\n};\n\nexport const InfoLink: FunctionComponent<{ href: string }> = ({ children, href }) => {\n return (\n <a className='text-blue-600 hover:text-blue-800' href={href} target='_blank' rel='noopener noreferrer'>\n {children}\n </a>\n );\n};\n\nexport default Info;\n","import { type FunctionComponent } from 'preact';\n\nexport const LoadingDisplay: FunctionComponent = () => {\n return <div aria-label={'Loading'} className='h-full w-full skeleton' />;\n};\n","import { type FunctionComponent } from 'preact/compat';\n\nimport { type CheckboxItem, CheckboxSelector } from './checkbox-selector';\nimport type { SubstitutionOrDeletion } from '../../types';\n\nexport type DisplayedMutationType = CheckboxItem & {\n type: SubstitutionOrDeletion;\n};\n\nexport type MutationTypeSelectorProps = {\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (mutationTypes: DisplayedMutationType[]) => void;\n};\n\nexport const MutationTypeSelector: FunctionComponent<MutationTypeSelectorProps> = ({\n displayedMutationTypes,\n setDisplayedMutationTypes,\n}) => {\n const checkedLabels = displayedMutationTypes.filter((type) => type.checked).map((type) => type.label);\n const mutationTypesSelectorLabel = `Types: ${checkedLabels.length > 0 ? checkedLabels.join(', ') : 'None'}`;\n\n return (\n <CheckboxSelector\n items={displayedMutationTypes}\n label={mutationTypesSelectorLabel}\n setItems={(items) => setDisplayedMutationTypes(items)}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nexport const NoDataDisplay: FunctionComponent = () => {\n return (\n <div className='h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center'>\n <div>No data available.</div>\n </div>\n );\n};\n","import { type FunctionComponent, type JSX } from 'preact';\nimport { useState } from 'preact/hooks';\n\nimport './min-max-percent-slider.css';\n\nexport interface MinMaxPercentSliderProps {\n min: number;\n max: number;\n setMin: (min: number) => void;\n setMax: (max: number) => void;\n rangeMin?: number;\n rangeMax?: number;\n step?: number;\n}\n\nexport const MinMaxRangeSlider: FunctionComponent<MinMaxPercentSliderProps> = ({\n min,\n max,\n setMin,\n setMax,\n rangeMin = 0,\n rangeMax = 100,\n step = 0.1,\n}) => {\n const sliderColor = '#C6C6C6';\n const rangeColor = '#387bbe';\n\n const [zIndexTo, setZIndexTo] = useState(0);\n\n const onMinChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const minValue = Number(input.value);\n\n if (minValue > max) {\n setMax(minValue);\n setMin(minValue);\n } else {\n setMin(minValue);\n }\n };\n\n const onMaxChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const maxValue = Number(input.value);\n\n if (maxValue <= 0) {\n setZIndexTo(2);\n } else {\n setZIndexTo(0);\n }\n\n if (maxValue < min) {\n setMin(maxValue);\n setMax(maxValue);\n } else {\n setMax(maxValue);\n }\n };\n\n const background = `\n linear-gradient(\n to right,\n ${sliderColor} 0%,\n ${sliderColor} ${min}%,\n ${rangeColor} ${min}%,\n ${rangeColor} ${max}%,\n ${sliderColor} ${max}%,\n ${sliderColor} 100%)\n `;\n\n return (\n <div class='my-4 relative'>\n <input\n id='fromSlider'\n type='range'\n value={min}\n onInput={onMinChange}\n min={rangeMin}\n max={rangeMax}\n step={step}\n style={{ background, zIndex: 1, height: 0 }}\n />\n <input\n id='toSlider'\n type='range'\n value={max}\n min={rangeMin}\n max={rangeMax}\n step={step}\n onInput={onMaxChange}\n style={{ background, zIndex: zIndexTo }}\n />\n </div>\n );\n};\n","import { type FunctionComponent, type JSX } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\n\nexport type PercentInputProps = {\n percentage: number;\n setPercentage: (percentage: number) => void;\n};\n\nconst percentageInRange = (percentage: number) => {\n return percentage <= 100 && percentage >= 0;\n};\n\nexport const PercentInput: FunctionComponent<PercentInputProps> = ({ percentage, setPercentage }) => {\n const [internalPercentage, setInternalPercentage] = useState(percentage);\n\n useEffect(() => {\n setInternalPercentage(percentage);\n }, [percentage]);\n\n const handleInputChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const value = Number(input.value);\n\n const inRange = percentageInRange(value);\n\n if (inRange) {\n setPercentage(value);\n }\n setInternalPercentage(value);\n };\n\n const isError = !percentageInRange(internalPercentage);\n return (\n <label className={`input input-bordered flex items-center gap-2 w-32 ${isError ? 'input-error' : ''}`}>\n <input\n type='number'\n step={0.1}\n min={0}\n max={100}\n value={internalPercentage}\n onInput={handleInputChange}\n lang='en'\n className={`grow w-16`}\n />\n %\n </label>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { MinMaxRangeSlider } from './min-max-range-slider';\nimport { PercentInput } from './percent-intput';\n\nexport type ProportionInterval = { min: number; max: number };\n\nexport interface ProportionSelectorProps {\n proportionInterval: ProportionInterval;\n setMinProportion: (minProportion: number) => void;\n setMaxProportion: (maxProportion: number) => void;\n}\n\nexport const ProportionSelector: FunctionComponent<ProportionSelectorProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n}) => {\n const { min: minProportion, max: maxProportion } = proportionInterval;\n return (\n <div class='flex flex-col w-64 mb-2'>\n <div class='flex items-center '>\n <PercentInput\n percentage={minProportion * 100}\n setPercentage={(percentage) => setMinProportion(percentage / 100)}\n />\n <div class='m-2'>-</div>\n <PercentInput\n percentage={maxProportion * 100}\n setPercentage={(percentage) => setMaxProportion(percentage / 100)}\n />\n </div>\n <div class='my-1'>\n <MinMaxRangeSlider\n min={minProportion * 100}\n max={maxProportion * 100}\n setMin={(percentage) => setMinProportion(percentage / 100)}\n setMax={(percentage) => setMaxProportion(percentage / 100)}\n />\n </div>\n </div>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Dropdown } from './dropdown';\nimport { ProportionSelector, type ProportionSelectorProps } from './proportion-selector';\n\nexport type ProportionSelectorDropdownProps = ProportionSelectorProps;\n\nexport const ProportionSelectorDropdown: FunctionComponent<ProportionSelectorDropdownProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n}) => {\n const label = `${(proportionInterval.min * 100).toFixed(1)}% - ${(proportionInterval.max * 100).toFixed(1)}%`;\n\n return (\n <Dropdown buttonTitle={`Proportion ${label}`} placement={'bottom-start'}>\n <ProportionSelector\n proportionInterval={proportionInterval}\n setMinProportion={setMinProportion}\n setMaxProportion={setMaxProportion}\n />\n </Dropdown>\n );\n};\n","import { Fragment, type FunctionComponent } from 'preact';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { type JSXInternal } from 'preact/src/jsx';\n\ntype Tab = {\n title: string;\n content: JSXInternal.Element;\n};\n\ninterface ComponentTabsProps {\n tabs: Tab[];\n toolbar?: JSXInternal.Element | ((activeTab: string) => JSXInternal.Element);\n}\n\nconst Tabs: FunctionComponent<ComponentTabsProps> = ({ tabs, toolbar }) => {\n const [activeTab, setActiveTab] = useState(tabs[0].title);\n const [heightOfTabs, setHeightOfTabs] = useState('3rem');\n const tabRef = useRef<HTMLDivElement>(null);\n\n const updateHeightOfTabs = () => {\n if (tabRef.current) {\n const heightOfTabs = tabRef.current.getBoundingClientRect().height;\n setHeightOfTabs(`${heightOfTabs}px`);\n }\n };\n\n useEffect(() => {\n updateHeightOfTabs();\n\n window.addEventListener('resize', updateHeightOfTabs);\n return () => {\n window.removeEventListener('resize', updateHeightOfTabs);\n };\n }, []);\n\n const tabElements = (\n <div className='flex flex-row'>\n {tabs.map((tab) => {\n return (\n <Fragment key={tab.title}>\n <button\n className={`px-4 py-2 text-sm font-medium leading-5 transition-colors duration-150 ${\n activeTab === tab.title\n ? 'border-b-2 border-gray-400'\n : 'text-gray-600 hover:bg-gray-100 hover:text-gray-700'\n }`}\n onClick={() => {\n setActiveTab(tab.title);\n }}\n >\n {tab.title}\n </button>\n </Fragment>\n );\n })}\n </div>\n );\n\n const toolbarElement = typeof toolbar === 'function' ? toolbar(activeTab) : toolbar;\n\n return (\n <div className='h-full w-full'>\n <div ref={tabRef} className='flex flex-row justify-between flex-wrap'>\n {tabElements}\n {toolbar && <div className='py-2 flex flex-wrap gap-y-1'>{toolbarElement}</div>}\n </div>\n <div\n className={`p-2 border-2 border-gray-100 rounded-b-md rounded-tr-md ${activeTab === tabs[0].title ? '' : 'rounded-tl-md'}`}\n style={{ height: `calc(100% - ${heightOfTabs})` }}\n >\n {tabs.map((tab) => (\n <div className='h-full overflow-auto' key={tab.title} hidden={activeTab !== tab.title}>\n {tab.content}\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nexport default Tabs;\n","import { useEffect, useState } from 'preact/hooks';\n\nexport function useQuery<Data>(fetchDataCallback: () => Promise<Data>, dependencies: unknown[] = []) {\n const [data, setData] = useState<Data | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const fetchData = async () => {\n setIsLoading(true);\n try {\n const result = await fetchDataCallback();\n setData(result);\n setError(null);\n } catch (error) {\n setError(error as Error);\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(dependencies)]);\n\n return { data, error, isLoading };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useMemo, useState } from 'preact/hooks';\n\nimport { getMutationComparisonTableData } from './getMutationComparisonTableData';\nimport { MutationComparisonTable } from './mutation-comparison-table';\nimport { MutationComparisonVenn } from './mutation-comparison-venn';\nimport { filterMutationData, type MutationData, queryMutationData } from './queryMutationData';\nimport { type NamedLapisFilter, type SequenceType } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/SegmentSelector';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'table' | 'venn';\n\nexport interface MutationComparisonProps extends MutationComparisonInnerProps {\n width: string;\n height: string;\n}\n\nexport interface MutationComparisonInnerProps {\n lapisFilters: NamedLapisFilter[];\n sequenceType: SequenceType;\n views: View[];\n pageSize: boolean | number;\n}\n\nexport const MutationComparison: FunctionComponent<MutationComparisonProps> = ({ width, height, ...innerProps }) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <MutationComparisonInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationComparisonInner: FunctionComponent<MutationComparisonInnerProps> = ({\n lapisFilters,\n sequenceType,\n views,\n pageSize,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationData(lapisFilters, sequenceType, lapis);\n }, [lapisFilters, sequenceType, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return (\n <MutationComparisonTabs\n data={data.mutationData}\n sequenceType={sequenceType}\n views={views}\n pageSize={pageSize}\n />\n );\n};\n\ntype MutationComparisonTabsProps = {\n data: MutationData[];\n views: View[];\n sequenceType: SequenceType;\n pageSize: boolean | number;\n};\n\nconst MutationComparisonTabs: FunctionComponent<MutationComparisonTabsProps> = ({\n data,\n views,\n sequenceType,\n pageSize,\n}) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.5, max: 1 });\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(sequenceType);\n\n const filteredData = useMemo(\n () => filterMutationData(data, displayedSegments, displayedMutationTypes),\n [data, displayedSegments, displayedMutationTypes],\n );\n\n const getTab = (view: View) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <MutationComparisonTable\n data={{ content: filteredData }}\n proportionInterval={proportionInterval}\n pageSize={pageSize}\n />\n ),\n };\n case 'venn':\n return {\n title: 'Venn',\n content: (\n <MutationComparisonVenn\n data={{ content: filteredData }}\n proportionInterval={proportionInterval}\n />\n ),\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n return (\n <Tabs\n tabs={tabs}\n toolbar={\n <Toolbar\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n filteredData={filteredData}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n />\n }\n />\n );\n};\n\ntype ToolbarProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n filteredData: MutationData[];\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n filteredData,\n proportionInterval,\n setProportionInterval,\n}) => {\n return (\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getMutationComparisonTableData({ content: filteredData }, proportionInterval)}\n filename='mutation_comparison.csv'\n />\n <Info height={'100px'}>Info for mutation comparison</Info>\n </>\n );\n};\n","import { consume } from '@lit/context';\nimport { type PropertyValues, ReactiveElement } from '@lit/reactive-element';\nimport { unsafeCSS } from 'lit';\nimport { render } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nimport { lapisContext } from './lapis-context';\nimport { referenceGenomeContext } from './reference-genome-context';\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\nimport { LapisUrlContext } from '../preact/LapisUrlContext';\nimport { ReferenceGenomeContext } from '../preact/ReferenceGenomeContext';\nimport minMaxPercentSliderCss from '../preact/components/min-max-percent-slider.css?inline';\nimport tailwindStyle from '../styles/tailwind.css?inline';\n\nimport '../styles/tailwind.css';\nimport '../preact/components/min-max-percent-slider.css';\n\nconst tailwindElementCss = unsafeCSS(tailwindStyle);\nconst minMaxPercentSliderElementCss = unsafeCSS(minMaxPercentSliderCss);\n\nexport abstract class PreactLitAdapter extends ReactiveElement {\n static override styles = [tailwindElementCss, minMaxPercentSliderElementCss];\n\n /**\n * @internal\n * The URL of the Lapis instance.\n *\n * This component must be a child of a `gs-app` component.\n * This value will automatically be injected by the parent `gs-app` component.\n */\n @consume({ context: lapisContext })\n lapis: string = '';\n\n /**\n * @internal\n * The reference genomes of the underlying organism.\n * These will be fetched from the Lapis instance.\n *\n * This component must be a child of a `gs-app` component.\n * This value will automatically be injected by the parent `gs-app` component.\n */\n @consume({ context: referenceGenomeContext, subscribe: true })\n referenceGenome: ReferenceGenome = {\n nucleotideSequences: [],\n genes: [],\n };\n\n override update(changedProperties: PropertyValues) {\n const vdom = (\n <LapisUrlContext.Provider value={this.lapis}>\n <ReferenceGenomeContext.Provider value={this.referenceGenome}>\n {this.render()}\n </ReferenceGenomeContext.Provider>\n </LapisUrlContext.Provider>\n );\n super.update(changedProperties);\n render(vdom, this.renderRoot);\n }\n\n protected abstract render(): JSXInternal.Element;\n}\n","import gridJsStyle from 'gridjs/dist/theme/mermaid.css?inline';\nimport { unsafeCSS } from 'lit';\n\nimport { PreactLitAdapter } from './PreactLitAdapter';\n\nimport 'gridjs/dist/theme/mermaid.css';\n\nconst gridJsElementCss = unsafeCSS(gridJsStyle);\n\nexport abstract class PreactLitAdapterWithGridJsStyles extends PreactLitAdapter {\n static override styles = [...PreactLitAdapter.styles, gridJsElementCss];\n}\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { MutationComparison, type MutationComparisonProps } from '../../preact/mutationComparison/mutation-comparison';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component allows to compare mutations between two different datasets.\n * The datasets are selected by LAPIS filters.\n *\n * It only shows substitutions and deletions, it does not show insertions.\n *\n * ## Views\n *\n * ### Table View\n *\n * The table view shows mutations and the proportions with which the mutation occurs in the respective data subsets.\n * It only shows mutations that are present in at least one of the data subsets\n * and where the proportion is within the selected proportion interval for at least one data subset.\n *\n * ### Venn View\n *\n * The Venn view shows the overlap of mutations between the datasets in a Venn diagram.\n * A dataset is considered to have a certain mutation, if the proportion of the mutation in the dataset is within the\n * selected proportion interval.\n * Thus, changing the proportion interval may change a mutations from being \"common\" between the datasets\n * to being \"for one dataset only\".\n */\n@customElement('gs-mutation-comparison')\nexport class MutationComparisonComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * An array of LAPIS filters to select the data to compare.\n *\n * The `lapisFilter` will be sent as is to LAPIS to filter the mutation data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used as the label for the filtered dataset in the views.\n * It should be human-readable.\n */\n @property({ type: Array })\n lapisFilters: {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }[] = [];\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('table' | 'venn')[] = ['table'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <MutationComparison\n lapisFilters={this.lapisFilters}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutation-comparison-component': MutationComparisonComponent;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFiltersMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.lapisFilters, MutationComparisonProps['lapisFilters']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.sequenceType, MutationComparisonProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.views, MutationComparisonProps['views']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type InsertionEntry } from '../../types';\n\nexport function getInsertionsTableData(data: InsertionEntry[]) {\n return data.map((mutationEntry) => {\n return {\n insertion: mutationEntry.mutation,\n count: mutationEntry.count,\n };\n });\n}\n","import { type SubstitutionOrDeletionEntry } from '../../types';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\nexport function getMutationsTableData(data: SubstitutionOrDeletionEntry[], proportionInterval: ProportionInterval) {\n const byProportion = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return mutationEntry.proportion >= proportionInterval.min && mutationEntry.proportion <= proportionInterval.max;\n };\n\n return data.filter(byProportion).map((mutationEntry) => {\n return {\n mutation: mutationEntry.mutation,\n type: mutationEntry.type,\n count: mutationEntry.count,\n proportion: mutationEntry.proportion,\n };\n });\n}\n","const pattern = /(?:([A-Za-z0-9]+):)?(\\d+)$/;\n\nexport const sortMutationPositions = (a: string, b: string) => {\n const aMatch = a.match(pattern);\n const bMatch = b.match(pattern);\n\n if (aMatch && bMatch) {\n if (aMatch[1] !== bMatch[1]) {\n return aMatch[1].localeCompare(bMatch[1]);\n }\n return parseInt(aMatch[2], 10) - parseInt(bMatch[2], 10);\n }\n throw new Error(`Invalid mutation position: ${a} or ${b}`);\n};\n","import { type BaseCell } from './mutations-grid';\nimport type { SequenceType, SubstitutionOrDeletionEntry } from '../../types';\nimport { bases } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { sortMutationPositions } from '../shared/sort/sortMutationPositions';\n\nexport const getMutationsGridData = (\n data: SubstitutionOrDeletionEntry[],\n sequenceType: SequenceType,\n proportionInterval: ProportionInterval,\n) => {\n return accumulateByPosition(data, sequenceType).filter((row) => byProportion(row, proportionInterval));\n};\n\nconst accumulateByPosition = (data: SubstitutionOrDeletionEntry[], sequenceType: SequenceType) => {\n const basesOfView = bases[sequenceType];\n const positionsToProportionAtBase = new Map<string, Map<string | undefined, number>>();\n const referenceBases = new Map<string, string | undefined>();\n\n for (const mutationEntry of data) {\n const position =\n (mutationEntry.mutation.segment ? `${mutationEntry.mutation.segment}:` : '') +\n mutationEntry.mutation.position;\n referenceBases.set(position, mutationEntry.mutation.valueAtReference);\n\n const initiallyFillPositionsToProportionAtBase = () => {\n if (!positionsToProportionAtBase.has(position)) {\n const empty = new Map();\n basesOfView.forEach((base) => empty.set(base, 0));\n empty.set(mutationEntry.mutation.valueAtReference, 1);\n positionsToProportionAtBase.set(position, empty);\n }\n };\n initiallyFillPositionsToProportionAtBase();\n\n const substitutionValue =\n mutationEntry.type === 'substitution' ? mutationEntry.mutation.substitutionValue : '-';\n\n const subtractSubstitutionValue = () => {\n const proportionAtBase = positionsToProportionAtBase.get(position)!;\n proportionAtBase.set(substitutionValue, mutationEntry.proportion);\n proportionAtBase.set(\n mutationEntry.mutation.valueAtReference,\n proportionAtBase.get(mutationEntry.mutation.valueAtReference)! - mutationEntry.proportion,\n );\n };\n subtractSubstitutionValue();\n }\n const orderedPositionsToProportionAtBase = [...positionsToProportionAtBase.entries()]\n .map(([position, proportionsAtBase]) => ({ position, proportions: proportionsAtBase }))\n .sort((a, b) => {\n return sortMutationPositions(a.position, b.position);\n });\n\n return orderedPositionsToProportionAtBase.map((proportionsForBaseAtPosition) => {\n const proportions = bases[sequenceType].map((base) => {\n return {\n [base]: {\n proportion: proportionsForBaseAtPosition.proportions.get(base)!,\n isReference: base === referenceBases.get(proportionsForBaseAtPosition.position),\n },\n };\n });\n\n return {\n position: proportionsForBaseAtPosition.position,\n ...proportions.reduce((acc, curr) => ({ ...acc, ...curr }), {}),\n } as MutationsGridDataRow;\n });\n};\n\nexport type BasesData = {\n [base: string]: BaseCell;\n};\nexport type MutationsGridDataRow = BasesData & { position: string };\n\nconst byProportion = (row: MutationsGridDataRow, proportionInterval: ProportionInterval) => {\n const numbersAndIsReference = Object.values(row).filter(\n (\n cell,\n ): cell is {\n proportion: number;\n isReference: boolean;\n } => typeof cell === 'object',\n );\n\n return numbersAndIsReference.some((cell) => {\n return (\n !cell.isReference && cell.proportion >= proportionInterval.min && cell.proportion <= proportionInterval.max\n );\n });\n};\n","import { type Row } from 'gridjs';\nimport { type FunctionComponent } from 'preact';\n\nimport { getMutationsGridData } from './getMutationsGridData';\nimport { type SequenceType, type SubstitutionOrDeletionEntry } from '../../types';\nimport { bases } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { Table, tableStyle } from '../components/table';\nimport { sortMutationPositions } from '../shared/sort/sortMutationPositions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface MutationsGridProps {\n data: SubstitutionOrDeletionEntry[];\n sequenceType: SequenceType;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nexport type BaseCell = {\n proportion: number;\n isReference: boolean;\n};\n\nexport const MutationsGrid: FunctionComponent<MutationsGridProps> = ({\n data,\n sequenceType,\n proportionInterval,\n pageSize,\n}) => {\n const getHeaders = () => {\n return [\n {\n name: 'Position',\n sort: {\n compare: (a: string, b: string) => {\n return sortMutationPositions(a, b);\n },\n },\n },\n ...getBasesHeaders(),\n ];\n };\n\n const getBasesHeaders = () => {\n return bases[sequenceType].map((base) => {\n return {\n name: base,\n sort: {\n compare: (a: BaseCell, b: BaseCell) => {\n const aProportion = a.proportion;\n const bProportion = b.proportion;\n if (aProportion < bProportion) {\n return -1;\n }\n if (aProportion > bProportion) {\n return 1;\n }\n\n return 0;\n },\n },\n formatter: (cell: BaseCell) => formatProportion(cell.proportion),\n attributes: (cell: BaseCell, row: Row) => {\n // grid-js: the cell and row are null for header cells\n if (row === null) {\n return {};\n }\n\n return styleCells(cell);\n },\n };\n });\n };\n\n const styleCells = (cell: BaseCell) => {\n if (cell.isReference || cell.proportion < 0.0001) {\n return {\n style: {\n ...tableStyle.td,\n color: 'gray',\n },\n };\n }\n return {};\n };\n\n const tableData = getMutationsGridData(data, sequenceType, proportionInterval).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n","import { comparePositions, compareSegments } from './sortSubstitutionsAndDeletions';\nimport { type Insertion } from '../../../utils/mutations';\n\nexport const sortInsertions = (a: Insertion, b: Insertion) => {\n if (a.segment !== b.segment) {\n return compareSegments(a.segment, b.segment);\n }\n\n if (a.position !== b.position) {\n return comparePositions(a.position, b.position);\n }\n\n return a.insertedSymbols.localeCompare(b.insertedSymbols);\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getInsertionsTableData } from './getInsertionsTableData';\nimport { type InsertionEntry } from '../../types';\nimport { type Insertion } from '../../utils/mutations';\nimport { Table } from '../components/table';\nimport { sortInsertions } from '../shared/sort/sortInsertions';\n\nexport interface InsertionsTableProps {\n data: InsertionEntry[];\n pageSize: boolean | number;\n}\n\nexport const InsertionsTable: FunctionComponent<InsertionsTableProps> = ({ data, pageSize }) => {\n const getHeaders = () => {\n return [\n {\n name: 'Insertion',\n sort: {\n compare: (a: Insertion, b: Insertion) => {\n return sortInsertions(a, b);\n },\n },\n formatter: (cell: Insertion) => cell.toString(),\n },\n {\n name: 'Count',\n sort: true,\n },\n ];\n };\n\n const tableData = getInsertionsTableData(data).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getMutationsTableData } from './getMutationsTableData';\nimport { type SubstitutionOrDeletionEntry } from '../../types';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { Table } from '../components/table';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsTableProps {\n data: SubstitutionOrDeletionEntry[];\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nconst MutationsTable: FunctionComponent<MutationsTableProps> = ({ data, proportionInterval, pageSize }) => {\n const getHeaders = () => {\n return [\n {\n name: 'Mutation',\n sort: {\n compare: (a: Substitution | Deletion, b: Substitution | Deletion) => {\n return sortSubstitutionsAndDeletions(a, b);\n },\n },\n formatter: (cell: Substitution | Deletion) => cell.toString(),\n },\n {\n name: 'Type',\n sort: true,\n },\n {\n name: 'Count',\n sort: true,\n },\n {\n name: 'Proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ];\n };\n\n const tableData = getMutationsTableData(data, proportionInterval).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n\nexport default MutationsTable;\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchInsertions } from '../lapisApi/lapisApi';\nimport { type InsertionEntry, type LapisFilter, type SequenceType } from '../types';\nimport { Insertion } from '../utils/mutations';\n\nexport class FetchInsertionsOperator implements Operator<InsertionEntry> {\n constructor(\n private filter: LapisFilter,\n private sequenceType: SequenceType,\n ) {}\n\n async evaluate(lapisUrl: string, signal?: AbortSignal): Promise<Dataset<InsertionEntry>> {\n const insertions = (await fetchInsertions(lapisUrl, this.filter, this.sequenceType, signal)).data;\n\n const content: InsertionEntry[] = insertions.map(({ count, insertedSymbols, sequenceName, position }) => ({\n type: 'insertion',\n mutation: new Insertion(sequenceName ?? undefined, position, insertedSymbols),\n count,\n }));\n\n return { content };\n }\n}\n","import { FetchInsertionsOperator } from '../operator/FetchInsertionsOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter, type SequenceType } from '../types';\n\nexport function queryInsertions(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchInsertionsOperator(lapisFilter, sequenceType);\n const sortData = new SortOperator(fetchData, (a, b) => {\n if (a.mutation.segment !== b.mutation.segment) {\n return (a.mutation.segment ?? '').localeCompare(b.mutation.segment ?? '');\n }\n return a.mutation.position - b.mutation.position;\n });\n return sortData.evaluate(lapis, signal);\n}\n","import { queryInsertions } from '../../query/queryInsertions';\nimport { querySubstitutionsOrDeletions } from '../../query/querySubstitutionsOrDeletions';\nimport {\n type InsertionEntry,\n type LapisFilter,\n type MutationEntry,\n type SubstitutionOrDeletionEntry,\n} from '../../types';\nimport { type DisplayedSegment } from '../components/SegmentSelector';\nimport { type DisplayedMutationType } from '../components/mutation-type-selector';\n\nexport async function queryMutationsData(\n lapisFilter: LapisFilter,\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n) {\n const substitutionsOrDeletions = (await querySubstitutionsOrDeletions(lapisFilter, sequenceType, lapis)).content;\n const insertions = (await queryInsertions(lapisFilter, sequenceType, lapis)).content;\n\n return {\n substitutionsOrDeletions,\n insertions,\n };\n}\n\nexport function filterMutationsData(\n data: { insertions: InsertionEntry[]; substitutionsOrDeletions: SubstitutionOrDeletionEntry[] },\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n function bySelectedSegments(mutationEntry: MutationEntry) {\n if (mutationEntry.mutation.segment === undefined) {\n return true;\n }\n return displayedSegments.some(\n (displayedSegment) =>\n displayedSegment.segment === mutationEntry.mutation.segment && displayedSegment.checked,\n );\n }\n\n const byDisplayedMutationTypes = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return displayedMutationTypes.some(\n (displayedMutationType) =>\n displayedMutationType.checked && displayedMutationType.type === mutationEntry.type,\n );\n };\n\n const filteredSubstitutionsOrDeletions = data.substitutionsOrDeletions.filter(bySelectedSegments);\n\n return {\n insertions: data.insertions.filter(bySelectedSegments),\n tableData: filteredSubstitutionsOrDeletions.filter(byDisplayedMutationTypes),\n gridData: filteredSubstitutionsOrDeletions,\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useState } from 'preact/hooks';\n\nimport { getInsertionsTableData } from './getInsertionsTableData';\nimport { getMutationsTableData } from './getMutationsTableData';\nimport { MutationsGrid } from './mutations-grid';\nimport { InsertionsTable } from './mutations-insertions-table';\nimport MutationsTable from './mutations-table';\nimport { filterMutationsData, queryMutationsData } from './queryMutations';\nimport {\n type InsertionEntry,\n type LapisFilter,\n type SequenceType,\n type SubstitutionOrDeletionEntry,\n} from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/SegmentSelector';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'table' | 'grid' | 'insertions';\n\nexport interface MutationsInnerProps {\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n views: View[];\n pageSize: boolean | number;\n}\n\nexport interface MutationsProps extends MutationsInnerProps {\n width: string;\n height: string;\n}\n\nexport const Mutations: FunctionComponent<MutationsProps> = ({ width, height, ...innerProps }) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <MutationsInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationsInner: FunctionComponent<MutationsInnerProps> = ({\n lapisFilter,\n sequenceType,\n views,\n pageSize,\n}) => {\n const lapis = useContext(LapisUrlContext);\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationsData(lapisFilter, sequenceType, lapis);\n }, [lapisFilter, sequenceType, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MutationsTabs mutationsData={data} sequenceType={sequenceType} views={views} pageSize={pageSize} />;\n};\n\ntype MutationTabsProps = {\n mutationsData: { insertions: InsertionEntry[]; substitutionsOrDeletions: SubstitutionOrDeletionEntry[] };\n sequenceType: SequenceType;\n views: View[];\n pageSize: boolean | number;\n};\n\nconst MutationsTabs: FunctionComponent<MutationTabsProps> = ({ mutationsData, sequenceType, views, pageSize }) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 1 });\n\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(sequenceType);\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n\n const filteredData = filterMutationsData(mutationsData, displayedSegments, displayedMutationTypes);\n\n const getTab = (view: View) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <MutationsTable\n data={filteredData.tableData}\n proportionInterval={proportionInterval}\n pageSize={pageSize}\n />\n ),\n };\n case 'grid':\n return {\n title: 'Grid',\n content: (\n <MutationsGrid\n data={filteredData.gridData}\n sequenceType={sequenceType}\n proportionInterval={proportionInterval}\n pageSize={pageSize}\n />\n ),\n };\n case 'insertions':\n return {\n title: 'Insertions',\n content: <InsertionsTable data={filteredData.insertions} pageSize={pageSize} />,\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n filteredData={filteredData}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n activeTab: string;\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n filteredData: { tableData: SubstitutionOrDeletionEntry[]; insertions: InsertionEntry[] };\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n filteredData,\n proportionInterval,\n setProportionInterval,\n}) => {\n return (\n <>\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n {activeTab === 'Table' && (\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\n />\n )}\n {(activeTab === 'Table' || activeTab === 'Grid') && (\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getMutationsTableData(filteredData.tableData, proportionInterval)}\n filename='substitutions_and_deletions.csv'\n />\n </>\n )}\n {activeTab === 'Insertions' && (\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() =>\n getInsertionsTableData(filteredData.insertions).map((row) => {\n return {\n insertion: row.insertion.toString(),\n count: row.count,\n };\n })\n }\n filename='insertions.csv'\n />\n )}\n <Info height={'100px'}>Info for mutations</Info>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { Mutations, type View } from '../../preact/mutations/mutations';\nimport { type LapisFilter, type SequenceType } from '../../types';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays mutations (substitutions, deletions and insertions) for a dataset selected by a LAPIS filter.\n *\n * ## Views\n *\n * ### Table View\n *\n * The table view shows all substitutions and deletions for the dataset.\n * It shows the type (substitution or deletion), the total count of the mutation\n * and the proportion of the mutation in the dataset.\n * The proportion is relative to the total number of sequences matching\n * the specified sequence filters with non-ambiguous reads at that position.\n *\n * The proportion interval filter can be used to filter the displayed mutations on client side.\n *\n * ### Grid View\n *\n * The grid view shows the proportion of each sequence symbol (nucleotide or amino acid) for each position that has a mutation.\n * Only positions with at least one mutation in the selected proportion interval are shown.\n *\n * ### Insertions View\n *\n * The insertions view shows the count of all insertions for the dataset.\n *\n */\n@customElement('gs-mutations')\nexport class MutationsComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * LAPIS filter to select the displayed data.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('table' | 'grid' | 'insertions')[] = ['table', 'grid'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <Mutations\n lapisFilter={this.lapisFilter}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutations-component': MutationsComponent;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<Equals<typeof MutationsComponent.prototype.lapisFilter, LapisFilter>>;\ntype SequenceTypeMatches = Expect<Equals<typeof MutationsComponent.prototype.sequenceType, SequenceType>>;\ntype ViewsMatches = Expect<Equals<typeof MutationsComponent.prototype.views, View[]>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { type TemporalGranularity } from '../../types';\n\nexport function getPrevalenceOverTimeTableData(data: PrevalenceOverTimeData, granularity: TemporalGranularity) {\n return data[0].content.map((row, rowNumber) => {\n const otherColumns = data\n .map((dataset) => ({\n [`${dataset.displayName} prevalence`]: dataset.content[rowNumber].prevalence.toFixed(4),\n [`${dataset.displayName} count`]: dataset.content[rowNumber].count,\n }))\n .reduce((acc, val) => ({ ...acc, ...val }), {});\n\n return {\n [granularity]: row.dateRange?.toString() ?? 'Unknown',\n ...otherColumns,\n };\n });\n}\n","import type { Temporal } from './temporal';\n\nexport function sortNullToBeginningThenByDate(a: { dateRange: Temporal | null }, b: { dateRange: Temporal | null }) {\n return a.dateRange === null\n ? -1\n : b.dateRange === null\n ? 1\n : a.dateRange.toString().localeCompare(b.dateRange.toString());\n}\n","import { type Chart, type CoreScaleOptions, Scale } from 'chart.js';\n\nexport class LogitScale extends Scale {\n static id = 'logit';\n\n constructor(cfg: { id: string; type: string; ctx: CanvasRenderingContext2D; chart: Chart }) {\n super(cfg);\n this.min = 0.001;\n this.max = 0.999;\n }\n\n override buildTicks() {\n const tickValues = [this.min, 0.01, 0.1, 0.5, 0.9, 0.99, this.max];\n\n this.ticks = tickValues.map((value) => ({ value }));\n return this.ticks;\n }\n\n getLogit(value: number): number {\n if (value <= 0) {\n return -Infinity;\n }\n if (value >= 1) {\n return Infinity;\n }\n\n return Math.log(value / (1 - value));\n }\n\n override getPixelForValue(value: number): number {\n const logitMin = this.getLogit(this.min);\n const logitMax = this.getLogit(this.max);\n\n const logitValue = this.getLogit(value);\n\n const decimal = (logitValue - logitMin) / (logitMax - logitMin);\n\n return this.getPixelForDecimal(decimal);\n }\n}\n\ndeclare module 'chart.js' {\n export interface CartesianScaleTypeRegistry {\n logit: {\n options: CoreScaleOptions;\n };\n }\n}\n","// colorblind friendly colors taken from https://personal.sron.nl/~pault/\n\nconst ColorsRGB = {\n indigo: [51, 34, 136],\n green: [17, 119, 51],\n cyan: [136, 204, 238],\n teal: [68, 170, 153],\n olive: [153, 153, 51],\n sand: [221, 204, 119],\n rose: [204, 102, 119],\n wine: [136, 34, 85],\n purple: [170, 68, 153],\n};\n\ntype GraphColor = keyof typeof ColorsRGB;\n\nexport const singleGraphColorRGBAById = (id: number, alpha = 1) => {\n const keys = Object.keys(ColorsRGB) as GraphColor[];\n const key = keys[id % keys.length];\n\n return `rgba(${ColorsRGB[key].join(',')},${alpha})`;\n};\n\nexport const singleGraphColorRGBByName = (name: GraphColor, alpha = 1) => {\n return `rgba(${ColorsRGB[name].join(',')},${alpha})`;\n};\n","// calculateWilsonInterval calculates the Wilson score interval for 95% confidence.\n//\n// This function is based on https://github.com/erikfox/wilson-interval, but without\n// high precision math.\n//\n// observed - number of observed positive outcomes\n// sample - number of experiments or size of the sample\nexport function wilson95PercentConfidenceInterval(observed: number, sample: number) {\n const p = observed / sample;\n const n = sample;\n const z = 1.9599639715843482;\n\n const numerator = p + (z * z) / (2 * n);\n const w_plus_minus = z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * (n * n)));\n const denominator = 1 + (z * z) / n;\n\n return {\n lowerLimit: (numerator - w_plus_minus) / denominator,\n upperLimit: (numerator + w_plus_minus) / denominator,\n };\n}\n\nexport const confidenceIntervalDataLabel = (\n value: number,\n lowerLimit?: number,\n upperLimit?: number,\n prefix?: string,\n) => {\n const label = prefix ? `${prefix}: ` : '';\n\n return `${label}${value.toFixed(3)} (${lowerLimit?.toFixed(3)} - ${upperLimit?.toFixed(3)})`;\n};\n\nexport type ConfidenceIntervalMethod = 'wilson' | 'none';\n","export interface YAxisMaxConfig {\n linear?: AxisMax;\n logarithmic?: AxisMax;\n}\n\nexport type AxisMax = 'maxInData' | 'limitTo1' | number;\n\nexport const getYAxisMax = (maxInData: number, axisMax?: AxisMax) => {\n if (!axisMax) {\n return 1;\n }\n\n switch (axisMax) {\n case 'limitTo1': {\n return maxInData > 1 ? 1 : maxInData;\n }\n case 'maxInData': {\n return maxInData;\n }\n default: {\n return axisMax;\n }\n }\n};\n","export type ScaleType = 'linear' | 'logarithmic' | 'logit';\n\nexport function getYAxisScale(scaleType: ScaleType) {\n switch (scaleType) {\n case 'linear': {\n return { beginAtZero: true, type: 'linear' as const, min: 0, max: 1 };\n }\n case 'logarithmic': {\n return { type: 'logarithmic' as const, max: 1 };\n }\n case 'logit':\n return { type: 'logit' as const };\n }\n}\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables, type TooltipItem } from 'chart.js';\nimport { BarWithErrorBar, BarWithErrorBarsController } from 'chartjs-chart-error-bars';\n\nimport { maxInData } from './prevalence-over-time';\nimport {\n type PrevalenceOverTimeData,\n type PrevalenceOverTimeVariantData,\n type PrevalenceOverTimeVariantDataPoint,\n} from '../../query/queryPrevalenceOverTime';\nimport { sortNullToBeginningThenByDate } from '../../utils/sort';\nimport GsChart from '../components/chart';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { type ConfidenceIntervalMethod, wilson95PercentConfidenceInterval } from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeBarChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale, BarWithErrorBarsController, BarWithErrorBar);\n\nconst PrevalenceOverTimeBarChart = ({\n data,\n yAxisScaleType,\n confidenceIntervalMethod,\n yAxisMaxConfig,\n}: PrevalenceOverTimeBarChartProps) => {\n const nullFirstData = data.map((variantData) => {\n return {\n content: variantData.content.sort(sortNullToBeginningThenByDate),\n displayName: variantData.displayName,\n };\n });\n\n const datasets = nullFirstData.map((graphData, index) => getDataset(graphData, index, confidenceIntervalMethod));\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nullFirstData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: BarWithErrorBarsController.id,\n data: {\n datasets,\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(confidenceIntervalMethod),\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nconst getDataset = (\n prevalenceOverTimeVariant: PrevalenceOverTimeVariantData,\n index: number,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n): ChartDataset<\n typeof BarWithErrorBarsController.id,\n {\n x: string;\n yMin: number | undefined;\n yMax: number | undefined;\n y: number;\n }[]\n> => {\n return {\n borderWidth: 1,\n label: prevalenceOverTimeVariant.displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: prevalenceOverTimeVariant.content.map(mapDataPoint(confidenceIntervalMethod)),\n };\n};\n\nconst mapDataPoint = (confidenceIntervalMethod: ConfidenceIntervalMethod) => {\n return (dataPoint: PrevalenceOverTimeVariantDataPoint) => {\n const confidenceInterval = getConfidenceInterval(dataPoint, confidenceIntervalMethod);\n return {\n y: dataPoint.prevalence,\n yMin: confidenceInterval.lowerLimit,\n yMax: confidenceInterval.upperLimit,\n x: dataPoint.dateRange?.toString() ?? 'Unknown',\n };\n };\n};\n\nconst getConfidenceInterval = (\n dataPoint: PrevalenceOverTimeVariantDataPoint,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n) => {\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total);\n default:\n return { lowerLimit: undefined, upperLimit: undefined };\n }\n};\n\nconst tooltip = (confidenceIntervalMethod: ConfidenceIntervalMethod) => {\n const generalConfig = {\n mode: 'index' as const,\n intersect: false,\n };\n\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return {\n ...generalConfig,\n callbacks: {\n label: (context: TooltipItem<'barWithErrorBars'>) => {\n const value = context.dataset.data[context.dataIndex] as {\n y: number;\n yMin: number;\n yMax: number;\n };\n\n return `${context.dataset.label}: ${value.y.toFixed(3)} (${value.yMin.toFixed(3)} - ${value.yMax.toFixed(3)})`;\n },\n },\n };\n default:\n return generalConfig;\n }\n};\n\nexport default PrevalenceOverTimeBarChart;\n","export var SECONDS_A_MINUTE = 60;\nexport var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;\nexport var SECONDS_A_DAY = SECONDS_A_HOUR * 24;\nexport var SECONDS_A_WEEK = SECONDS_A_DAY * 7;\nexport var MILLISECONDS_A_SECOND = 1e3;\nexport var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; // English locales\n\nexport var MS = 'millisecond';\nexport var S = 'second';\nexport var MIN = 'minute';\nexport var H = 'hour';\nexport var D = 'day';\nexport var W = 'week';\nexport var M = 'month';\nexport var Q = 'quarter';\nexport var Y = 'year';\nexport var DATE = 'date';\nexport var FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ';\nexport var INVALID_DATE_STRING = 'Invalid Date'; // regex\n\nexport var REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/;\nexport var REGEX_FORMAT = /\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;","// English [en]\n// We don't need weekdaysShort, weekdaysMin, monthsShort in en.js locale\nexport default {\n name: 'en',\n weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n ordinal: function ordinal(n) {\n var s = ['th', 'st', 'nd', 'rd'];\n var v = n % 100;\n return \"[\" + n + (s[(v - 20) % 10] || s[v] || s[0]) + \"]\";\n }\n};","import * as C from './constant';\n\nvar padStart = function padStart(string, length, pad) {\n var s = String(string);\n if (!s || s.length >= length) return string;\n return \"\" + Array(length + 1 - s.length).join(pad) + string;\n};\n\nvar padZoneStr = function padZoneStr(instance) {\n var negMinutes = -instance.utcOffset();\n var minutes = Math.abs(negMinutes);\n var hourOffset = Math.floor(minutes / 60);\n var minuteOffset = minutes % 60;\n return \"\" + (negMinutes <= 0 ? '+' : '-') + padStart(hourOffset, 2, '0') + \":\" + padStart(minuteOffset, 2, '0');\n};\n\nvar monthDiff = function monthDiff(a, b) {\n // function from moment.js in order to keep the same result\n if (a.date() < b.date()) return -monthDiff(b, a);\n var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month());\n var anchor = a.clone().add(wholeMonthDiff, C.M);\n var c = b - anchor < 0;\n var anchor2 = a.clone().add(wholeMonthDiff + (c ? -1 : 1), C.M);\n return +(-(wholeMonthDiff + (b - anchor) / (c ? anchor - anchor2 : anchor2 - anchor)) || 0);\n};\n\nvar absFloor = function absFloor(n) {\n return n < 0 ? Math.ceil(n) || 0 : Math.floor(n);\n};\n\nvar prettyUnit = function prettyUnit(u) {\n var special = {\n M: C.M,\n y: C.Y,\n w: C.W,\n d: C.D,\n D: C.DATE,\n h: C.H,\n m: C.MIN,\n s: C.S,\n ms: C.MS,\n Q: C.Q\n };\n return special[u] || String(u || '').toLowerCase().replace(/s$/, '');\n};\n\nvar isUndefined = function isUndefined(s) {\n return s === undefined;\n};\n\nexport default {\n s: padStart,\n z: padZoneStr,\n m: monthDiff,\n a: absFloor,\n p: prettyUnit,\n u: isUndefined\n};","import * as C from './constant';\nimport en from './locale/en';\nimport U from './utils';\nvar L = 'en'; // global locale\n\nvar Ls = {}; // global loaded locale\n\nLs[L] = en;\nvar IS_DAYJS = '$isDayjsObject'; // eslint-disable-next-line no-use-before-define\n\nvar isDayjs = function isDayjs(d) {\n return d instanceof Dayjs || !!(d && d[IS_DAYJS]);\n};\n\nvar parseLocale = function parseLocale(preset, object, isLocal) {\n var l;\n if (!preset) return L;\n\n if (typeof preset === 'string') {\n var presetLower = preset.toLowerCase();\n\n if (Ls[presetLower]) {\n l = presetLower;\n }\n\n if (object) {\n Ls[presetLower] = object;\n l = presetLower;\n }\n\n var presetSplit = preset.split('-');\n\n if (!l && presetSplit.length > 1) {\n return parseLocale(presetSplit[0]);\n }\n } else {\n var name = preset.name;\n Ls[name] = preset;\n l = name;\n }\n\n if (!isLocal && l) L = l;\n return l || !isLocal && L;\n};\n\nvar dayjs = function dayjs(date, c) {\n if (isDayjs(date)) {\n return date.clone();\n } // eslint-disable-next-line no-nested-ternary\n\n\n var cfg = typeof c === 'object' ? c : {};\n cfg.date = date;\n cfg.args = arguments; // eslint-disable-line prefer-rest-params\n\n return new Dayjs(cfg); // eslint-disable-line no-use-before-define\n};\n\nvar wrapper = function wrapper(date, instance) {\n return dayjs(date, {\n locale: instance.$L,\n utc: instance.$u,\n x: instance.$x,\n $offset: instance.$offset // todo: refactor; do not use this.$offset in you code\n\n });\n};\n\nvar Utils = U; // for plugin use\n\nUtils.l = parseLocale;\nUtils.i = isDayjs;\nUtils.w = wrapper;\n\nvar parseDate = function parseDate(cfg) {\n var date = cfg.date,\n utc = cfg.utc;\n if (date === null) return new Date(NaN); // null is invalid\n\n if (Utils.u(date)) return new Date(); // today\n\n if (date instanceof Date) return new Date(date);\n\n if (typeof date === 'string' && !/Z$/i.test(date)) {\n var d = date.match(C.REGEX_PARSE);\n\n if (d) {\n var m = d[2] - 1 || 0;\n var ms = (d[7] || '0').substring(0, 3);\n\n if (utc) {\n return new Date(Date.UTC(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms));\n }\n\n return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n\n return new Date(date); // everything else\n};\n\nvar Dayjs = /*#__PURE__*/function () {\n function Dayjs(cfg) {\n this.$L = parseLocale(cfg.locale, null, true);\n this.parse(cfg); // for plugin\n\n this.$x = this.$x || cfg.x || {};\n this[IS_DAYJS] = true;\n }\n\n var _proto = Dayjs.prototype;\n\n _proto.parse = function parse(cfg) {\n this.$d = parseDate(cfg);\n this.init();\n };\n\n _proto.init = function init() {\n var $d = this.$d;\n this.$y = $d.getFullYear();\n this.$M = $d.getMonth();\n this.$D = $d.getDate();\n this.$W = $d.getDay();\n this.$H = $d.getHours();\n this.$m = $d.getMinutes();\n this.$s = $d.getSeconds();\n this.$ms = $d.getMilliseconds();\n } // eslint-disable-next-line class-methods-use-this\n ;\n\n _proto.$utils = function $utils() {\n return Utils;\n };\n\n _proto.isValid = function isValid() {\n return !(this.$d.toString() === C.INVALID_DATE_STRING);\n };\n\n _proto.isSame = function isSame(that, units) {\n var other = dayjs(that);\n return this.startOf(units) <= other && other <= this.endOf(units);\n };\n\n _proto.isAfter = function isAfter(that, units) {\n return dayjs(that) < this.startOf(units);\n };\n\n _proto.isBefore = function isBefore(that, units) {\n return this.endOf(units) < dayjs(that);\n };\n\n _proto.$g = function $g(input, get, set) {\n if (Utils.u(input)) return this[get];\n return this.set(set, input);\n };\n\n _proto.unix = function unix() {\n return Math.floor(this.valueOf() / 1000);\n };\n\n _proto.valueOf = function valueOf() {\n // timezone(hour) * 60 * 60 * 1000 => ms\n return this.$d.getTime();\n };\n\n _proto.startOf = function startOf(units, _startOf) {\n var _this = this;\n\n // startOf -> endOf\n var isStartOf = !Utils.u(_startOf) ? _startOf : true;\n var unit = Utils.p(units);\n\n var instanceFactory = function instanceFactory(d, m) {\n var ins = Utils.w(_this.$u ? Date.UTC(_this.$y, m, d) : new Date(_this.$y, m, d), _this);\n return isStartOf ? ins : ins.endOf(C.D);\n };\n\n var instanceFactorySet = function instanceFactorySet(method, slice) {\n var argumentStart = [0, 0, 0, 0];\n var argumentEnd = [23, 59, 59, 999];\n return Utils.w(_this.toDate()[method].apply( // eslint-disable-line prefer-spread\n _this.toDate('s'), (isStartOf ? argumentStart : argumentEnd).slice(slice)), _this);\n };\n\n var $W = this.$W,\n $M = this.$M,\n $D = this.$D;\n var utcPad = \"set\" + (this.$u ? 'UTC' : '');\n\n switch (unit) {\n case C.Y:\n return isStartOf ? instanceFactory(1, 0) : instanceFactory(31, 11);\n\n case C.M:\n return isStartOf ? instanceFactory(1, $M) : instanceFactory(0, $M + 1);\n\n case C.W:\n {\n var weekStart = this.$locale().weekStart || 0;\n var gap = ($W < weekStart ? $W + 7 : $W) - weekStart;\n return instanceFactory(isStartOf ? $D - gap : $D + (6 - gap), $M);\n }\n\n case C.D:\n case C.DATE:\n return instanceFactorySet(utcPad + \"Hours\", 0);\n\n case C.H:\n return instanceFactorySet(utcPad + \"Minutes\", 1);\n\n case C.MIN:\n return instanceFactorySet(utcPad + \"Seconds\", 2);\n\n case C.S:\n return instanceFactorySet(utcPad + \"Milliseconds\", 3);\n\n default:\n return this.clone();\n }\n };\n\n _proto.endOf = function endOf(arg) {\n return this.startOf(arg, false);\n };\n\n _proto.$set = function $set(units, _int) {\n var _C$D$C$DATE$C$M$C$Y$C;\n\n // private set\n var unit = Utils.p(units);\n var utcPad = \"set\" + (this.$u ? 'UTC' : '');\n var name = (_C$D$C$DATE$C$M$C$Y$C = {}, _C$D$C$DATE$C$M$C$Y$C[C.D] = utcPad + \"Date\", _C$D$C$DATE$C$M$C$Y$C[C.DATE] = utcPad + \"Date\", _C$D$C$DATE$C$M$C$Y$C[C.M] = utcPad + \"Month\", _C$D$C$DATE$C$M$C$Y$C[C.Y] = utcPad + \"FullYear\", _C$D$C$DATE$C$M$C$Y$C[C.H] = utcPad + \"Hours\", _C$D$C$DATE$C$M$C$Y$C[C.MIN] = utcPad + \"Minutes\", _C$D$C$DATE$C$M$C$Y$C[C.S] = utcPad + \"Seconds\", _C$D$C$DATE$C$M$C$Y$C[C.MS] = utcPad + \"Milliseconds\", _C$D$C$DATE$C$M$C$Y$C)[unit];\n var arg = unit === C.D ? this.$D + (_int - this.$W) : _int;\n\n if (unit === C.M || unit === C.Y) {\n // clone is for badMutable plugin\n var date = this.clone().set(C.DATE, 1);\n date.$d[name](arg);\n date.init();\n this.$d = date.set(C.DATE, Math.min(this.$D, date.daysInMonth())).$d;\n } else if (name) this.$d[name](arg);\n\n this.init();\n return this;\n };\n\n _proto.set = function set(string, _int2) {\n return this.clone().$set(string, _int2);\n };\n\n _proto.get = function get(unit) {\n return this[Utils.p(unit)]();\n };\n\n _proto.add = function add(number, units) {\n var _this2 = this,\n _C$MIN$C$H$C$S$unit;\n\n number = Number(number); // eslint-disable-line no-param-reassign\n\n var unit = Utils.p(units);\n\n var instanceFactorySet = function instanceFactorySet(n) {\n var d = dayjs(_this2);\n return Utils.w(d.date(d.date() + Math.round(n * number)), _this2);\n };\n\n if (unit === C.M) {\n return this.set(C.M, this.$M + number);\n }\n\n if (unit === C.Y) {\n return this.set(C.Y, this.$y + number);\n }\n\n if (unit === C.D) {\n return instanceFactorySet(1);\n }\n\n if (unit === C.W) {\n return instanceFactorySet(7);\n }\n\n var step = (_C$MIN$C$H$C$S$unit = {}, _C$MIN$C$H$C$S$unit[C.MIN] = C.MILLISECONDS_A_MINUTE, _C$MIN$C$H$C$S$unit[C.H] = C.MILLISECONDS_A_HOUR, _C$MIN$C$H$C$S$unit[C.S] = C.MILLISECONDS_A_SECOND, _C$MIN$C$H$C$S$unit)[unit] || 1; // ms\n\n var nextTimeStamp = this.$d.getTime() + number * step;\n return Utils.w(nextTimeStamp, this);\n };\n\n _proto.subtract = function subtract(number, string) {\n return this.add(number * -1, string);\n };\n\n _proto.format = function format(formatStr) {\n var _this3 = this;\n\n var locale = this.$locale();\n if (!this.isValid()) return locale.invalidDate || C.INVALID_DATE_STRING;\n var str = formatStr || C.FORMAT_DEFAULT;\n var zoneStr = Utils.z(this);\n var $H = this.$H,\n $m = this.$m,\n $M = this.$M;\n var weekdays = locale.weekdays,\n months = locale.months,\n meridiem = locale.meridiem;\n\n var getShort = function getShort(arr, index, full, length) {\n return arr && (arr[index] || arr(_this3, str)) || full[index].slice(0, length);\n };\n\n var get$H = function get$H(num) {\n return Utils.s($H % 12 || 12, num, '0');\n };\n\n var meridiemFunc = meridiem || function (hour, minute, isLowercase) {\n var m = hour < 12 ? 'AM' : 'PM';\n return isLowercase ? m.toLowerCase() : m;\n };\n\n var matches = function matches(match) {\n switch (match) {\n case 'YY':\n return String(_this3.$y).slice(-2);\n\n case 'YYYY':\n return Utils.s(_this3.$y, 4, '0');\n\n case 'M':\n return $M + 1;\n\n case 'MM':\n return Utils.s($M + 1, 2, '0');\n\n case 'MMM':\n return getShort(locale.monthsShort, $M, months, 3);\n\n case 'MMMM':\n return getShort(months, $M);\n\n case 'D':\n return _this3.$D;\n\n case 'DD':\n return Utils.s(_this3.$D, 2, '0');\n\n case 'd':\n return String(_this3.$W);\n\n case 'dd':\n return getShort(locale.weekdaysMin, _this3.$W, weekdays, 2);\n\n case 'ddd':\n return getShort(locale.weekdaysShort, _this3.$W, weekdays, 3);\n\n case 'dddd':\n return weekdays[_this3.$W];\n\n case 'H':\n return String($H);\n\n case 'HH':\n return Utils.s($H, 2, '0');\n\n case 'h':\n return get$H(1);\n\n case 'hh':\n return get$H(2);\n\n case 'a':\n return meridiemFunc($H, $m, true);\n\n case 'A':\n return meridiemFunc($H, $m, false);\n\n case 'm':\n return String($m);\n\n case 'mm':\n return Utils.s($m, 2, '0');\n\n case 's':\n return String(_this3.$s);\n\n case 'ss':\n return Utils.s(_this3.$s, 2, '0');\n\n case 'SSS':\n return Utils.s(_this3.$ms, 3, '0');\n\n case 'Z':\n return zoneStr;\n // 'ZZ' logic below\n\n default:\n break;\n }\n\n return null;\n };\n\n return str.replace(C.REGEX_FORMAT, function (match, $1) {\n return $1 || matches(match) || zoneStr.replace(':', '');\n }); // 'ZZ'\n };\n\n _proto.utcOffset = function utcOffset() {\n // Because a bug at FF24, we're rounding the timezone offset around 15 minutes\n // https://github.com/moment/moment/pull/1871\n return -Math.round(this.$d.getTimezoneOffset() / 15) * 15;\n };\n\n _proto.diff = function diff(input, units, _float) {\n var _this4 = this;\n\n var unit = Utils.p(units);\n var that = dayjs(input);\n var zoneDelta = (that.utcOffset() - this.utcOffset()) * C.MILLISECONDS_A_MINUTE;\n var diff = this - that;\n\n var getMonth = function getMonth() {\n return Utils.m(_this4, that);\n };\n\n var result;\n\n switch (unit) {\n case C.Y:\n result = getMonth() / 12;\n break;\n\n case C.M:\n result = getMonth();\n break;\n\n case C.Q:\n result = getMonth() / 3;\n break;\n\n case C.W:\n result = (diff - zoneDelta) / C.MILLISECONDS_A_WEEK;\n break;\n\n case C.D:\n result = (diff - zoneDelta) / C.MILLISECONDS_A_DAY;\n break;\n\n case C.H:\n result = diff / C.MILLISECONDS_A_HOUR;\n break;\n\n case C.MIN:\n result = diff / C.MILLISECONDS_A_MINUTE;\n break;\n\n case C.S:\n result = diff / C.MILLISECONDS_A_SECOND;\n break;\n\n default:\n result = diff; // milliseconds\n\n break;\n }\n\n return _float ? result : Utils.a(result);\n };\n\n _proto.daysInMonth = function daysInMonth() {\n return this.endOf(C.M).$D;\n };\n\n _proto.$locale = function $locale() {\n // get locale object\n return Ls[this.$L];\n };\n\n _proto.locale = function locale(preset, object) {\n if (!preset) return this.$L;\n var that = this.clone();\n var nextLocaleName = parseLocale(preset, object, true);\n if (nextLocaleName) that.$L = nextLocaleName;\n return that;\n };\n\n _proto.clone = function clone() {\n return Utils.w(this.$d, this);\n };\n\n _proto.toDate = function toDate() {\n return new Date(this.valueOf());\n };\n\n _proto.toJSON = function toJSON() {\n return this.isValid() ? this.toISOString() : null;\n };\n\n _proto.toISOString = function toISOString() {\n // ie 8 return\n // new Dayjs(this.valueOf() + this.$d.getTimezoneOffset() * 60000)\n // .format('YYYY-MM-DDTHH:mm:ss.SSS[Z]')\n return this.$d.toISOString();\n };\n\n _proto.toString = function toString() {\n return this.$d.toUTCString();\n };\n\n return Dayjs;\n}();\n\nvar proto = Dayjs.prototype;\ndayjs.prototype = proto;\n[['$ms', C.MS], ['$s', C.S], ['$m', C.MIN], ['$H', C.H], ['$W', C.D], ['$M', C.M], ['$y', C.Y], ['$D', C.DATE]].forEach(function (g) {\n proto[g[1]] = function (input) {\n return this.$g(input, g[0], g[1]);\n };\n});\n\ndayjs.extend = function (plugin, option) {\n if (!plugin.$i) {\n // install plugin only once\n plugin(option, Dayjs, dayjs);\n plugin.$i = true;\n }\n\n return dayjs;\n};\n\ndayjs.locale = parseLocale;\ndayjs.isDayjs = isDayjs;\n\ndayjs.unix = function (timestamp) {\n return dayjs(timestamp * 1e3);\n};\n\ndayjs.en = Ls[L];\ndayjs.Ls = Ls;\ndayjs.p = {};\nexport default dayjs;","import { FORMAT_DEFAULT } from '../../constant';\nexport default (function (o, c) {\n // locale needed later\n var proto = c.prototype;\n var oldFormat = proto.format;\n\n proto.format = function (formatStr) {\n var _this = this;\n\n var locale = this.$locale();\n\n if (!this.isValid()) {\n return oldFormat.bind(this)(formatStr);\n }\n\n var utils = this.$utils();\n var str = formatStr || FORMAT_DEFAULT;\n var result = str.replace(/\\[([^\\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, function (match) {\n switch (match) {\n case 'Q':\n return Math.ceil((_this.$M + 1) / 3);\n\n case 'Do':\n return locale.ordinal(_this.$D);\n\n case 'gggg':\n return _this.weekYear();\n\n case 'GGGG':\n return _this.isoWeekYear();\n\n case 'wo':\n return locale.ordinal(_this.week(), 'W');\n // W for week\n\n case 'w':\n case 'ww':\n return utils.s(_this.week(), match === 'w' ? 1 : 2, '0');\n\n case 'W':\n case 'WW':\n return utils.s(_this.isoWeek(), match === 'W' ? 1 : 2, '0');\n\n case 'k':\n case 'kk':\n return utils.s(String(_this.$H === 0 ? 24 : _this.$H), match === 'k' ? 1 : 2, '0');\n\n case 'X':\n return Math.floor(_this.$d.getTime() / 1000);\n\n case 'x':\n return _this.$d.getTime();\n\n case 'z':\n return \"[\" + _this.offsetName() + \"]\";\n\n case 'zzz':\n return \"[\" + _this.offsetName('long') + \"]\";\n\n default:\n return match;\n }\n });\n return oldFormat.bind(this)(result);\n };\n});","import { D, W, Y } from '../../constant';\nvar isoWeekPrettyUnit = 'isoweek';\nexport default (function (o, c, d) {\n var getYearFirstThursday = function getYearFirstThursday(year, isUtc) {\n var yearFirstDay = (isUtc ? d.utc : d)().year(year).startOf(Y);\n var addDiffDays = 4 - yearFirstDay.isoWeekday();\n\n if (yearFirstDay.isoWeekday() > 4) {\n addDiffDays += 7;\n }\n\n return yearFirstDay.add(addDiffDays, D);\n };\n\n var getCurrentWeekThursday = function getCurrentWeekThursday(ins) {\n return ins.add(4 - ins.isoWeekday(), D);\n };\n\n var proto = c.prototype;\n\n proto.isoWeekYear = function () {\n var nowWeekThursday = getCurrentWeekThursday(this);\n return nowWeekThursday.year();\n };\n\n proto.isoWeek = function (week) {\n if (!this.$utils().u(week)) {\n return this.add((week - this.isoWeek()) * 7, D);\n }\n\n var nowWeekThursday = getCurrentWeekThursday(this);\n var diffWeekThursday = getYearFirstThursday(this.isoWeekYear(), this.$u);\n return nowWeekThursday.diff(diffWeekThursday, W) + 1;\n };\n\n proto.isoWeekday = function (week) {\n if (!this.$utils().u(week)) {\n return this.day(this.day() % 7 ? week : week - 7);\n }\n\n return this.day() || 7;\n };\n\n var oldStartOf = proto.startOf;\n\n proto.startOf = function (units, startOf) {\n var utils = this.$utils();\n var isStartOf = !utils.u(startOf) ? startOf : true;\n var unit = utils.p(units);\n\n if (unit === isoWeekPrettyUnit) {\n return isStartOf ? this.date(this.date() - (this.isoWeekday() - 1)).startOf('day') : this.date(this.date() - 1 - (this.isoWeekday() - 1) + 7).endOf('day');\n }\n\n return oldStartOf.bind(this)(units, startOf);\n };\n});","import dayjs from 'dayjs/esm';\nimport advancedFormat from 'dayjs/esm/plugin/advancedFormat';\nimport isoWeek from 'dayjs/esm/plugin/isoWeek';\n\nimport type { TemporalGranularity } from '../types';\n\ndayjs.extend(isoWeek);\ndayjs.extend(advancedFormat);\n\nexport class TemporalCache {\n private yearMonthDayCache = new Map<string, YearMonthDay>();\n private yearWeekCache = new Map<string, YearWeek>();\n private yearMonthCache = new Map<string, YearMonth>();\n private yearCache = new Map<string, Year>();\n\n private constructor() {}\n\n getYearMonthDay(s: string): YearMonthDay {\n if (!this.yearMonthDayCache.has(s)) {\n this.yearMonthDayCache.set(s, YearMonthDay.parse(s, this));\n }\n return this.yearMonthDayCache.get(s)!;\n }\n\n getYearMonth(s: string): YearMonth {\n if (!this.yearMonthCache.has(s)) {\n this.yearMonthCache.set(s, YearMonth.parse(s, this));\n }\n return this.yearMonthCache.get(s)!;\n }\n\n getYearWeek(s: string): YearWeek {\n if (!this.yearWeekCache.has(s)) {\n this.yearWeekCache.set(s, YearWeek.parse(s, this));\n }\n return this.yearWeekCache.get(s)!;\n }\n\n getYear(s: string): Year {\n if (!this.yearCache.has(s)) {\n this.yearCache.set(s, Year.parse(s, this));\n }\n return this.yearCache.get(s)!;\n }\n\n private static instance = new TemporalCache();\n\n static getInstance(): TemporalCache {\n return this.instance;\n }\n}\n\nexport class YearMonthDay {\n readonly date;\n readonly dayjs;\n\n constructor(\n readonly yearNumber: number,\n readonly monthNumber: number,\n readonly dayNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.date = new Date(this.yearNumber, this.monthNumber - 1, this.dayNumber);\n this.dayjs = dayjs(this.date);\n }\n\n get text(): string {\n return this.dayjs.format('YYYY-MM-DD');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return this.dayjs.format('dddd, MMMM D, YYYY');\n }\n\n get firstDay(): YearMonthDay {\n return this;\n }\n\n get lastDay(): YearMonthDay {\n return this;\n }\n\n get year(): Year {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n\n get month(): YearMonth {\n return this.cache.getYearMonth(this.dayjs.format('YYYY-MM'));\n }\n\n get week(): YearWeek {\n return this.cache.getYearWeek(this.dayjs.format('GGGG-WW'));\n }\n\n addDays(days: number): YearMonthDay {\n const date = this.dayjs.add(days, 'day');\n const s = date.format('YYYY-MM-DD');\n return this.cache.getYearMonthDay(s);\n }\n\n minus(other: YearMonthDay): number {\n return this.dayjs.diff(other.dayjs, 'day');\n }\n\n static parse(s: string, cache: TemporalCache): YearMonthDay {\n const [year, month, day] = s.split('-').map((s) => parseInt(s, 10));\n return new YearMonthDay(year, month, day, cache);\n }\n}\n\nexport class YearWeek {\n constructor(\n readonly isoYearNumber: number,\n readonly isoWeekNumber: number,\n readonly cache: TemporalCache,\n ) {}\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY-WW');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return `Week ${this.isoWeekNumber}, ${this.isoYearNumber}`;\n }\n\n get firstDay(): YearMonthDay {\n // \"The first week of the year, hence, always contains 4 January.\" https://en.wikipedia.org/wiki/ISO_week_date\n const firstDay = dayjs()\n .year(this.isoYearNumber)\n .month(1)\n .date(4)\n .isoWeek(this.isoWeekNumber)\n .startOf('isoWeek');\n return this.cache.getYearMonthDay(firstDay.format('YYYY-MM-DD'));\n }\n\n get lastDay(): YearMonthDay {\n const firstDay = dayjs()\n .year(this.isoYearNumber)\n .startOf('year')\n .add((this.isoWeekNumber - 1) * 7, 'day')\n .startOf('week')\n .add(1, 'day');\n const lastDay = firstDay.add(6, 'day');\n\n return this.cache.getYearMonthDay(lastDay.format('YYYY-MM-DD'));\n }\n\n get year(): Year {\n return this.cache.getYear(`${this.isoYearNumber}`);\n }\n\n addWeeks(weeks: number): YearWeek {\n const date = this.firstDay.dayjs.add(weeks, 'week');\n const s = date.format('YYYY-WW');\n return this.cache.getYearWeek(s);\n }\n\n minus(other: YearWeek): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'week');\n }\n\n static parse(s: string, cache: TemporalCache): YearWeek {\n const [year, week] = s.split('-').map((s) => parseInt(s, 10));\n return new YearWeek(year, week, cache);\n }\n}\n\nexport class YearMonth {\n constructor(\n readonly yearNumber: number,\n readonly monthNumber: number,\n readonly cache: TemporalCache,\n ) {}\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY-MM');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return `${monthName(this.monthNumber)} ${this.yearNumber}`;\n }\n\n get firstDay(): YearMonthDay {\n return this.cache.getYearMonthDay(dayjs(`${this.yearNumber}-${this.monthNumber}-01`).format('YYYY-MM-DD'));\n }\n\n get lastDay(): YearMonthDay {\n return this.cache.getYearMonthDay(\n dayjs(`${this.yearNumber}-${this.monthNumber}-01`).endOf('month').format('YYYY-MM-DD'),\n );\n }\n\n get year(): Year {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n\n addMonths(months: number): YearMonth {\n const date = this.firstDay.dayjs.add(months, 'month');\n const s = date.format('YYYY-MM');\n return this.cache.getYearMonth(s);\n }\n\n minus(other: YearMonth): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'month');\n }\n\n static parse(s: string, cache: TemporalCache): YearMonth {\n const [year, month] = s.split('-').map((s) => parseInt(s, 10));\n return new YearMonth(year, month, cache);\n }\n}\n\nexport class Year {\n constructor(\n readonly year: number,\n readonly cache: TemporalCache,\n ) {}\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return this.year.toString();\n }\n\n get firstMonth(): YearMonth {\n return this.cache.getYearMonth(`${this.year}-01`);\n }\n\n get lastMonth(): YearMonth {\n return this.cache.getYearMonth(`${this.year}-12`);\n }\n\n get firstDay(): YearMonthDay {\n return this.firstMonth.firstDay;\n }\n\n get lastDay(): YearMonthDay {\n return this.lastMonth.lastDay;\n }\n\n addYears(years: number): Year {\n const date = this.firstDay.dayjs.add(years, 'year');\n const s = date.format('YYYY');\n return this.cache.getYear(s);\n }\n\n minus(other: Year): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'year');\n }\n\n static parse(s: string, cache: TemporalCache): Year {\n const year = parseInt(s, 10);\n return new Year(year, cache);\n }\n}\n\nfunction monthName(month: number): string {\n return dayjs()\n .month(month - 1)\n .format('MMMM');\n}\n\nexport type Temporal = YearMonthDay | YearWeek | YearMonth | Year;\n\nexport function generateAllDaysInRange(start: YearMonthDay, end: YearMonthDay): YearMonthDay[] {\n const days = [];\n const daysInBetween = end.minus(start);\n for (let i = 0; i <= daysInBetween; i++) {\n days.push(start.addDays(i));\n }\n return days;\n}\n\nexport function generateAllWeeksInRange(start: YearWeek, end: YearWeek): YearWeek[] {\n const weeks = [];\n const weeksInBetween = end.minus(start);\n for (let i = 0; i <= weeksInBetween; i++) {\n weeks.push(start.addWeeks(i));\n }\n return weeks;\n}\n\nexport function generateAllMonthsInRange(start: YearMonth, end: YearMonth): YearMonth[] {\n const months = [];\n const monthsInBetween = end.minus(start);\n for (let i = 0; i <= monthsInBetween; i++) {\n months.push(start.addMonths(i));\n }\n return months;\n}\n\nexport function generateAllYearsInRange(start: Year, end: Year): Year[] {\n const years = [];\n const yearsInBetween = end.minus(start);\n for (let i = 0; i <= yearsInBetween; i++) {\n years.push(start.addYears(i));\n }\n return years;\n}\n\nexport function generateAllInRange(start: Temporal | null, end: Temporal | null): Temporal[] {\n if (start === null || end === null) {\n return [];\n }\n if (start instanceof YearMonthDay && end instanceof YearMonthDay) {\n return generateAllDaysInRange(start, end);\n }\n if (start instanceof YearWeek && end instanceof YearWeek) {\n return generateAllWeeksInRange(start, end);\n }\n if (start instanceof YearMonth && end instanceof YearMonth) {\n return generateAllMonthsInRange(start, end);\n }\n if (start instanceof Year && end instanceof Year) {\n return generateAllYearsInRange(start, end);\n }\n throw new Error(`Invalid arguments: start and end must be of the same type: ${start}, ${end}`);\n}\n\nexport function minusTemporal(a: Temporal, b: Temporal): number {\n if (a instanceof YearMonthDay && b instanceof YearMonthDay) {\n return a.minus(b);\n }\n if (a instanceof YearWeek && b instanceof YearWeek) {\n return a.minus(b);\n }\n if (a instanceof YearMonth && b instanceof YearMonth) {\n return a.minus(b);\n }\n if (a instanceof Year && b instanceof Year) {\n return a.minus(b);\n }\n throw new Error(`Cannot compare ${a} and ${b}`);\n}\n\nexport function compareTemporal(a: Temporal | null, b: Temporal | null): number {\n if (a === null) {\n return 1;\n }\n if (b === null) {\n return -1;\n }\n const diff = minusTemporal(a, b);\n if (diff < 0) {\n return -1;\n }\n if (diff > 0) {\n return 1;\n }\n return 0;\n}\n\nexport function getMinMaxTemporal<T extends Temporal>(values: Iterable<T | null>) {\n let min: T | null = null;\n let max: T | null = null;\n for (const value of values) {\n if (value === null) {\n continue;\n }\n if (min === null || compareTemporal(value, min) < 0) {\n min = value;\n }\n if (max === null || compareTemporal(value, max) > 0) {\n max = value;\n }\n }\n if (min === null || max === null) {\n return { min: null, max: null };\n }\n return { min, max };\n}\n\nexport function addUnit(temporal: Temporal, amount: number): Temporal {\n if (temporal instanceof YearMonthDay) {\n return temporal.addDays(amount);\n }\n if (temporal instanceof YearWeek) {\n return temporal.addWeeks(amount);\n }\n if (temporal instanceof YearMonth) {\n return temporal.addMonths(amount);\n }\n if (temporal instanceof Year) {\n return temporal.addYears(amount);\n }\n throw new Error(`Invalid argument: ${temporal}`);\n}\n\nexport function parseDateStringToTemporal(date: string, granularity: TemporalGranularity) {\n const cache = TemporalCache.getInstance();\n const day = cache.getYearMonthDay(date);\n switch (granularity) {\n case 'day':\n return day;\n case 'week':\n return day.week;\n case 'month':\n return day.month;\n case 'year':\n return day.year;\n }\n}\n\nexport function dateRangeCompare(a: { dateRange: Temporal | null }, b: { dateRange: Temporal | null }) {\n if (a.dateRange === null) {\n return 1;\n }\n if (b.dateRange === null) {\n return -1;\n }\n return compareTemporal(a.dateRange, b.dateRange);\n}\n","import { type LapisFilter } from '../types';\n\nexport function getMinMaxNumber(values: Iterable<number>): [number, number] | null {\n let min = null;\n let max = null;\n for (const value of values) {\n if (min === null || value < min) {\n min = value;\n }\n if (max === null || value > max) {\n max = value;\n }\n }\n if (min === null || max === null) {\n return null;\n }\n return [min, max];\n}\n\nexport function mapLapisFilterToUrlParams(filter: LapisFilter): URLSearchParams {\n const params = Object.entries(filter).map(([key, value]) => [key, stringifyLapisFilterValue(value)]);\n\n return new URLSearchParams(params);\n}\n\nfunction stringifyLapisFilterValue(value: LapisFilter[string]) {\n if (value === null) {\n return 'null';\n }\n switch (typeof value) {\n case 'boolean':\n return value ? 'true' : 'false';\n case 'number':\n return value.toString();\n case 'string':\n return value;\n }\n}\n\nexport function makeArray<T>(arrayOrSingleItem: T | T[]) {\n if (Array.isArray(arrayOrSingleItem)) {\n return arrayOrSingleItem;\n }\n return [arrayOrSingleItem];\n}\n","import { Chart, type ChartConfiguration, registerables } from 'chart.js';\n\nimport { maxInData } from './prevalence-over-time';\nimport { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { addUnit, minusTemporal } from '../../utils/temporal';\nimport { getMinMaxNumber } from '../../utils/utils';\nimport GsChart from '../components/chart';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeBubbleChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst PrevalenceOverTimeBubbleChart = ({\n data,\n yAxisScaleType,\n yAxisMaxConfig,\n}: PrevalenceOverTimeBubbleChartProps) => {\n const nonNullDateRangeData = data.map((variantData) => {\n return {\n content: variantData.content.filter((dataPoint) => dataPoint.dateRange !== null),\n displayName: variantData.displayName,\n };\n });\n\n const firstDate = nonNullDateRangeData[0].content[0].dateRange!;\n const total = nonNullDateRangeData.map((graphData) => graphData.content.map((dataPoint) => dataPoint.total)).flat();\n const [minTotal, maxTotal] = getMinMaxNumber(total)!;\n const scaleBubble = (value: number) => {\n return ((value - minTotal) / (maxTotal - minTotal)) * 4.5 + 0.5;\n };\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nonNullDateRangeData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'bubble',\n data: {\n datasets: nonNullDateRangeData.map((graphData, index) => ({\n label: graphData.displayName,\n data: graphData.content\n .filter((dataPoint) => dataPoint.dateRange !== null)\n .map((dataPoint) => ({\n x: minusTemporal(dataPoint.dateRange!, firstDate),\n y: dataPoint.prevalence,\n r: scaleBubble(dataPoint.total),\n })),\n borderWidth: 1,\n pointRadius: 0,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n })),\n },\n options: {\n animation: false,\n maintainAspectRatio: false,\n scales: {\n x: {\n ticks: {\n callback: (value) => addUnit(firstDate, value as number).toString(),\n },\n },\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n callbacks: {\n title: (context) => {\n const dataset = nonNullDateRangeData[context[0].datasetIndex!];\n const dataPoint = dataset.content[context[0].dataIndex!];\n return dataPoint.dateRange?.toString();\n },\n label: (context) => {\n const dataset = nonNullDateRangeData[context.datasetIndex!];\n const dataPoint = dataset.content[context.dataIndex!];\n\n const percentage = (dataPoint.prevalence * 100).toFixed(2);\n const count = dataPoint.count.toFixed(0);\n const total = dataPoint.total.toFixed(0);\n\n return `${dataset.displayName}: ${percentage}%, ${count}/${total} samples`;\n },\n },\n },\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nexport default PrevalenceOverTimeBubbleChart;\n","import { Chart, type ChartConfiguration, registerables } from 'chart.js';\nimport { type TooltipItem } from 'chart.js/dist/types';\n\nimport { maxInData } from './prevalence-over-time';\nimport { type PrevalenceOverTimeData, type PrevalenceOverTimeVariantData } from '../../query/queryPrevalenceOverTime';\nimport GsChart from '../components/chart';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport {\n confidenceIntervalDataLabel,\n type ConfidenceIntervalMethod,\n wilson95PercentConfidenceInterval,\n} from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeLineChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst PrevalenceOverTimeLineChart = ({\n data,\n yAxisScaleType,\n confidenceIntervalMethod,\n yAxisMaxConfig,\n}: PrevalenceOverTimeLineChartProps) => {\n const nonNullDateRangeData = data.map((variantData) => {\n return {\n content: variantData.content.filter((dataPoint) => dataPoint.dateRange !== null),\n displayName: variantData.displayName,\n };\n });\n\n const datasets = nonNullDateRangeData\n .map((graphData, index) => getDataset(graphData, index, confidenceIntervalMethod))\n .flat();\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nonNullDateRangeData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'line',\n data: {\n datasets,\n },\n options: {\n animation: false,\n maintainAspectRatio: false,\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(confidenceIntervalMethod),\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nconst getDataset = (\n prevalenceOverTimeVariant: PrevalenceOverTimeVariantData,\n dataIndex: number,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n) => {\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return [\n getDatasetCIUpper(prevalenceOverTimeVariant, dataIndex),\n getDatasetLine(prevalenceOverTimeVariant, dataIndex),\n getDatasetCILower(prevalenceOverTimeVariant, dataIndex),\n ].flat();\n default:\n return getDatasetLine(prevalenceOverTimeVariant, dataIndex);\n }\n};\n\nconst getDatasetCIUpper = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: `${prevalenceOverTimeVariant.displayName} CI upper`,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n return {\n y: wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total).upperLimit,\n x: dataPoint.dateRange?.toString(),\n };\n }),\n borderWidth: 0,\n pointRadius: 0,\n fill: '+1',\n backgroundColor: singleGraphColorRGBAById(dataIndex, 0.3),\n});\n\nconst getDatasetCILower = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: `${prevalenceOverTimeVariant.displayName} CI lower`,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n return {\n y: wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total).lowerLimit,\n x: dataPoint.dateRange?.toString(),\n };\n }),\n borderWidth: 0,\n pointRadius: 0,\n fill: '-1',\n backgroundColor: singleGraphColorRGBAById(dataIndex, 0.3),\n});\n\nconst getDatasetLine = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: prevalenceOverTimeVariant.displayName,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n const ciLimits = wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total);\n\n return {\n y: dataPoint.prevalence,\n x: dataPoint.dateRange?.toString(),\n yCiUpper: ciLimits.upperLimit,\n yCiLower: ciLimits.lowerLimit,\n };\n }),\n borderWidth: 1,\n pointRadius: 0,\n borderColor: singleGraphColorRGBAById(dataIndex),\n backgroundColor: singleGraphColorRGBAById(dataIndex),\n});\n\ninterface Datapoint {\n y: number;\n yCiLower?: number;\n yCiUpper?: number;\n x?: string;\n}\n\nconst tooltip = (confidenceIntervalMethod?: ConfidenceIntervalMethod) => {\n const generalConfig = {\n mode: 'index' as const,\n intersect: false,\n };\n\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return {\n ...generalConfig,\n filter: ({ datasetIndex }: TooltipItem<'line'>) => {\n return isNotCiIndex(datasetIndex);\n },\n callbacks: {\n label: (context: TooltipItem<'line'>) => {\n const dataPoint = context.dataset.data[context.dataIndex] as unknown as Datapoint;\n\n return confidenceIntervalDataLabel(\n dataPoint.y,\n dataPoint.yCiLower,\n dataPoint.yCiUpper,\n context.dataset.label,\n );\n },\n },\n };\n default:\n return generalConfig;\n }\n};\n\nfunction isNotCiIndex(datasetIndex: number) {\n return datasetIndex % 3 === 1;\n}\n\nexport default PrevalenceOverTimeLineChart;\n","import { getPrevalenceOverTimeTableData } from './getPrevalenceOverTimeTableData';\nimport { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { type TemporalGranularity } from '../../types';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface PrevalenceOverTimeTableProps {\n data: PrevalenceOverTimeData;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nconst PrevalenceOverTimeTable = ({ data, granularity, pageSize }: PrevalenceOverTimeTableProps) => {\n const getSplitColumns = (data: PrevalenceOverTimeData) => {\n return data.map((dataset) => ({\n name: dataset.displayName,\n columns: [\n {\n name: 'prevalence',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n {\n name: 'count',\n sort: true,\n },\n ],\n }));\n };\n\n const getColumns = (data: PrevalenceOverTimeData) => [\n {\n name: granularity,\n sort: true,\n },\n ...getSplitColumns(data),\n ];\n\n const getData = (data: PrevalenceOverTimeData, granularity: TemporalGranularity) => {\n const dataByHeader = getPrevalenceOverTimeTableData(data, granularity);\n return Object.values(dataByHeader).map((row) => Object.values(row));\n };\n\n return <Table data={getData(data, granularity)} columns={getColumns(data)} pageSize={pageSize} />;\n};\n\nexport default PrevalenceOverTimeTable;\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchAggregated } from '../lapisApi/lapisApi';\nimport { type AggregatedItem } from '../lapisApi/lapisTypes';\nimport { type LapisFilter } from '../types';\n\nexport class FetchAggregatedOperator<Fields extends Record<string, unknown>>\n implements\n Operator<\n Fields & {\n count: number;\n }\n >\n{\n constructor(\n private filter: LapisFilter,\n private fields: string[],\n ) {}\n\n async evaluate(lapisUrl: string, signal?: AbortSignal): Promise<Dataset<Fields & { count: number }>> {\n const aggregatedResponse = (\n await fetchAggregated(\n lapisUrl,\n {\n ...this.filter,\n fields: this.fields,\n },\n signal,\n )\n ).data;\n\n if (isFieldsArrayWithCount<Fields & { count: number }>(aggregatedResponse)) {\n return {\n content: aggregatedResponse,\n };\n }\n\n throw new Error('Aggregated response does not have count');\n }\n}\n\nfunction isFieldsArrayWithCount<T>(data: AggregatedItem[]): data is (T & { count: number })[] {\n return data.every((item) => typeof item === 'object' && 'count' in item && typeof item.count === 'number');\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class FillMissingOperator<Data, KeyToFill extends keyof Data> implements Operator<Data> {\n constructor(\n private child: Operator<Data>,\n private keyField: KeyToFill,\n private getMinMaxFn: (\n values: Iterable<Data[KeyToFill]>,\n ) => { min: Data[KeyToFill]; max: Data[KeyToFill] } | null,\n private getAllRequiredKeysFn: (min: Data[KeyToFill], max: Data[KeyToFill]) => Data[KeyToFill][],\n private defaultValueFn: (key: Data[KeyToFill]) => Data,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<Data>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const existingKeys = new Set(childEvaluated.content.map((row) => row[this.keyField]));\n const minMax = this.getMinMaxFn(existingKeys);\n if (minMax === null) {\n return childEvaluated;\n }\n const { min, max } = minMax;\n const requiredKeys = this.getAllRequiredKeysFn(min, max);\n const content = childEvaluated.content;\n for (const key of requiredKeys) {\n if (!existingKeys.has(key)) {\n content.push(this.defaultValueFn(key));\n }\n }\n return { content };\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class GroupByOperator<Data, AggregationResult, KeyToGroupBy extends keyof Data>\n implements Operator<AggregationResult>\n{\n constructor(\n private child: Operator<Data>,\n private field: KeyToGroupBy,\n private aggregate: (values: Data[]) => AggregationResult,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<AggregationResult>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const grouped = new Map<Data[KeyToGroupBy], Data[]>();\n for (const row of childEvaluated.content) {\n const key = row[this.field];\n if (!grouped.has(key)) {\n grouped.set(key, []);\n }\n grouped.get(key)!.push(row);\n }\n const result = new Array<AggregationResult>();\n for (const [, values] of grouped) {\n result.push(this.aggregate(values));\n }\n\n return {\n content: result,\n };\n }\n}\n","import { GroupByOperator } from './GroupByOperator';\nimport { type Operator } from './Operator';\nimport { type NumberFields } from '../utils/type-utils';\n\ntype Result<Data, KeyToGroupBy extends keyof Data, KeyToSumBy extends keyof Data> = {\n [P in KeyToGroupBy | KeyToSumBy]: P extends KeyToGroupBy ? Data[KeyToGroupBy] : number;\n};\n\nexport class GroupByAndSumOperator<\n Data,\n KeyToGroupBy extends keyof Data,\n KeySoSumBy extends NumberFields<Data>,\n> extends GroupByOperator<Data, Result<Data, KeyToGroupBy, KeySoSumBy>, KeyToGroupBy> {\n constructor(child: Operator<Data>, groupByField: KeyToGroupBy, sumField: KeySoSumBy) {\n super(child, groupByField, (values: Data[]) => {\n let n = 0;\n for (const value of values) {\n n += value[sumField] as number;\n }\n return {\n [groupByField]: values[0][groupByField],\n [sumField]: n,\n } as Result<Data, KeyToGroupBy, KeySoSumBy>;\n });\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class MapOperator<S, T> implements Operator<T> {\n constructor(\n private child: Operator<S>,\n private func: (value: S) => T,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<T>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.map(this.func),\n };\n }\n}\n","import { MapOperator } from './MapOperator';\nimport type { Operator } from './Operator';\n\nexport class RenameFieldOperator<\n OldFieldName extends string,\n NewFieldName extends string,\n Data extends { [key in OldFieldName]: unknown },\n> extends MapOperator<Data, Data & { [key in NewFieldName]: Data[OldFieldName] }> {\n constructor(child: Operator<Data>, oldFieldName: OldFieldName, newFieldName: NewFieldName) {\n super(\n child,\n (value) =>\n ({\n ...value,\n [newFieldName]: value[oldFieldName],\n }) as Data & { [key in NewFieldName]: Data[OldFieldName] },\n );\n }\n}\n","import { type Operator } from './Operator';\n\nexport class SlidingOperator<Data, AggregationResult> implements Operator<AggregationResult> {\n constructor(\n private child: Operator<Data>,\n private windowSize: number,\n private aggregate: (values: Data[]) => AggregationResult,\n ) {\n if (windowSize < 1) {\n throw new Error('Window size must be at least 1');\n }\n }\n\n async evaluate(lapis: string, signal?: AbortSignal) {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const content = new Array<AggregationResult>();\n const numberOfWindows = Math.max(childEvaluated.content.length - this.windowSize, 0) + 1;\n for (let i = 0; i < numberOfWindows; i++) {\n content.push(this.aggregate(childEvaluated.content.slice(i, i + this.windowSize)));\n }\n return { content };\n }\n}\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { FillMissingOperator } from '../operator/FillMissingOperator';\nimport { GroupByAndSumOperator } from '../operator/GroupByAndSumOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { SlidingOperator } from '../operator/SlidingOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport type { LapisFilter, TemporalGranularity } from '../types';\nimport {\n dateRangeCompare,\n generateAllInRange,\n getMinMaxTemporal,\n parseDateStringToTemporal,\n type Temporal,\n} from '../utils/temporal';\n\nexport function queryAggregatedDataOverTime<LapisDateField extends string>(\n filter: LapisFilter,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n lapisDateField: LapisDateField,\n) {\n const fetchData = new FetchAggregatedOperator<{ [key in LapisDateField]: string | null }>(filter, [lapisDateField]);\n const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, 'date');\n const mapData = new MapOperator(dataWithFixedDateKey, (d) => mapDateToGranularityRange(d, granularity));\n const groupByData = new GroupByAndSumOperator(mapData, 'dateRange', 'count');\n const fillData = new FillMissingOperator(\n groupByData,\n 'dateRange',\n getMinMaxTemporal,\n generateAllInRange,\n (key) => ({ dateRange: key, count: 0 }),\n );\n const sortData = new SortOperator(fillData, dateRangeCompare);\n\n return smoothingWindow >= 1 ? new SlidingOperator(sortData, smoothingWindow, averageSmoothing) : sortData;\n}\n\nexport function mapDateToGranularityRange(\n data: { date: string | null; count: number },\n granularity: TemporalGranularity,\n) {\n return {\n dateRange: data.date === null ? null : parseDateStringToTemporal(data.date, granularity),\n count: data.count,\n };\n}\n\nfunction averageSmoothing(slidingWindow: { dateRange: Temporal | null; count: number }[]) {\n const average = slidingWindow.reduce((acc, curr) => acc + curr.count, 0) / slidingWindow.length;\n const centerIndex = Math.floor(slidingWindow.length / 2);\n return { dateRange: slidingWindow[centerIndex].dateRange, count: average };\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { type MappedNumber, type NumberFields } from '../utils/type-utils';\n\nexport type DivisionOperatorResult<\n KeyField extends keyof ValueObject,\n ValueObject,\n ResultField extends string,\n NumeratorField extends string,\n DenominatorField extends string,\n> = { [P in KeyField]: ValueObject[KeyField] } & MappedNumber<ResultField> &\n MappedNumber<NumeratorField> &\n MappedNumber<DenominatorField>;\n\nexport class DivisionOperator<\n ValueObject,\n KeyField extends keyof ValueObject,\n ValueField extends NumberFields<ValueObject>,\n ResultField extends string,\n NumeratorField extends string,\n DenominatorField extends string,\n> implements Operator<DivisionOperatorResult<KeyField, ValueObject, ResultField, NumeratorField, DenominatorField>>\n{\n constructor(\n private numerator: Operator<ValueObject>,\n private denominator: Operator<ValueObject>,\n private keyField: KeyField,\n private valueField: ValueField,\n private resultField: ResultField,\n private numeratorField: NumeratorField,\n private denominatorField: DenominatorField,\n ) {}\n\n async evaluate(\n lapis: string,\n signal?: AbortSignal,\n ): Promise<Dataset<DivisionOperatorResult<KeyField, ValueObject, ResultField, NumeratorField, DenominatorField>>> {\n const numeratorEvaluated = await this.numerator.evaluate(lapis, signal);\n const denominatorEvaluated = await this.denominator.evaluate(lapis, signal);\n\n const numeratorMap = new Map<ValueObject[KeyField], ValueObject[ValueField]>();\n numeratorEvaluated.content.forEach((row) => {\n numeratorMap.set(row[this.keyField], row[this.valueField]);\n });\n\n const content = denominatorEvaluated.content.map((row) => {\n const numeratorValue = numeratorMap.get(row[this.keyField]) ?? 0;\n return {\n [this.keyField]: row[this.keyField],\n [this.numeratorField]: numeratorValue as number,\n [this.denominatorField]: row[this.valueField] as number,\n [this.resultField]: (numeratorValue as number) / (row[this.valueField] as number),\n } as { [P in KeyField]: ValueObject[KeyField] } & MappedNumber<ResultField> &\n MappedNumber<NumeratorField> &\n MappedNumber<DenominatorField>;\n });\n\n return { content };\n }\n}\n","import { queryAggregatedDataOverTime } from './queryAggregatedDataOverTime';\nimport { DivisionOperator } from '../operator/DivisionOperator';\nimport { type LapisFilter, type NamedLapisFilter, type TemporalGranularity } from '../types';\nimport { type Temporal } from '../utils/temporal';\nimport { makeArray } from '../utils/utils';\n\nexport type PrevalenceOverTimeData = PrevalenceOverTimeVariantData[];\n\nexport type PrevalenceOverTimeVariantData = {\n displayName: string;\n content: PrevalenceOverTimeVariantDataPoint[];\n};\n\nexport type PrevalenceOverTimeVariantDataPoint = {\n count: number;\n prevalence: number;\n total: number;\n dateRange: Temporal | null;\n};\n\nexport function queryPrevalenceOverTime(\n numeratorFilter: NamedLapisFilter | NamedLapisFilter[],\n denominatorFilter: LapisFilter,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n lapis: string,\n lapisDateField: string,\n signal?: AbortSignal,\n): Promise<PrevalenceOverTimeData> {\n const numeratorFilters = makeArray(numeratorFilter);\n\n const denominatorData = queryAggregatedDataOverTime(\n denominatorFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n );\n const subQueries = numeratorFilters.map(async (namedLapisFilter) => {\n const { displayName, lapisFilter } = namedLapisFilter;\n const numeratorData = queryAggregatedDataOverTime(lapisFilter, granularity, smoothingWindow, lapisDateField);\n const divide = new DivisionOperator(\n numeratorData,\n denominatorData,\n 'dateRange',\n 'count',\n 'prevalence',\n 'count',\n 'total',\n );\n const dataset = await divide.evaluate(lapis, signal);\n return {\n displayName,\n content: dataset.content,\n };\n });\n return Promise.all(subQueries);\n}\n","import { type FunctionComponent } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nexport interface SelectProps {\n items: { label: string; value: string; disabled?: boolean }[];\n selected: string;\n onChange: JSXInternal.GenericEventHandler<HTMLSelectElement>;\n selectStyle?: string;\n}\n\nexport const Select: FunctionComponent<SelectProps> = ({ items, selected, onChange, selectStyle }) => {\n return (\n <select class={`select select-bordered ${selectStyle}`} value={selected} onChange={onChange}>\n {items.map((item) => (\n <option key={item.value} value={item.value} disabled={item.disabled}>\n {item.label}\n </option>\n ))}\n </select>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Select } from './select';\nimport type { ConfidenceIntervalMethod } from '../shared/charts/confideceInterval';\n\ntype ConfidenceIntervalSelectorProps = {\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n setConfidenceIntervalMethod: (method: ConfidenceIntervalMethod) => void;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n};\n\nexport const ConfidenceIntervalSelector: FunctionComponent<ConfidenceIntervalSelectorProps> = ({\n confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n confidenceIntervalMethods,\n}) => {\n if (confidenceIntervalMethods.length === 0) {\n return null;\n }\n\n const items = [\n { label: 'Confidence interval method', value: 'none', disabled: true },\n ...confidenceIntervalMethods.concat('none').map((method) => {\n switch (method) {\n case 'wilson':\n return { label: 'Wilson, 95% CI', value: 'wilson' };\n case 'none':\n return { label: 'None', value: 'none' };\n }\n }),\n ];\n\n return (\n <Select\n items={items}\n selected={confidenceIntervalMethod === undefined ? 'none' : confidenceIntervalMethod}\n onChange={(event: Event) => {\n const select = event.target as HTMLSelectElement;\n const value = select.value as ConfidenceIntervalMethod;\n setConfidenceIntervalMethod(value);\n }}\n selectStyle={'select-xs select-bordered'}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Select } from './select';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\n\nexport type ScalingSelectorProps = {\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n className?: string;\n enabledTypes?: ScaleType[];\n};\n\nconst scaleTypeItem: { label: string; value: ScaleType }[] = [\n { label: 'Linear', value: 'linear' },\n { label: 'Logarithmic', value: 'logarithmic' },\n { label: 'Logit', value: 'logit' },\n];\n\nexport const ScalingSelector: FunctionComponent<ScalingSelectorProps> = ({\n yAxisScaleType,\n setYAxisScaleType,\n className,\n enabledTypes,\n}) => {\n const items = [\n { label: 'y axis scaling type', value: 'none', disabled: true },\n ...scaleTypeItem.filter((item) => enabledTypes === undefined || enabledTypes.includes(item.value)),\n ];\n\n return (\n <Select\n items={items}\n selected={yAxisScaleType}\n onChange={(event: Event) => {\n const select = event.target as HTMLSelectElement;\n const value = select.value as ScaleType;\n setYAxisScaleType(value);\n }}\n selectStyle={`${className} select-xs select-bordered`}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport { getPrevalenceOverTimeTableData } from './getPrevalenceOverTimeTableData';\nimport PrevalenceOverTimeBarChart from './prevalence-over-time-bar-chart';\nimport PrevalenceOverTimeBubbleChart from './prevalence-over-time-bubble-chart';\nimport PrevalenceOverTimeLineChart from './prevalence-over-time-line-chart';\nimport PrevalenceOverTimeTable from './prevalence-over-time-table';\nimport { type PrevalenceOverTimeData, queryPrevalenceOverTime } from '../../query/queryPrevalenceOverTime';\nimport { type LapisFilter, type NamedLapisFilter, type TemporalGranularity } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ConfidenceIntervalSelector } from '../components/confidence-interval-selector';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info, { InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport { type ConfidenceIntervalMethod } from '../shared/charts/confideceInterval';\nimport type { YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { type ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'bar' | 'line' | 'bubble' | 'table';\n\nexport interface PrevalenceOverTimeProps extends PrevalenceOverTimeInnerProps {\n width: string;\n height: string;\n}\n\nexport interface PrevalenceOverTimeInnerProps {\n numeratorFilter: NamedLapisFilter | NamedLapisFilter[];\n denominatorFilter: LapisFilter;\n granularity: TemporalGranularity;\n smoothingWindow: number;\n views: View[];\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n lapisDateField: string;\n pageSize: boolean | number;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nexport const PrevalenceOverTime: FunctionComponent<PrevalenceOverTimeProps> = ({ width, height, ...innerProps }) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <PrevalenceOverTimeInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const PrevalenceOverTimeInner: FunctionComponent<PrevalenceOverTimeInnerProps> = ({\n numeratorFilter,\n denominatorFilter,\n granularity,\n smoothingWindow,\n views,\n confidenceIntervalMethods,\n lapisDateField,\n pageSize,\n yAxisMaxConfig,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(\n () =>\n queryPrevalenceOverTime(\n numeratorFilter,\n denominatorFilter,\n granularity,\n smoothingWindow,\n lapis,\n lapisDateField,\n ),\n [lapis, numeratorFilter, denominatorFilter, granularity, smoothingWindow],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return (\n <PrevalenceOverTimeTabs\n views={views}\n data={data}\n granularity={granularity}\n confidenceIntervalMethods={confidenceIntervalMethods}\n pageSize={pageSize}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n );\n};\n\ntype PrevalenceOverTimeTabsProps = {\n views: View[];\n data: PrevalenceOverTimeData;\n granularity: TemporalGranularity;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n pageSize: boolean | number;\n yAxisMaxConfig: YAxisMaxConfig;\n};\n\nconst PrevalenceOverTimeTabs: FunctionComponent<PrevalenceOverTimeTabsProps> = ({\n views,\n data,\n granularity,\n confidenceIntervalMethods,\n pageSize,\n yAxisMaxConfig,\n}) => {\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n const [confidenceIntervalMethod, setConfidenceIntervalMethod] = useState<ConfidenceIntervalMethod>(\n confidenceIntervalMethods.length > 0 ? confidenceIntervalMethods[0] : 'none',\n );\n\n const getTab = (view: View) => {\n switch (view) {\n case 'bar':\n return {\n title: 'Bar',\n content: (\n <PrevalenceOverTimeBarChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n confidenceIntervalMethod={confidenceIntervalMethod}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'line':\n return {\n title: 'Line',\n content: (\n <PrevalenceOverTimeLineChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n confidenceIntervalMethod={confidenceIntervalMethod}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'bubble':\n return {\n title: 'Bubble',\n content: (\n <PrevalenceOverTimeBubbleChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'table':\n return {\n title: 'Table',\n content: <PrevalenceOverTimeTable data={data} granularity={granularity} pageSize={pageSize} />,\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n data={data}\n granularity={granularity}\n confidenceIntervalMethods={confidenceIntervalMethods}\n confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n activeTab: string;\n data: PrevalenceOverTimeData;\n granularity: TemporalGranularity;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n setConfidenceIntervalMethod: (confidenceIntervalMethod: ConfidenceIntervalMethod) => void;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n yAxisScaleType,\n setYAxisScaleType,\n confidenceIntervalMethods,\n confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n data,\n granularity,\n}) => {\n return (\n <>\n {activeTab !== 'Table' && (\n <ScalingSelector yAxisScaleType={yAxisScaleType} setYAxisScaleType={setYAxisScaleType} />\n )}\n {(activeTab === 'Bar' || activeTab === 'Line') && (\n <ConfidenceIntervalSelector\n confidenceIntervalMethods={confidenceIntervalMethods}\n confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n />\n )}\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getPrevalenceOverTimeTableData(data, granularity)}\n filename='prevalence_over_time.csv'\n />\n\n <PrevalenceOverTimeInfo />\n </>\n );\n};\n\nconst PrevalenceOverTimeInfo: FunctionComponent = () => {\n return (\n <Info height={'100px'}>\n <InfoHeadline1>Prevalence over time</InfoHeadline1>\n <InfoParagraph>Prevalence over time info.</InfoParagraph>\n </Info>\n );\n};\n\nexport const maxInData = (data: PrevalenceOverTimeData) =>\n Math.max(...data.flatMap((variant) => variant.content.map((dataPoint) => dataPoint.prevalence)));\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { PrevalenceOverTime, type PrevalenceOverTimeProps } from '../../preact/prevalenceOverTime/prevalence-over-time';\nimport { type AxisMax } from '../../preact/shared/charts/getYAxisMax';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays the prevalence over time of one or more datasets, selected by LAPIS filters.\n * The prevalence is calculated as the ratio of the number of cases of each dataset to the number of cases of a reference dataset.\n * The reference dataset is also selected by a LAPIS filter.\n *\n * In the chart views,\n * - the user can select whether to display a confidence interval (not available in the bubble chart).\n * The confidence interval is calculated using [Wilson score interval](https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval),\n * with a confidence level of 95%.\n * - the x-axis shows time steps in the selected `granularity`.\n * - the user can select the y-axis scale (linear, logistic, logit).\n *\n * ## Views\n *\n * ### Bar View\n *\n * Displays the prevalence over time as a bar chart.\n * Shows a bar for each dataset of the `numeratorFilter` on every time step.\n *\n * ### Line View\n *\n * Displays the prevalence over time as a line chart.\n * Each data point is connected for better visibility.\n * Shows a line for each dataset of the `numeratorFilter`.\n *\n * ### Bubble View\n *\n * Displays the prevalence over time as a bubble chart.\n * The size of the bubbles represents the number of cases of the reference, defined by the `denominatorFilter`.\n * The height of the bubbles represents the prevalence of the datasets selected by the `numeratorFilters`.\n *\n * ### Table View\n *\n * Displays the prevalence over time as a table with one row per time point.\n */\n@customElement('gs-prevalence-over-time')\nexport class PrevalenceOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * Required.\n * Either a LAPIS filter or an array of LAPIS filters to calculate the prevalence for.\n *\n * The `lapisFilter` will be sent as is to LAPIS to select the data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used as the label the prevalence in the views.\n * It should be human-readable.\n *\n */\n @property({ type: Object })\n numeratorFilter:\n {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }\n | {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }[] = { displayName: '', lapisFilter: {} };\n\n /**\n * Required.\n *\n * The LAPIS filter, to select the data of the reference.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'day';\n\n /**\n * The number of time steps to use for smoothing the data.\n * `0` means no smoothing.\n * Must be a non-negative integer.\n *\n * For a given time, the shown value is the mean of the neighbouring measured values.\n * The `smoothingWindow` value provides the number of neighbouring values to take into account.\n * The resulting time is computed via `Math.floor(smoothingWindow / 2)`.\n */\n @property({ type: Number })\n smoothingWindow: number = 0;\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('bar' | 'line' | 'bubble' | 'table')[] = ['bar', 'line', 'bubble', 'table'];\n\n /**\n * A list of methods to calculate the confidence interval.\n * The option `none` is always available and disables confidence intervals.\n * Pass an empty array to disable the confidence interval selector.\n */\n @property({ type: Array })\n confidenceIntervalMethods: ('wilson' | 'none')[] = ['wilson'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n /**\n * The maximum value for the y-axis on all graphs in linear view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLinear: 'maxInData' | 'limitTo1' | number = 1;\n\n /**\n * The maximum value for the y-axis on all graphs in logarithmic view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLogarithmic: 'maxInData' | 'limitTo1' | number = 1;\n\n override render() {\n return (\n <PrevalenceOverTime\n numeratorFilter={this.numeratorFilter}\n denominatorFilter={this.denominatorFilter}\n granularity={this.granularity}\n smoothingWindow={this.smoothingWindow}\n views={this.views}\n confidenceIntervalMethods={this.confidenceIntervalMethods}\n width={this.width}\n height={this.height}\n lapisDateField={this.lapisDateField}\n pageSize={this.pageSize}\n yAxisMaxConfig={{\n linear: this.yAxisMaxLinear,\n logarithmic: this.yAxisMaxLogarithmic,\n }}\n />\n );\n }\n}\n\nexport interface PrevalenceOverTimeComponentProps extends Omit<PrevalenceOverTimeProps, 'yAxisMaxConfig'> {\n yAxisMaxLinear?: AxisMax;\n yAxisMaxLogarithmic?: AxisMax;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-prevalence-over-time': PrevalenceOverTimeComponent;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype NumeratorMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.numeratorFilter, PrevalenceOverTimeProps['numeratorFilter']>\n>;\ntype DenominatorMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.denominatorFilter, PrevalenceOverTimeProps['denominatorFilter']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.granularity, PrevalenceOverTimeProps['granularity']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.views, PrevalenceOverTimeProps['views']>\n>;\ntype ConfidenceIntervalMethodsMatches = Expect<\n Equals<\n typeof PrevalenceOverTimeComponent.prototype.confidenceIntervalMethods,\n PrevalenceOverTimeProps['confidenceIntervalMethods']\n >\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { Chart, type ChartConfiguration, registerables, type TooltipItem } from 'chart.js';\n\nimport { type YearMonthDay } from '../../utils/temporal';\nimport GsChart from '../components/chart';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { confidenceIntervalDataLabel } from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface RelativeGrowthAdvantageChartData {\n t: YearMonthDay[];\n proportion: number[];\n ciLower: number[];\n ciUpper: number[];\n observed: number[];\n params: {\n fd: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n };\n}\n\ninterface RelativeGrowthAdvantageChartProps {\n data: RelativeGrowthAdvantageChartData;\n yAxisScaleType: ScaleType;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst RelativeGrowthAdvantageChart = ({ data, yAxisScaleType, yAxisMaxConfig }: RelativeGrowthAdvantageChartProps) => {\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(Math.max(...data.proportion), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'line',\n data: {\n labels: data.t,\n datasets: datasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(),\n },\n },\n };\n\n return (\n <div className='flex h-full flex-col'>\n <RelativeGrowthAdvantageDisplay\n relativeAdvantage={data.params.fd.value}\n relativeAdvantageLowerBound={data.params.fd.ciLower}\n relativeAdvantageUpperBound={data.params.fd.ciUpper}\n />\n <div className='flex-1'>\n <GsChart configuration={config} />\n </div>\n </div>\n );\n};\n\nconst RelativeGrowthAdvantageDisplay = ({\n relativeAdvantage,\n relativeAdvantageLowerBound,\n relativeAdvantageUpperBound,\n}: {\n relativeAdvantage: number;\n relativeAdvantageLowerBound: number;\n relativeAdvantageUpperBound: number;\n}) => {\n return (\n <div class='mx-auto flex items-end flex-wrap'>\n <span class='text-[#606060]'>Relative advantage:</span>\n <div>\n <span class='text-2xl ml-3'> {formatProportion(relativeAdvantage)} </span>\n <span class='ml-2.5'>\n ({formatProportion(relativeAdvantageLowerBound)} - {formatProportion(relativeAdvantageUpperBound)})\n </span>\n </div>\n </div>\n );\n};\n\nconst datasets = (data: RelativeGrowthAdvantageChartData) => {\n return [\n {\n type: 'line' as const,\n label: 'Prevalence',\n data: data.proportion,\n borderWidth: 1,\n pointRadius: 0,\n borderColor: singleGraphColorRGBByName('indigo'),\n backgroundColor: singleGraphColorRGBByName('indigo'),\n },\n {\n type: 'line' as const,\n label: 'CI Lower',\n data: data.ciLower,\n borderWidth: 1,\n pointRadius: 0,\n fill: '+1',\n backgroundColor: singleGraphColorRGBByName('indigo', 0.3),\n },\n {\n type: 'line' as const,\n label: 'CI Upper',\n data: data.ciUpper,\n borderWidth: 1,\n pointRadius: 0,\n fill: '-1',\n backgroundColor: singleGraphColorRGBByName('indigo', 0.3),\n },\n {\n type: 'scatter' as const,\n label: 'Observed',\n data: data.observed,\n pointBackgroundColor: singleGraphColorRGBByName('green'),\n pointRadius: 2,\n },\n ];\n};\n\nconst tooltip = () => {\n return {\n mode: 'index' as const,\n intersect: false,\n filter: ({ datasetIndex }: TooltipItem<'line'>) => {\n return datasetIndex !== 1 && datasetIndex !== 2;\n },\n callbacks: {\n label: (context: TooltipItem<'line'>) => {\n switch (context.datasetIndex) {\n case 0: {\n const value = context.dataset.data[context.dataIndex];\n const ciLower = context.dataset.data[context.dataIndex + 1];\n const ciUpper = context.dataset.data[context.dataIndex + 2];\n if (typeof value !== 'number' || typeof ciLower !== 'number' || typeof ciUpper !== 'number') {\n return '';\n }\n return confidenceIntervalDataLabel(value, ciLower, ciUpper, context.dataset.label);\n }\n\n case 3: {\n const value = context.dataset.data[context.dataIndex];\n if (typeof value !== 'number') {\n return '';\n }\n return `Observed: ${value.toFixed(3)}`;\n }\n default:\n return '';\n }\n },\n },\n };\n};\n\nexport default RelativeGrowthAdvantageChart;\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { type LapisFilter } from '../types';\nimport { getMinMaxTemporal, TemporalCache, type YearMonthDay } from '../utils/temporal';\n\nexport type RelativeGrowthAdvantageData = Awaited<ReturnType<typeof queryRelativeGrowthAdvantage>>;\n\nexport async function queryRelativeGrowthAdvantage<LapisDateField extends string>(\n numerator: LapisFilter,\n denominator: LapisFilter,\n generationTime: number,\n lapis: string,\n lapisDateField: LapisDateField,\n signal?: AbortSignal,\n) {\n const fetchNumerator = new FetchAggregatedOperator<{\n [key in LapisDateField]: string | null;\n }>(numerator, [lapisDateField]);\n const fetchDenominator = new FetchAggregatedOperator<{\n [key in LapisDateField]: string | null;\n }>(denominator, [lapisDateField]);\n const mapToFixedDateKeyNumerator = new RenameFieldOperator(fetchNumerator, lapisDateField, 'date');\n const mapToFixedDateKeyDenominator = new RenameFieldOperator(fetchDenominator, lapisDateField, 'date');\n const mapNumerator = new MapOperator(mapToFixedDateKeyNumerator, toYearMonthDay);\n const mapDenominator = new MapOperator(mapToFixedDateKeyDenominator, toYearMonthDay);\n const [numeratorData, denominatorData] = await Promise.all([\n mapNumerator.evaluate(lapis, signal),\n mapDenominator.evaluate(lapis, signal),\n ]);\n const { min: minDate, max: maxDate } = getMinMaxTemporal(denominatorData.content.map((d) => d.date));\n if (!minDate && !maxDate) {\n return null;\n }\n\n const numeratorCounts = new Map<YearMonthDay, number>();\n numeratorData.content.forEach((d) => {\n if (d.date) {\n numeratorCounts.set(d.date, d.count);\n }\n });\n const denominatorCounts = new Map<YearMonthDay, number>();\n const requestData = {\n t: [] as number[],\n n: [] as number[],\n k: [] as number[],\n };\n denominatorData.content.forEach((d) => {\n if (d.date) {\n denominatorCounts.set(d.date, d.count);\n const t = d.date.minus(minDate);\n requestData.t.push(t);\n requestData.n.push(d.count);\n requestData.k.push(numeratorCounts.get(d.date) ?? 0);\n }\n });\n const requestPayload = {\n config: {\n alpha: 0.95,\n generationTime,\n initialCasesVariant: 1,\n initialCasesWildtype: 1,\n reproductionNumberWildtype: 1,\n tStart: 0,\n tEnd: maxDate.minus(minDate),\n },\n data: requestData,\n };\n const response = await fetch('https://cov-spectrum.org/api/v2/computed/model/chen2021Fitness', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestPayload),\n signal,\n });\n const responseData = (await response.json()) as {\n estimatedAbsoluteNumbers: {\n t: number[];\n variantCases: number[];\n wildtypeCases: number[];\n };\n estimatedProportions: {\n t: number[];\n proportion: number[];\n ciLower: number[];\n ciUpper: number[];\n };\n params: {\n a: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n fc: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n fd: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n t0: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n };\n };\n const transformed = {\n ...responseData,\n estimatedProportions: {\n ...responseData.estimatedProportions,\n t: responseData.estimatedProportions.t.map((t) => minDate.addDays(t)),\n },\n };\n const observedProportions = transformed.estimatedProportions.t.map(\n (t) => (numeratorCounts.get(t) ?? 0) / (denominatorCounts.get(t) ?? 0),\n );\n\n return {\n ...transformed,\n observedProportions,\n };\n}\n\nfunction toYearMonthDay(d: { date: string | null; count: number }) {\n const temporalCache = TemporalCache.getInstance();\n return {\n date: d.date ? temporalCache.getYearMonthDay(d.date) : null,\n count: d.count,\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport RelativeGrowthAdvantageChart from './relative-growth-advantage-chart';\nimport {\n queryRelativeGrowthAdvantage,\n type RelativeGrowthAdvantageData,\n} from '../../query/queryRelativeGrowthAdvantage';\nimport { type LapisFilter } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info, { InfoHeadline1, InfoHeadline2, InfoLink, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport { type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { type ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'line';\n\nexport interface RelativeGrowthAdvantageProps extends RelativeGrowthAdvantagePropsInner {\n width: string;\n height: string;\n}\n\nexport interface RelativeGrowthAdvantagePropsInner {\n numeratorFilter: LapisFilter;\n denominatorFilter: LapisFilter;\n generationTime: number;\n views: View[];\n lapisDateField: string;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nexport const RelativeGrowthAdvantage: FunctionComponent<RelativeGrowthAdvantageProps> = ({\n width,\n height,\n ...innerProps\n}) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <RelativeGrowthAdvantageInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const RelativeGrowthAdvantageInner: FunctionComponent<RelativeGrowthAdvantagePropsInner> = ({\n numeratorFilter,\n denominatorFilter,\n generationTime,\n views,\n lapisDateField,\n yAxisMaxConfig,\n}) => {\n const lapis = useContext(LapisUrlContext);\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n\n const { data, error, isLoading } = useQuery(\n () => queryRelativeGrowthAdvantage(numeratorFilter, denominatorFilter, generationTime, lapis, lapisDateField),\n [lapis, numeratorFilter, denominatorFilter, generationTime, views],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return (\n <RelativeGrowthAdvantageTabs\n data={data}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n views={views}\n generationTime={generationTime}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n );\n};\n\ntype RelativeGrowthAdvantageTabsProps = {\n data: NonNullable<RelativeGrowthAdvantageData>;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n views: View[];\n generationTime: number;\n yAxisMaxConfig: YAxisMaxConfig;\n};\n\nconst RelativeGrowthAdvantageTabs: FunctionComponent<RelativeGrowthAdvantageTabsProps> = ({\n data,\n yAxisScaleType,\n setYAxisScaleType,\n views,\n generationTime,\n yAxisMaxConfig,\n}) => {\n const getTab = (view: View) => {\n switch (view) {\n case 'line':\n return {\n title: 'Line',\n content: (\n <RelativeGrowthAdvantageChart\n data={{\n ...data.estimatedProportions,\n observed: data.observedProportions,\n params: data.params,\n }}\n yAxisScaleType={yAxisScaleType}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n const toolbar = () => (\n <RelativeGrowthAdvantageToolbar\n generationTime={generationTime}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype RelativeGrowthAdvantageToolbarProps = {\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n generationTime: number;\n};\n\nconst RelativeGrowthAdvantageToolbar: FunctionComponent<RelativeGrowthAdvantageToolbarProps> = ({\n yAxisScaleType,\n setYAxisScaleType,\n generationTime,\n}) => {\n return (\n <>\n <ScalingSelector yAxisScaleType={yAxisScaleType} setYAxisScaleType={setYAxisScaleType} />\n <RelativeGrowthAdvantageInfo generationTime={generationTime} />\n </>\n );\n};\n\nconst RelativeGrowthAdvantageInfo: FunctionComponent<{ generationTime: number }> = ({ generationTime }) => {\n return (\n <Info>\n <InfoHeadline1>Relative growth advantage</InfoHeadline1>\n <InfoParagraph>\n If variants spread pre-dominantly by local transmission across demographic groups, this estimate\n reflects the relative viral intrinsic growth advantage of the focal variant in the selected country and\n time frame. We report the relative growth advantage per {generationTime} days (in percentage; 0% means\n equal growth). Importantly, the relative growth advantage estimate reflects the advantage compared to\n the co-circulating variants. Thus, as new variants spread, the advantage of the focal variant may\n decrease. Different mechanisms can alter the intrinsic growth rate, including an intrinsic transmission\n advantage, immune evasion, and a prolonged infectious period. When absolute numbers of a variant are\n low, the growth advantage may merely reflect the current importance of introductions from abroad or the\n variant spreading in a particular demographic group. In this case, the estimate does not provide\n information on any intrinsic fitness advantages.\n </InfoParagraph>\n <InfoParagraph>\n Example: Assume that 10 infections from the focal variant and 100 infections from the co-circulating\n variants occur today and that the focal variant has a relative growth advantage of 50%. Then, if the\n number of new infections from the co-circulating variants remains at 100 in {generationTime} days from\n today, we expect the number of new infections from the focal variant to be 15.\n </InfoParagraph>\n\n <InfoHeadline2>Reference</InfoHeadline2>\n <InfoParagraph>\n Chen, Chaoran, et al. \"Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland.\"\n Epidemics (2021); doi:{' '}\n <InfoLink href='https://www.sciencedirect.com/science/article/pii/S1755436521000335?via=ihub'>\n 10.1016/j.epidem.2021.100480\n </InfoLink>\n </InfoParagraph>\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport {\n RelativeGrowthAdvantage,\n type RelativeGrowthAdvantageProps,\n type View,\n} from '../../preact/relativeGrowthAdvantage/relative-growth-advantage';\nimport { type AxisMax } from '../../preact/shared/charts/getYAxisMax';\nimport type { LapisFilter } from '../../types';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n *\n * For this component, we assume a discrete time model, where new infections happen exactly every `generationTime` days.\n * This is what we call a \"generation\".\n *\n * This component estimates the relative growth advantage of a variant (defined by its LAPIS filter) by performing a logistic regression.\n * Based on the inferred logistic growth rate, we derive the relative growth advantage (per generation).\n *\n * For details on the scientific method, see:\n * Chen, Chaoran, et al. \"Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland.\" Epidemics (2021);\n * doi: [10.1016/j.epidem.2021.100480](https://doi.org/10.1016/j.epidem.2021.100480)\n *\n * This component fetches aggregated data from LAPIS.\n * Then the data is sent to `https://cov-spectrum.org/api/v2/computed/model/chen2021Fitness`\n * which performs the logistic regression and calculates the relative growth advantage.\n *\n * ## Views\n *\n * ### Line View\n *\n * The line view shows the relative growth advantage over time in a line chart.\n * The dots in the plot show the proportions of the focal variant (defined by the `numeratorFilter`) to the baseline variant (defined by the `denominatorFilter`)\n * for every day as observed in the data.\n * The line shows a logistic curve fitted to the data points, including a 95% confidence interval.\n */\n@customElement('gs-relative-growth-advantage')\nexport class RelativeGrowthAdvantageComponent extends PreactLitAdapter {\n /**\n * Required.\n *\n * LAPIS filter to select the data of the focal variant.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n numeratorFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * Required.\n *\n * LAPIS filter to select the data of the baseline variant.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The generation time represents the number of days over which the variant's relative growth advantage is measured.\n * For example, if we set a generation time of 7 days, then we estimate the growth advantage per week.\n */\n @property({ type: Number })\n generationTime: number = 7;\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: 'line'[] = ['line'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n /**\n * The maximum value for the y-axis on all graphs in linear view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLinear: 'maxInData' | 'limitTo1' | number = 1;\n\n /**\n * The maximum value for the y-axis on all graphs in logarithmic view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLogarithmic: 'maxInData' | 'limitTo1' | number = 1;\n\n override render() {\n return (\n <RelativeGrowthAdvantage\n numeratorFilter={this.numeratorFilter}\n denominatorFilter={this.denominatorFilter}\n generationTime={this.generationTime}\n views={this.views}\n width={this.width}\n height={this.height}\n lapisDateField={this.lapisDateField}\n yAxisMaxConfig={{\n linear: this.yAxisMaxLinear,\n logarithmic: this.yAxisMaxLogarithmic,\n }}\n />\n );\n }\n}\n\nexport interface RelativeGrowthAdvantageComponentProps extends Omit<RelativeGrowthAdvantageProps, 'yAxisMaxConfig'> {\n yAxisMaxLinear?: AxisMax;\n yAxisMaxLogarithmic?: AxisMax;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype NumeratorMatches = Expect<Equals<typeof RelativeGrowthAdvantageComponent.prototype.numeratorFilter, LapisFilter>>;\ntype DenominatorMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.denominatorFilter, LapisFilter>\n>;\ntype ViewsMatches = Expect<Equals<typeof RelativeGrowthAdvantageComponent.prototype.views, View[]>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type InitialSort } from '../preact/aggregatedData/aggregate';\nimport { type LapisFilter } from '../types';\n\nexport type AggregateData = (Record<string, string | null | number | boolean> & {\n count: number;\n proportion: number;\n})[];\n\nexport const compareAscending = (a: string | null | number, b: string | null | number) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n const strA = a != null ? String(a) : '';\n const strB = b != null ? String(b) : '';\n\n return strA.localeCompare(strB);\n};\n\nexport async function queryAggregateData(\n lapisFilter: LapisFilter,\n fields: string[],\n lapis: string,\n initialSort: InitialSort = { field: 'count', direction: 'descending' },\n signal?: AbortSignal,\n) {\n const validSortFields = ['count', 'proportion', ...fields];\n if (!validSortFields.includes(initialSort.field)) {\n throw new Error(`InitialSort field not in fields. Valid fields are: ${validSortFields.join(', ')}`);\n }\n\n const fetchData = new FetchAggregatedOperator<Record<string, string | null | number>>(lapisFilter, fields);\n const sortData = new SortOperator(fetchData, (a, b) => {\n return initialSort.direction === 'ascending'\n ? compareAscending(a[initialSort.field], b[initialSort.field])\n : compareAscending(b[initialSort.field], a[initialSort.field]);\n });\n const data = (await sortData.evaluate(lapis, signal)).content;\n\n const total = data.reduce((acc, row) => acc + row.count, 0);\n\n return data.map(\n (row) =>\n ({\n ...row,\n proportion: row.count / total,\n }) as Record<string, string | null | number | boolean> & {\n count: number;\n proportion: number;\n },\n );\n}\n","import { type FunctionComponent } from 'preact';\n\nimport { type AggregateData, compareAscending } from '../../query/queryAggregateData';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ntype AggregateTableProps = {\n fields: string[];\n data: AggregateData;\n pageSize: boolean | number;\n};\n\nexport const AggregateTable: FunctionComponent<AggregateTableProps> = ({ data, fields, pageSize }) => {\n const headers = [\n ...fields.map((field) => {\n return {\n name: field,\n sort: {\n compare: compareAscending,\n },\n };\n }),\n {\n name: 'count',\n sort: true,\n },\n {\n name: 'proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ];\n\n return <Table data={data} columns={headers} pageSize={pageSize} />;\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\n\nimport { AggregateTable } from './aggregate-table';\nimport { type AggregateData, queryAggregateData } from '../../query/queryAggregateData';\nimport { type LapisFilter } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'table';\nexport type InitialSort = { field: string; direction: 'ascending' | 'descending' };\n\nexport type AggregateProps = {\n width: string;\n height: string;\n} & AggregateInnerProps;\n\nexport interface AggregateInnerProps {\n filter: LapisFilter;\n fields: string[];\n views: View[];\n initialSortField: string;\n initialSortDirection: 'ascending' | 'descending';\n pageSize: boolean | number;\n}\n\nexport const Aggregate: FunctionComponent<AggregateProps> = ({ width, height, ...innerProps }) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <AggregateInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const AggregateInner: FunctionComponent<AggregateInnerProps> = ({\n fields,\n views,\n filter,\n initialSortField,\n initialSortDirection,\n pageSize,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryAggregateData(filter, fields, lapis, { field: initialSortField, direction: initialSortDirection });\n }, [filter, fields, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <AggregatedDataTabs data={data} views={views} fields={fields} pageSize={pageSize} />;\n};\n\ntype AggregatedDataTabsProps = {\n data: AggregateData;\n fields: string[];\n views: View[];\n pageSize: boolean | number;\n};\n\nconst AggregatedDataTabs: FunctionComponent<AggregatedDataTabsProps> = ({ data, views, fields, pageSize }) => {\n const getTab = (view: View) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: <AggregateTable data={data} fields={fields} pageSize={pageSize} />,\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n return <Tabs tabs={tabs} toolbar={<Toolbar data={data} />} />;\n};\n\ntype ToolbarProps = {\n data: AggregateData;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({ data }) => {\n return (\n <div class='flex flex-row'>\n <CsvDownloadButton className='mx-1 btn btn-xs' getData={() => data} filename='aggregate.csv' />\n <Info height={'100px'}>Info for aggregate</Info>\n </div>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { Aggregate, type View } from '../../preact/aggregatedData/aggregate';\nimport { type LapisFilter } from '../../types';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays aggregated data in a table, which can provide an overview of the underlying data.\n *\n * It expects a list of `fields` to aggregate by and a `filter` to apply to the data.\n *\n * ## Views\n *\n * ### Table View\n *\n * In the table view, the data is presented in a table format where each field is a column,\n * along with the aggregated value and its proportion.\n * The proportion represents the ratio of the aggregated value to the total count of the data\n * (considering the applied filter).\n */\n@customElement('gs-aggregate')\nexport class AggregateComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * The fields to aggregate by.\n * Every field will be a table column.\n * Every field must exist in the backing LAPIS instance.\n *\n * If left empty, the component will only show the absolute count of the provided `filter` and proportion `100%`.\n */\n @property({ type: Array })\n fields: string[] = [];\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: View[] = ['table'];\n\n /**\n * The filter to apply to the data.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n filter: LapisFilter = {};\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The field by which the table is initially sorted.\n * Must be one of the fields specified in the fields property, 'count', or 'proportion'.\n */\n @property({ type: String })\n initialSortField: string = 'count';\n\n /**\n * The initial sort direction of the table.\n */\n @property({ type: String })\n initialSortDirection: 'ascending' | 'descending' = 'descending';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <Aggregate\n fields={this.fields}\n views={this.views}\n filter={this.filter}\n width={this.width}\n height={this.height}\n initialSortField={this.initialSortField}\n initialSortDirection={this.initialSortDirection}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-aggregate-component': AggregateComponent;\n }\n}\n","import type { NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport { generateAllInRange, getMinMaxTemporal, type Temporal } from '../../utils/temporal';\n\ntype TableRow<DateRangeKey extends string> = { [K in DateRangeKey]: string } & { [key: string]: number };\n\nexport const getNumberOfSequencesOverTimeTableData = <DateRangeKey extends string>(\n data: NumberOfSequencesDatasets,\n dateRangeKey: DateRangeKey,\n) => {\n const datasetsWithCountByDate = data.map(({ displayName, content }) => ({\n displayName,\n content: new Map(content.map((datum) => [datum.dateRange?.toString(), datum])),\n }));\n\n const allDateRangesThatOccurInData = datasetsWithCountByDate\n .map(({ content }) => [...content.values()].map((datum) => datum.dateRange))\n .reduce((acc, keys) => new Set([...acc, ...keys]), new Set<Temporal | null>());\n\n const minMax = getMinMaxTemporal(allDateRangesThatOccurInData);\n if (minMax === null) {\n return [];\n }\n\n const allDateRanges: (Temporal | null)[] = generateAllInRange(minMax.min, minMax.max);\n\n if (allDateRangesThatOccurInData.has(null)) {\n allDateRanges.unshift(null);\n }\n\n return allDateRanges.map((dateRange) => {\n return datasetsWithCountByDate.reduce(\n (acc, dataset) => ({\n ...acc,\n [dataset.displayName]: dataset.content.get(dateRange?.toString())?.count ?? 0,\n }),\n { [dateRangeKey]: dateRange?.toString() ?? 'Unknown' } as TableRow<DateRangeKey>,\n );\n });\n};\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport GsChart from '../components/chart';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface NumberSequencesOverBarChartProps {\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n}\n\nChart.register(...registerables);\n\nexport const NumberSequencesOverTimeBarChart = ({ data, yAxisScaleType }: NumberSequencesOverBarChartProps) => {\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'bar',\n data: {\n datasets: getDatasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: {\n type: getYAxisScale(yAxisScaleType).type,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n },\n },\n },\n }),\n [data, yAxisScaleType],\n );\n\n return <GsChart configuration={config} />;\n};\n\nconst getDatasets = (data: NumberOfSequencesDatasets) => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, 'date');\n\n return data.map(\n ({ displayName }, index) =>\n ({\n borderWidth: 1,\n label: displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: tableData.map((row) => ({\n x: row.date,\n y: row[displayName],\n })),\n }) as ChartDataset<'bar', { x: string; y: number }[]>,\n );\n};\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport GsChart from '../components/chart';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface NumberSequencesOverBarChartProps {\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n}\n\nChart.register(...registerables);\n\nexport const NumberSequencesOverTimeLineChart = ({ data, yAxisScaleType }: NumberSequencesOverBarChartProps) => {\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'line',\n data: {\n datasets: getDatasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: {\n type: getYAxisScale(yAxisScaleType).type,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n },\n },\n },\n }),\n [data, yAxisScaleType],\n );\n\n return <GsChart configuration={config} />;\n};\n\nconst getDatasets = (data: NumberOfSequencesDatasets) => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, 'date');\n\n return data.map(\n ({ displayName }, index) =>\n ({\n borderWidth: 1,\n pointRadius: 0,\n label: displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: tableData.map((row) => ({\n x: row.date,\n y: row[displayName],\n })),\n }) as ChartDataset<'line', { x: string; y: number }[]>,\n );\n};\n","import { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport { type TemporalGranularity } from '../../types';\nimport { Table } from '../components/table';\n\ninterface NumberSequencesOverTimeTableProps {\n data: NumberOfSequencesDatasets;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nexport const NumberSequencesOverTimeTable = ({ data, granularity, pageSize }: NumberSequencesOverTimeTableProps) => {\n const columns = [\n {\n name: granularity,\n sort: true,\n },\n ...data.map((dataset) => ({\n name: dataset.displayName,\n sort: true,\n })),\n ];\n\n const flatTableData = useMemo(() => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, granularity);\n return Object.values(tableData).map((row) => Object.values(row));\n }, [data, granularity]);\n\n return <Table data={flatTableData} columns={columns} pageSize={pageSize} />;\n};\n","import { queryAggregatedDataOverTime } from './queryAggregatedDataOverTime';\nimport { type NamedLapisFilter, type TemporalGranularity } from '../types';\nimport { sortNullToBeginningThenByDate } from '../utils/sort';\nimport { makeArray } from '../utils/utils';\n\nexport type NumberOfSequencesDatasets = Awaited<ReturnType<typeof queryNumberOfSequencesOverTime>>;\n\nexport async function queryNumberOfSequencesOverTime(\n lapis: string,\n lapisFilter: NamedLapisFilter | NamedLapisFilter[],\n lapisDateField: string,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n) {\n const lapisFilters = makeArray(lapisFilter);\n\n const queries = lapisFilters.map(async ({ displayName, lapisFilter }) => {\n const { content } = await queryAggregatedDataOverTime(\n lapisFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n ).evaluate(lapis);\n\n return {\n displayName,\n content: content.sort(sortNullToBeginningThenByDate),\n };\n });\n\n return Promise.all(queries);\n}\n","import { useContext, useState } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { NumberSequencesOverTimeBarChart } from './number-sequences-over-time-bar-chart';\nimport { NumberSequencesOverTimeLineChart } from './number-sequences-over-time-line-chart';\nimport { NumberSequencesOverTimeTable } from './number-sequences-over-time-table';\nimport {\n type NumberOfSequencesDatasets,\n queryNumberOfSequencesOverTime,\n} from '../../query/queryNumberOfSequencesOverTime';\nimport type { NamedLapisFilter, TemporalGranularity } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info, { InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\ntype NumberSequencesOverTimeView = 'bar' | 'line' | 'table';\n\nexport interface NumberSequencesOverTimeProps extends NumberSequencesOverTimeInnerProps {\n width: string;\n height: string;\n}\n\ninterface NumberSequencesOverTimeInnerProps {\n lapisFilter: NamedLapisFilter | NamedLapisFilter[];\n lapisDateField: string;\n views: NumberSequencesOverTimeView[];\n granularity: TemporalGranularity;\n smoothingWindow: number;\n pageSize: boolean | number;\n}\n\nexport const NumberSequencesOverTime = ({ width, height, ...innerProps }: NumberSequencesOverTimeProps) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <NumberSequencesOverTimeInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst NumberSequencesOverTimeInner = ({\n lapisFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n views,\n pageSize,\n}: NumberSequencesOverTimeInnerProps) => {\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(() =>\n queryNumberOfSequencesOverTime(lapis, lapisFilter, lapisDateField, granularity, smoothingWindow),\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <NumberSequencesOverTimeTabs views={views} data={data} granularity={granularity} pageSize={pageSize} />;\n};\n\ninterface NumberSequencesOverTimeTabsProps {\n views: NumberSequencesOverTimeView[];\n data: NumberOfSequencesDatasets;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nconst NumberSequencesOverTimeTabs = ({ views, data, granularity, pageSize }: NumberSequencesOverTimeTabsProps) => {\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n\n const getTab = (view: NumberSequencesOverTimeView) => {\n switch (view) {\n case 'bar':\n return {\n title: 'Bar',\n content: <NumberSequencesOverTimeBarChart data={data} yAxisScaleType={yAxisScaleType} />,\n };\n case 'line':\n return {\n title: 'Line',\n content: <NumberSequencesOverTimeLineChart data={data} yAxisScaleType={yAxisScaleType} />,\n };\n case 'table':\n return {\n title: 'Table',\n content: <NumberSequencesOverTimeTable data={data} granularity={granularity} pageSize={pageSize} />,\n };\n default:\n throw new Error(`Unknown view: ${view}`);\n }\n };\n\n return (\n <Tabs\n tabs={views.map((view) => getTab(view))}\n toolbar={(activeTab) => (\n <Toolbar\n activeTab={activeTab}\n data={data}\n granularity={granularity}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n />\n )}\n />\n );\n};\n\ninterface ToolbarProps {\n activeTab: string;\n data: NumberOfSequencesDatasets;\n granularity: TemporalGranularity;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n}\n\nconst Toolbar = ({ activeTab, data, granularity, yAxisScaleType, setYAxisScaleType }: ToolbarProps) => {\n return (\n <>\n {activeTab !== 'Table' && (\n <ScalingSelector\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n enabledTypes={['linear', 'logarithmic']}\n />\n )}\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getNumberOfSequencesOverTimeTableData(data, granularity)}\n filename='number_of_sequences_over_time.csv'\n />\n <NumberSequencesOverTimeInfo />\n </>\n );\n};\n\nconst NumberSequencesOverTimeInfo = () => (\n <Info height='100px'>\n <InfoHeadline1>Number of sequences over time</InfoHeadline1>\n <InfoParagraph>\n <a href='https://github.com/GenSpectrum/dashboard-components/issues/315'>TODO</a>\n </InfoParagraph>\n </Info>\n);\n","import { customElement, property } from 'lit/decorators.js';\n\nimport {\n NumberSequencesOverTime,\n type NumberSequencesOverTimeProps,\n} from '../../preact/numberSequencesOverTime/number-sequences-over-time';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays the number of sequences over time of one or more datasets,\n * selected by LAPIS filters.\n *\n * In the chart views, the user can select the y-axis scale (linear, logistic).\n * The x-axis shows all available time intervals available in the datasets in the selected `granularity`.\n * Thus, the `lapisFilter` implicitly also defines the range that is shown on the x-axis.\n * If you want to restrict the x-axis to a smaller date range,\n * then you need to set appropriate filter values in the `lapisFilter`.\n */\n@customElement('gs-number-sequences-over-time')\nexport class NumberSequencesOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * Required.\n *\n * Either a LAPIS filter or an array of LAPIS filters to fetch the number of sequences for.\n *\n * The `lapisFilter` will be sent as is to LAPIS to select the data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used to label the component views.\n * It should be human-readable.\n *\n */ @property({type: Object})\n lapisFilter:\n {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }\n | {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }[]= { displayName: '', lapisFilter: {} };\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('bar' | 'line' | 'table')[] = ['bar', 'line', 'table'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'day';\n\n /**\n * The number of time steps to use for smoothing the data.\n * `0` means no smoothing.\n * Must be a non-negative integer.\n *\n * For a given time, the shown value is the mean of the neighbouring measured values.\n * The `smoothingWindow` value provides the number of neighbouring values to take into account.\n * The resulting time is computed via `Math.floor(smoothingWindow / 2)`.\n */\n @property({ type: Number })\n smoothingWindow: number = 0;\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <NumberSequencesOverTime\n lapisFilter={this.lapisFilter}\n lapisDateField={this.lapisDateField}\n views={this.views}\n width={this.width}\n height={this.height}\n granularity={this.granularity}\n smoothingWindow={this.smoothingWindow}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.lapisFilter, NumberSequencesOverTimeProps['lapisFilter']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.views, NumberSequencesOverTimeProps['views']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.granularity, NumberSequencesOverTimeProps['granularity']>\n>;\ntype SmoothingWindowMatches = Expect<\n Equals<\n typeof NumberSequencesOverTimeComponent.prototype.smoothingWindow,\n NumberSequencesOverTimeProps['smoothingWindow']\n >\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type MutationOverTimeDataGroupedByMutation } from '../../query/queryMutationsOverTime';\nimport type { DisplayedSegment } from '../components/SegmentSelector';\nimport type { DisplayedMutationType } from '../components/mutation-type-selector';\n\nexport function getFilteredMutationOverTimeData(\n data: MutationOverTimeDataGroupedByMutation,\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n proportionInterval: { min: number; max: number },\n) {\n const filteredData = data.copy();\n filterDisplayedSegments(displayedSegments, filteredData);\n filterMutationTypes(displayedMutationTypes, filteredData);\n filterProportion(filteredData, proportionInterval);\n\n return filteredData;\n}\n\nexport function filterDisplayedSegments(\n displayedSegments: DisplayedSegment[],\n data: MutationOverTimeDataGroupedByMutation,\n) {\n displayedSegments.forEach((segment) => {\n if (!segment.checked) {\n data.getFirstAxisKeys().forEach((mutation) => {\n if (mutation.segment === segment.segment) {\n data.deleteRow(mutation);\n }\n });\n }\n });\n}\n\nexport function filterMutationTypes(\n displayedMutationTypes: DisplayedMutationType[],\n data: MutationOverTimeDataGroupedByMutation,\n) {\n displayedMutationTypes.forEach((mutationType) => {\n if (!mutationType.checked) {\n data.getFirstAxisKeys().forEach((mutation) => {\n if (mutationType.type === mutation.type) {\n data.deleteRow(mutation);\n }\n });\n }\n });\n}\n\nexport function filterProportion(\n data: MutationOverTimeDataGroupedByMutation,\n proportionInterval: {\n min: number;\n max: number;\n },\n) {\n data.getFirstAxisKeys().forEach((mutation) => {\n const row = data.getRow(mutation, { count: 0, proportion: 0 });\n if (\n !row.some(\n (value) => value.proportion >= proportionInterval.min && value.proportion <= proportionInterval.max,\n )\n ) {\n data.deleteRow(mutation);\n }\n });\n}\n","import { flip, offset, shift } from '@floating-ui/dom';\nimport { type FunctionComponent } from 'preact';\nimport { useRef } from 'preact/hooks';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nimport { dropdownClass } from './dropdown';\nimport { useFloatingUi } from '../shared/floating-ui/hooks';\n\nexport type TooltipProps = {\n content: string | JSXInternal.Element;\n};\n\nconst Tooltip: FunctionComponent<TooltipProps> = ({ children, content }) => {\n const referenceRef = useRef<HTMLDivElement>(null);\n const floatingRef = useRef<HTMLDivElement>(null);\n\n useFloatingUi(referenceRef, floatingRef, [offset(5), shift(), flip()]);\n\n return (\n <div className='relative'>\n <div className='peer' ref={referenceRef}>\n {children}\n </div>\n <div ref={floatingRef} className={`${dropdownClass} hidden peer-hover:block`}>\n {content}\n </div>\n </div>\n );\n};\n\nexport default Tooltip;\n","import { Fragment, type FunctionComponent } from 'preact';\n\nimport {\n type MutationOverTimeDataGroupedByMutation,\n type MutationOverTimeMutationValue,\n} from '../../query/queryMutationsOverTime';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { compareTemporal, type Temporal, YearMonthDay } from '../../utils/temporal';\nimport { UserFacingError } from '../components/error-display';\nimport Tooltip from '../components/tooltip';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsOverTimeGridProps {\n data: MutationOverTimeDataGroupedByMutation;\n}\n\nconst MAX_NUMBER_OF_GRID_ROWS = 100;\n\nconst MutationsOverTimeGrid: FunctionComponent<MutationsOverTimeGridProps> = ({ data }) => {\n const mutations = data.getFirstAxisKeys();\n if (mutations.length > MAX_NUMBER_OF_GRID_ROWS) {\n throw new UserFacingError(\n 'Too many mutations',\n `The dataset contains ${mutations.length} mutations. ` +\n `Please adapt the filters to reduce the number to below ${MAX_NUMBER_OF_GRID_ROWS}.`,\n );\n }\n\n const dates = data.getSecondAxisKeys().sort((a, b) => compareTemporal(a, b));\n\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateRows: `repeat(${mutations.length}, 24px)`,\n gridTemplateColumns: `8rem repeat(${dates.length}, minmax(1.5rem, 1fr))`,\n }}\n >\n {mutations.map((mutation, i) => {\n return (\n <Fragment key={`fragment-${mutation.toString()}`}>\n <div\n key={`mutation-${mutation.toString()}`}\n style={{ gridRowStart: i + 1, gridColumnStart: 1 }}\n >\n <MutationCell mutation={mutation} />\n </div>\n {dates.map((date, j) => {\n const value = data.get(mutation, date) ?? { proportion: 0, count: 0 };\n return (\n <div\n style={{ gridRowStart: i + 1, gridColumnStart: j + 2 }}\n key={`${mutation.toString()}-${date.toString()}`}\n >\n <ProportionCell value={value} date={date} mutation={mutation} />\n </div>\n );\n })}\n </Fragment>\n );\n })}\n </div>\n );\n};\n\nconst ProportionCell: FunctionComponent<{\n value: MutationOverTimeMutationValue;\n date: Temporal;\n mutation: Substitution | Deletion;\n}> = ({ value, mutation, date }) => {\n const tooltipContent = (\n <div>\n <p>\n <span className='font-bold'>{date.englishName()}</span> ({timeIntervalDisplay(date)})\n </p>\n <p>{mutation.code}</p>\n <p>Proportion: {formatProportion(value.proportion)}</p>\n <p>Count: {value.count}</p>\n </div>\n );\n\n return (\n <>\n <div className={'py-1'}>\n <Tooltip content={tooltipContent}>\n <div\n style={{\n backgroundColor: backgroundColor(value.proportion),\n color: textColor(value.proportion),\n }}\n className='text-center hover:font-bold text-xs'\n >\n {formatProportion(value.proportion, 0)}\n </div>\n </Tooltip>\n </div>\n </>\n );\n};\n\nconst timeIntervalDisplay = (date: Temporal) => {\n if (date instanceof YearMonthDay) {\n return date.toString();\n }\n\n return `${date.firstDay.toString()} - ${date.lastDay.toString()}`;\n};\n\nconst backgroundColor = (proportion: number) => {\n // TODO(#353): Make minAlpha and maxAlpha configurable\n const minAlpha = 0.0;\n const maxAlpha = 1;\n\n const alpha = minAlpha + (maxAlpha - minAlpha) * proportion;\n return singleGraphColorRGBByName('indigo', alpha);\n};\n\nconst textColor = (proportion: number) => {\n return proportion > 0.5 ? 'white' : 'black';\n};\n\nconst MutationCell: FunctionComponent<{ mutation: Substitution | Deletion }> = ({ mutation }) => {\n return <div className='text-center'>{mutation.toString()}</div>;\n};\n\nexport default MutationsOverTimeGrid;\n","import hash from 'object-hash';\n\nexport class Map2d<Key1 extends object | string, Key2 extends object | string, Value> {\n readonly data: Map<string, Map<string, Value>> = new Map<string, Map<string, Value>>();\n readonly keysFirstAxis = new Map<string, Key1>();\n readonly keysSecondAxis = new Map<string, Key2>();\n\n constructor(\n readonly serializeFirstAxis: (key: Key1) => string = (key) => (typeof key === 'string' ? key : hash(key)),\n readonly serializeSecondAxis: (key: Key2) => string = (key) => (typeof key === 'string' ? key : hash(key)),\n ) {}\n\n get(keyFirstAxis: Key1, keySecondAxis: Key2) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n return this.data.get(serializedKeyFirstAxis)?.get(serializedKeySecondAxis);\n }\n\n getRow(key: Key1, fillEmptyWith: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n const row = this.data.get(serializedKeyFirstAxis);\n if (row === undefined) {\n return [];\n }\n return Array.from(this.keysSecondAxis.keys()).map((key) => row.get(key) ?? fillEmptyWith);\n }\n\n set(keyFirstAxis: Key1, keySecondAxis: Key2, value: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n\n if (!this.data.has(serializedKeyFirstAxis)) {\n this.data.set(serializedKeyFirstAxis, new Map<string, Value>());\n }\n\n this.data.get(serializedKeyFirstAxis)!.set(serializedKeySecondAxis, value);\n\n this.keysFirstAxis.set(serializedKeyFirstAxis, keyFirstAxis);\n this.keysSecondAxis.set(serializedKeySecondAxis, keySecondAxis);\n }\n\n deleteRow(key: Key1) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n this.data.delete(serializedKeyFirstAxis);\n this.keysFirstAxis.delete(serializedKeyFirstAxis);\n }\n\n getFirstAxisKeys() {\n return Array.from(this.keysFirstAxis.values());\n }\n\n getSecondAxisKeys() {\n return Array.from(this.keysSecondAxis.values());\n }\n\n getAsArray(fillEmptyWith: Value) {\n return this.getFirstAxisKeys().map((firstAxisKey) => {\n return this.getSecondAxisKeys().map((secondAxisKey) => {\n return this.get(firstAxisKey, secondAxisKey) ?? fillEmptyWith;\n });\n });\n }\n\n copy() {\n const copy = new Map2d<Key1, Key2, Value>(this.serializeFirstAxis, this.serializeSecondAxis);\n this.data.forEach((value, key) => {\n const keyFirstAxis = this.keysFirstAxis.get(key);\n value.forEach((value, key) => {\n const keySecondAxis = this.keysSecondAxis.get(key);\n copy.set(keyFirstAxis!, keySecondAxis!, value);\n });\n });\n return copy;\n }\n}\n","import { mapDateToGranularityRange } from './queryAggregatedDataOverTime';\nimport { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { FetchSubstitutionsOrDeletionsOperator } from '../operator/FetchSubstitutionsOrDeletionsOperator';\nimport { GroupByAndSumOperator } from '../operator/GroupByAndSumOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { UserFacingError } from '../preact/components/error-display';\nimport {\n type LapisFilter,\n type SequenceType,\n type SubstitutionOrDeletionEntry,\n type TemporalGranularity,\n} from '../types';\nimport { Map2d } from '../utils/Map2d';\nimport { type Deletion, type Substitution } from '../utils/mutations';\nimport {\n dateRangeCompare,\n generateAllInRange,\n getMinMaxTemporal,\n parseDateStringToTemporal,\n type Temporal,\n} from '../utils/temporal';\n\nexport type MutationOverTimeData = {\n date: Temporal;\n mutations: SubstitutionOrDeletionEntry[];\n};\n\nexport type MutationOverTimeMutationValue = { proportion: number; count: number };\nexport type MutationOverTimeDataGroupedByMutation = Map2d<\n Substitution | Deletion,\n Temporal,\n MutationOverTimeMutationValue\n>;\n\nconst MAX_NUMBER_OF_GRID_COLUMNS = 200;\n\nexport async function queryMutationsOverTimeData(\n lapisFilter: LapisFilter,\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n lapisDateField: string,\n granularity: TemporalGranularity,\n signal?: AbortSignal,\n) {\n const allDates = await getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);\n\n if (allDates.length > MAX_NUMBER_OF_GRID_COLUMNS) {\n throw new UserFacingError(\n 'Too many dates',\n `The dataset would contain ${allDates.length} date intervals. ` +\n `Please reduce the number to below ${MAX_NUMBER_OF_GRID_COLUMNS} to display the data. ` +\n 'You can achieve this by either narrowing the date range in the provided LAPIS filter or by selecting a larger granularity.',\n );\n }\n\n const subQueries = allDates.map(async (date) => {\n const dateFrom = date.firstDay.toString();\n const dateTo = date.lastDay.toString();\n\n const filter = {\n ...lapisFilter,\n [`${lapisDateField}From`]: dateFrom,\n [`${lapisDateField}To`]: dateTo,\n };\n\n const data = await fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType).evaluate(lapis, signal);\n return {\n date,\n mutations: data.content,\n };\n });\n\n const data = await Promise.all(subQueries);\n\n return groupByMutation(data);\n}\n\nasync function getDatesInDataset(\n lapisFilter: LapisFilter,\n lapis: string,\n granularity: TemporalGranularity,\n lapisDateField: string,\n signal: AbortSignal | undefined,\n) {\n const { content: availableDates } = await queryAvailableDates(\n lapisFilter,\n lapis,\n granularity,\n lapisDateField,\n signal,\n );\n\n const { dateFrom, dateTo } = getDateRangeFromFilter(lapisFilter, lapisDateField, granularity);\n const { min, max } = getMinMaxTemporal(availableDates);\n\n return generateAllInRange(dateFrom ?? min, dateTo ?? max);\n}\n\nfunction getDateRangeFromFilter(lapisFilter: LapisFilter, lapisDateField: string, granularity: TemporalGranularity) {\n const valueFromFilter = lapisFilter[lapisDateField] as string | null;\n\n if (valueFromFilter) {\n return {\n dateFrom: parseDateStringToTemporal(valueFromFilter, granularity),\n dateTo: parseDateStringToTemporal(valueFromFilter, granularity),\n };\n }\n\n const minFromFilter = lapisFilter[`${lapisDateField}From`] as string | null;\n const maxFromFilter = lapisFilter[`${lapisDateField}To`] as string | null;\n\n return {\n dateFrom: minFromFilter ? parseDateStringToTemporal(minFromFilter, granularity) : null,\n dateTo: maxFromFilter ? parseDateStringToTemporal(maxFromFilter, granularity) : null,\n };\n}\n\nfunction queryAvailableDates(\n lapisFilter: LapisFilter,\n lapis: string,\n granularity: TemporalGranularity,\n lapisDateField: string,\n signal?: AbortSignal,\n) {\n return fetchAndPrepareDates(lapisFilter, granularity, lapisDateField).evaluate(lapis, signal);\n}\n\nfunction fetchAndPrepareDates<LapisDateField extends string>(\n filter: LapisFilter,\n granularity: TemporalGranularity,\n lapisDateField: LapisDateField,\n) {\n const fetchData = new FetchAggregatedOperator<{ [key in LapisDateField]: string | null }>(filter, [lapisDateField]);\n const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, 'date');\n const mapData = new MapOperator(dataWithFixedDateKey, (data) => mapDateToGranularityRange(data, granularity));\n const groupByData = new GroupByAndSumOperator(mapData, 'dateRange', 'count');\n const sortData = new SortOperator(groupByData, dateRangeCompare);\n return new MapOperator(sortData, (data) => data.dateRange);\n}\n\nfunction fetchAndPrepareSubstitutionsOrDeletions(filter: LapisFilter, sequenceType: SequenceType) {\n return new FetchSubstitutionsOrDeletionsOperator(filter, sequenceType, 0.001);\n}\n\nexport function groupByMutation(data: MutationOverTimeData[]) {\n const dataArray = new Map2d<Substitution | Deletion, Temporal, MutationOverTimeMutationValue>(\n (mutation) => mutation.code,\n (date) => date.toString(),\n );\n\n data.forEach((mutationData) => {\n mutationData.mutations.forEach((mutationEntry) => {\n dataArray.set(mutationEntry.mutation, mutationData.date, {\n count: mutationEntry.count,\n proportion: mutationEntry.proportion,\n });\n });\n });\n\n addZeroValuesForDatesWithNoMutationData(dataArray, data);\n\n return dataArray;\n}\n\nfunction addZeroValuesForDatesWithNoMutationData(\n dataArray: Map2d<Substitution | Deletion, Temporal, MutationOverTimeMutationValue>,\n data: MutationOverTimeData[],\n) {\n if (dataArray.getFirstAxisKeys().length !== 0) {\n const someMutation = dataArray.getFirstAxisKeys()[0];\n data.forEach((mutationData) => {\n if (mutationData.mutations.length === 0) {\n dataArray.set(someMutation, mutationData.date, { count: 0, proportion: 0 });\n }\n });\n }\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useMemo, useState } from 'preact/hooks';\n\nimport { getFilteredMutationOverTimeData } from './getFilteredMutationsOverTimeData';\nimport MutationsOverTimeGrid from './mutations-over-time-grid';\nimport {\n type MutationOverTimeDataGroupedByMutation,\n queryMutationsOverTimeData,\n} from '../../query/queryMutationsOverTime';\nimport { type LapisFilter, type SequenceType, type TemporalGranularity } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/SegmentSelector';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport Info from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'grid';\n\nexport interface MutationsOverTimeInnerProps {\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n views: View[];\n granularity: TemporalGranularity;\n lapisDateField: string;\n}\n\nexport interface MutationsOverTimeProps extends MutationsOverTimeInnerProps {\n width: string;\n height: string;\n}\n\nexport const MutationsOverTime: FunctionComponent<MutationsOverTimeProps> = ({ width, height, ...innerProps }) => {\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <MutationsOverTimeInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationsOverTimeInner: FunctionComponent<MutationsOverTimeInnerProps> = ({\n lapisFilter,\n sequenceType,\n views,\n granularity,\n lapisDateField,\n}) => {\n const lapis = useContext(LapisUrlContext);\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationsOverTimeData(lapisFilter, sequenceType, lapis, lapisDateField, granularity);\n }, [lapisFilter, sequenceType, lapis, granularity, lapisDateField]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MutationsOverTimeTabs mutationOverTimeData={data} sequenceType={sequenceType} views={views} />;\n};\n\ntype MutationOverTimeTabsProps = {\n mutationOverTimeData: MutationOverTimeDataGroupedByMutation;\n sequenceType: SequenceType;\n views: View[];\n};\n\nconst MutationsOverTimeTabs: FunctionComponent<MutationOverTimeTabsProps> = ({\n mutationOverTimeData,\n sequenceType,\n views,\n}) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 0.9 });\n\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(sequenceType);\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n\n const filteredData = useMemo(\n () =>\n getFilteredMutationOverTimeData(\n mutationOverTimeData,\n displayedSegments,\n displayedMutationTypes,\n proportionInterval,\n ),\n [mutationOverTimeData, displayedSegments, displayedMutationTypes, proportionInterval],\n );\n\n const getTab = (view: View) => {\n switch (view) {\n case 'grid':\n return {\n title: 'Grid',\n content: <MutationsOverTimeGrid data={filteredData} />,\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n const toolbar = () => (\n <Toolbar\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n proportionInterval,\n setProportionInterval,\n}) => {\n return (\n <>\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\n />\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n {/* TODO(#362): Add download button */}\n </>\n <Info height={'100px'}>Info for mutations over time</Info>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { MutationsOverTime, type MutationsOverTimeProps } from '../../preact/mutationsOverTime/mutations-over-time';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays mutations (substitutions and deletions) over time for a dataset selected by a LAPIS filter.\n * The shown date range is determined by the date field in the LAPIS filter.\n * If the date field is not set, the date range is determined by all available dates in the dataset.\n *\n * ## Views\n *\n * ### Grid View\n *\n * The grid view shows the proportion for each mutation over date ranges.\n *\n * The grid will show at max 100 rows and 200 columns for browser performance reasons.\n * More data might make the browser unresponsive.\n * If the numbers are exceeded, an error message will be shown.\n * In both cases, the `lapisFilter` should be narrowed down to reduce the number of mutations or date ranges.\n * The number of date ranges can also be reduced by selecting a larger granularity (months instead of weeks).\n */\n@customElement('gs-mutations-over-time')\nexport class MutationsOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * LAPIS filter to select the displayed data.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: 'grid'[] = ['grid'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'week';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used for the columns of the grid.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n override render() {\n return (\n <MutationsOverTime\n lapisFilter={this.lapisFilter}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n granularity={this.granularity}\n lapisDateField={this.lapisDateField}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutations-over-time-component': MutationsOverTimeComponent;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.lapisFilter, MutationsOverTimeProps['lapisFilter']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.sequenceType, MutationsOverTimeProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<Equals<typeof MutationsOverTimeComponent.prototype.views, MutationsOverTimeProps['views']>>;\ntype GranularityMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.granularity, MutationsOverTimeProps['granularity']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","export const PRESET_VALUE_CUSTOM = 'custom';\nexport const PRESET_VALUE_ALL_TIMES = 'allTimes';\nexport const PRESET_VALUE_LAST_2_WEEKS = 'last2Weeks';\nexport const PRESET_VALUE_LAST_MONTH = 'lastMonth';\nexport const PRESET_VALUE_LAST_2_MONTHS = 'last2Months';\nexport const PRESET_VALUE_LAST_3_MONTHS = 'last3Months';\nexport const PRESET_VALUE_LAST_6_MONTHS = 'last6Months';\n\nexport const presets = {\n [PRESET_VALUE_CUSTOM]: { label: 'Custom' },\n [PRESET_VALUE_ALL_TIMES]: { label: 'All times' },\n [PRESET_VALUE_LAST_2_WEEKS]: { label: 'Last 2 weeks' },\n [PRESET_VALUE_LAST_MONTH]: { label: 'Last month' },\n [PRESET_VALUE_LAST_2_MONTHS]: { label: 'Last 2 months' },\n [PRESET_VALUE_LAST_3_MONTHS]: { label: 'Last 3 months' },\n [PRESET_VALUE_LAST_6_MONTHS]: { label: 'Last 6 months' },\n};\n\nexport type PresetOptionValues = keyof typeof presets;\n\nexport type CustomSelectOption<CustomLabel extends string> = { label: CustomLabel; dateFrom: string; dateTo: string };\n\nexport const getSelectableOptions = <Label extends string>(customSelectOptions: CustomSelectOption<Label>[]) => {\n const presetOptions = Object.entries(presets).map(([key, value]) => {\n return { label: value.label, value: key };\n });\n\n const customOptions = customSelectOptions.map((customSelectOption) => {\n return { label: customSelectOption.label, value: customSelectOption.label };\n });\n\n return [...presetOptions, ...customOptions];\n};\n\nexport const getDatesForSelectorValue = <Label extends string>(\n selectorValue: string,\n customSelectOptions: CustomSelectOption<Label>[],\n earliestDate: string,\n) => {\n const today = new Date();\n\n const customSelectOption = customSelectOptions.find((option) => option.label === selectorValue);\n if (customSelectOption) {\n return { dateFrom: new Date(customSelectOption.dateFrom), dateTo: new Date(customSelectOption.dateTo) };\n }\n\n switch (selectorValue) {\n case PRESET_VALUE_LAST_2_WEEKS: {\n const twoWeeksAgo = new Date(today);\n twoWeeksAgo.setDate(today.getDate() - 14);\n return { dateFrom: twoWeeksAgo, dateTo: today };\n }\n case PRESET_VALUE_LAST_MONTH: {\n const lastMonth = new Date(today);\n lastMonth.setMonth(today.getMonth() - 1);\n return { dateFrom: lastMonth, dateTo: today };\n }\n case PRESET_VALUE_LAST_2_MONTHS: {\n const twoMonthsAgo = new Date(today);\n twoMonthsAgo.setMonth(today.getMonth() - 2);\n return { dateFrom: twoMonthsAgo, dateTo: today };\n }\n case PRESET_VALUE_LAST_3_MONTHS: {\n const threeMonthsAgo = new Date(today);\n threeMonthsAgo.setMonth(today.getMonth() - 3);\n return { dateFrom: threeMonthsAgo, dateTo: today };\n }\n case PRESET_VALUE_LAST_6_MONTHS: {\n const sixMonthsAgo = new Date(today);\n sixMonthsAgo.setMonth(today.getMonth() - 6);\n return { dateFrom: sixMonthsAgo, dateTo: today };\n }\n case PRESET_VALUE_ALL_TIMES: {\n return { dateFrom: new Date(earliestDate), dateTo: today };\n }\n default:\n return { dateFrom: today, dateTo: today };\n }\n};\n","import {\n type CustomSelectOption,\n getDatesForSelectorValue,\n getSelectableOptions,\n PRESET_VALUE_CUSTOM,\n PRESET_VALUE_LAST_6_MONTHS,\n type PresetOptionValues,\n} from './selectableOptions';\nimport { UserFacingError } from '../components/error-display';\n\nexport function computeInitialValues<CustomLabel extends string>(\n initialValue: PresetOptionValues | CustomLabel | undefined,\n initialDateFrom: string | undefined,\n initialDateTo: string | undefined,\n earliestDate: string,\n customSelectOptions: CustomSelectOption<CustomLabel>[],\n): {\n initialSelectedDateRange: CustomLabel | PresetOptionValues;\n initialSelectedDateFrom: Date;\n initialSelectedDateTo: Date;\n} {\n if (isUndefinedOrEmpty(initialDateFrom) && isUndefinedOrEmpty(initialDateTo)) {\n const selectableOptions = getSelectableOptions(customSelectOptions);\n const initialSelectedDateRange =\n initialValue !== undefined && selectableOptions.some((option) => option.value === initialValue)\n ? initialValue\n : PRESET_VALUE_LAST_6_MONTHS;\n\n const { dateFrom, dateTo } = getDatesForSelectorValue(\n initialSelectedDateRange,\n customSelectOptions,\n earliestDate,\n );\n\n return {\n initialSelectedDateRange,\n initialSelectedDateFrom: dateFrom,\n initialSelectedDateTo: dateTo,\n };\n }\n\n const initialSelectedDateFrom = isUndefinedOrEmpty(initialDateFrom)\n ? new Date(earliestDate)\n : new Date(initialDateFrom);\n let initialSelectedDateTo = isUndefinedOrEmpty(initialDateTo) ? new Date() : new Date(initialDateTo);\n\n if (isNaN(initialSelectedDateFrom.getTime())) {\n throw new UserFacingError(\n 'Invalid initialDateFrom',\n `Invalid initialDateFrom \"${initialDateFrom}\", It must be of the format YYYY-MM-DD`,\n );\n }\n if (isNaN(initialSelectedDateTo.getTime())) {\n throw new UserFacingError(\n 'Invalid initialDateTo',\n `Invalid initialDateTo \"${initialDateTo}\", It must be of the format YYYY-MM-DD`,\n );\n }\n\n if (initialSelectedDateFrom > initialSelectedDateTo) {\n initialSelectedDateTo = initialSelectedDateFrom;\n }\n\n return {\n initialSelectedDateRange: PRESET_VALUE_CUSTOM,\n initialSelectedDateFrom,\n initialSelectedDateTo,\n };\n}\n\nfunction isUndefinedOrEmpty(value: string | undefined): value is undefined | '' {\n return value === undefined || value === '';\n}\n","export const toYYYYMMDD = (date?: Date) => {\n if (!date) {\n return undefined;\n }\n\n const options: Intl.DateTimeFormatOptions = { year: 'numeric', month: '2-digit', day: '2-digit' };\n return date.toLocaleDateString('en-CA', options);\n};\n","import flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.min.css';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { computeInitialValues } from './computeInitialValues';\nimport { toYYYYMMDD } from './dateConversion';\nimport {\n type CustomSelectOption,\n getDatesForSelectorValue,\n getSelectableOptions,\n type PresetOptionValues,\n} from './selectableOptions';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Select } from '../components/select';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\n\nexport interface DateRangeSelectorProps<CustomLabel extends string> extends DateRangeSelectorPropsInner<CustomLabel> {\n width: string;\n}\n\nexport interface DateRangeSelectorPropsInner<CustomLabel extends string> {\n customSelectOptions: CustomSelectOption<CustomLabel>[];\n earliestDate?: string;\n initialValue?: PresetOptionValues | CustomLabel;\n initialDateFrom?: string;\n initialDateTo?: string;\n dateColumn: string;\n}\n\nexport const DateRangeSelector = <CustomLabel extends string>({\n width,\n ...innerProps\n}: DateRangeSelectorProps<CustomLabel>) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size}>\n <div style={{ width }}>\n <DateRangeSelectorInner {...innerProps} />\n </div>\n </ErrorBoundary>\n );\n};\n\nexport const DateRangeSelectorInner = <CustomLabel extends string>({\n customSelectOptions,\n earliestDate = '1900-01-01',\n initialValue,\n dateColumn,\n initialDateFrom,\n initialDateTo,\n}: DateRangeSelectorPropsInner<CustomLabel>) => {\n const initialValues = computeInitialValues(\n initialValue,\n initialDateFrom,\n initialDateTo,\n earliestDate,\n customSelectOptions,\n );\n\n const fromDatePickerRef = useRef<HTMLInputElement>(null);\n const toDatePickerRef = useRef<HTMLInputElement>(null);\n const divRef = useRef<HTMLDivElement>(null);\n const [dateFromPicker, setDateFromPicker] = useState<flatpickr.Instance | null>(null);\n const [dateToPicker, setDateToPicker] = useState<flatpickr.Instance | null>(null);\n\n const [selectedDateRange, setSelectedDateRange] = useState<CustomLabel | PresetOptionValues>(\n initialValues.initialSelectedDateRange,\n );\n\n const [selectedDates, setSelectedDates] = useState<{ dateFrom: Date; dateTo: Date }>({\n dateFrom: initialValues.initialSelectedDateFrom,\n dateTo: initialValues.initialSelectedDateTo,\n });\n\n useEffect(() => {\n const commonConfig = {\n allowInput: true,\n dateFormat: 'Y-m-d',\n };\n\n if (fromDatePickerRef.current) {\n setDateFromPicker(\n flatpickr(fromDatePickerRef.current, {\n ...commonConfig,\n defaultDate: selectedDates.dateFrom,\n }),\n );\n }\n\n if (toDatePickerRef.current) {\n setDateToPicker(\n flatpickr(toDatePickerRef.current, {\n ...commonConfig,\n defaultDate: selectedDates.dateTo,\n }),\n );\n }\n\n return () => {\n dateFromPicker?.destroy();\n dateToPicker?.destroy();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromDatePickerRef, toDatePickerRef]);\n\n const onSelectChange = (value: CustomLabel | PresetOptionValues) => {\n setSelectedDateRange(value);\n\n const dateRange = getDatesForSelectorValue(value, customSelectOptions, earliestDate);\n\n dateToPicker?.set('minDate', dateRange.dateFrom);\n dateFromPicker?.set('maxDate', dateRange.dateTo);\n\n dateFromPicker?.setDate(dateRange.dateFrom);\n dateToPicker?.setDate(dateRange.dateTo);\n\n setSelectedDates({\n dateFrom: dateRange.dateFrom,\n dateTo: dateRange.dateTo,\n });\n\n submit();\n };\n\n const onChangeDateFrom = () => {\n if (selectedDates.dateFrom.toDateString() === dateFromPicker?.selectedDates[0].toDateString()) {\n return;\n }\n\n selectedDates.dateFrom = dateFromPicker?.selectedDates[0] || new Date();\n dateToPicker?.set('minDate', dateFromPicker?.selectedDates[0]);\n setSelectedDateRange('custom');\n\n submit();\n };\n\n const onChangeDateTo = () => {\n if (selectedDates.dateTo.toDateString() === dateToPicker?.selectedDates[0].toDateString()) {\n return;\n }\n\n selectedDates.dateTo = dateToPicker?.selectedDates[0] || new Date();\n dateFromPicker?.set('maxDate', dateToPicker?.selectedDates[0]);\n setSelectedDateRange('custom');\n\n submit();\n };\n\n const submit = () => {\n const dateFrom = toYYYYMMDD(dateFromPicker?.selectedDates[0]);\n const dateTo = toYYYYMMDD(dateToPicker?.selectedDates[0]);\n\n const detail = {\n ...(dateFrom !== undefined && { [`${dateColumn}From`]: dateFrom }),\n ...(dateTo !== undefined && { [`${dateColumn}To`]: dateTo }),\n };\n\n divRef.current?.dispatchEvent(\n new CustomEvent('gs-date-range-changed', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n return (\n <div class='flex flex-wrap' ref={divRef}>\n <Select\n items={getSelectableOptions(customSelectOptions)}\n selected={selectedDateRange}\n selectStyle='select-bordered rounded-none flex-grow min-w-[7.5rem]'\n onChange={(event: Event) => {\n event.preventDefault();\n const select = event.target as HTMLSelectElement;\n const value = select.value as ScaleType;\n onSelectChange(value as CustomLabel | PresetOptionValues);\n }}\n />\n <div className={'flex flex-wrap flex-grow'}>\n <input\n class='input input-bordered rounded-none flex-grow w-[7.5rem]'\n type='text'\n placeholder='Date from'\n ref={fromDatePickerRef}\n onChange={onChangeDateFrom}\n onBlur={onChangeDateFrom}\n />\n <input\n class='input input-bordered rounded-none flex-grow w-[7.5rem]'\n type='text'\n placeholder='Date to'\n ref={toDatePickerRef}\n onChange={onChangeDateTo}\n onBlur={onChangeDateTo}\n />\n </div>\n </div>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { DateRangeSelector } from '../../preact/dateRangeSelector/date-range-selector';\nimport { type CustomSelectOption, type PresetOptionValues } from '../../preact/dateRangeSelector/selectableOptions';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n * This component is a group of input fields designed to specify date range filters\n * for a given date column of this Lapis instance. It consists of 3 fields:\n *\n * - a select field to choose a predefined date range,\n * - an input field with an attached date picker for the start date,\n * - an input field with an attached date picker for the end date.\n *\n * Setting a value in the select field will overwrite the previous values of the start and end date.\n * Setting a value in either of the date pickers will set the select field to \"custom\",\n * which represents an arbitrary date range.\n *\n * @fires {CustomEvent<{ `${dateColumn}From`: string; `${dateColumn}To`: string; }>} gs-date-range-changed\n * Fired when:\n * - The select field is changed,\n * - A date is selected in either of the date pickers,\n * - A date was typed into either of the date input fields, and the input field loses focus (\"on blur\").\n * Contains the dates in the format `YYYY-MM-DD`.\n *\n * Example: For `dateColumn = yourDate`, an event with `detail` containing\n * ```\n * {\n * yourDataFrom: \"2021-01-01\",\n * yourDataTo: \"2021-12-31\"\n * }\n * ```\n * will be fired.\n */\n@customElement('gs-date-range-selector')\nexport class DateRangeSelectorComponent extends PreactLitAdapter {\n /**\n * An array of custom options that the select field should provide,\n * in addition to the predefined options.\n * The `label` will be shown to the user, and it will be available as `initialValue`.\n * The dates must be in the format `YYYY-MM-DD`.\n */\n @property({ type: Array })\n customSelectOptions: { label: string; dateFrom: string; dateTo: string }[] = [];\n\n /**\n * The `dateFrom` value to use in the `allTimes` preset in the format `YYYY-MM-DD`.\n */\n @property({ type: String })\n earliestDate: string = '1900-01-01';\n\n // prettier-ignore\n // The multiline union type must not start with `| 'custom'` - Storybook will list \"\" as the first type which is wrong\n /**\n * The initial value to use for this date range selector.\n * Must be a valid label from the preset labels or a `label` given in the `customSelectOptions`.\n *\n * If the value is invalid, the component will default to `'last6Months'`.\n *\n * It will be overwritten if `initialDateFrom` or `initialDateTo` is set.\n */\n @property()\n initialValue:\n 'custom'\n | 'allTimes'\n | 'last2Weeks'\n | 'lastMonth'\n | 'last2Months'\n | 'last3Months'\n | 'last6Months'\n | string = 'last6Months';\n\n /**\n * A date string in the format `YYYY-MM-DD`.\n * If set, the date range selector will be initialized with the given date (overwriting `initialValue` to `custom`).\n * If `initialDateTo` is set, but this is unset, it will default to `earliestDate`.\n */\n @property()\n initialDateFrom: string = '';\n\n /**\n * A date string in the format `YYYY-MM-DD`.\n * If set, the date range selector will be initialized with the given date (overwriting `initialValue` to `custom`).\n * If `initialDateFrom` is set, but this is unset, it will default to the current date.\n */\n @property()\n initialDateTo: string = '';\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The name of the column in LAPIS that contains the date information.\n */\n @property({ type: String })\n dateColumn: string = 'date';\n\n override render() {\n return (\n <DateRangeSelector\n customSelectOptions={this.customSelectOptions}\n earliestDate={this.earliestDate}\n initialValue={this.initialValue}\n initialDateFrom={this.initialDateFrom}\n initialDateTo={this.initialDateTo}\n dateColumn={this.dateColumn}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-date-range-selector': DateRangeSelectorComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-date-range-changed': CustomEvent<Record<string, string>>;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype CustomSelectOptionsMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.customSelectOptions, CustomSelectOption<string>[]>\n>;\ntype InitialValueMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialValue, PresetOptionValues | string>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { LapisError } from '../../lapisApi/lapisApi';\nimport { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\nimport { UserFacingError } from '../components/error-display';\n\nexport async function fetchAutocompletionList(fields: string[], lapis: string, signal?: AbortSignal) {\n const toAncestorInHierarchyOverwriteValues = Array(fields.length - 1)\n .fill(0)\n .map((_, i) => i + 1)\n .map((i) => fields.slice(i).reduce((acc, field) => ({ ...acc, [field]: null }), {}));\n\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string | null>>({}, fields);\n\n let data;\n try {\n data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n } catch (error) {\n if (error instanceof LapisError) {\n throw new UserFacingError(\n `Failed to fetch autocomplete list from LAPIS: ${error.problemDetail.status} ${error.problemDetail.title ?? ''}`,\n error.problemDetail.detail ?? error.message,\n );\n }\n throw error;\n }\n\n const locationValues = data\n .map((entry) => fields.reduce((acc, field) => ({ ...acc, [field]: entry[field] }), {}))\n .reduce<Set<string>>((setOfAllHierarchies, entry) => {\n setOfAllHierarchies.add(JSON.stringify(entry));\n toAncestorInHierarchyOverwriteValues.forEach((overwriteValues) => {\n setOfAllHierarchies.add(JSON.stringify({ ...entry, ...overwriteValues }));\n });\n return setOfAllHierarchies;\n }, new Set());\n\n return [...locationValues].map((json) => JSON.parse(json)).sort(compareLocationEntries(fields));\n}\n\nfunction compareLocationEntries(fields: string[]) {\n return (a: Record<string, string | null>, b: Record<string, string | null>) => {\n for (const field of fields) {\n const valueA = a[field];\n const valueB = b[field];\n if (valueA === valueB) {\n continue;\n }\n if (valueA === null) {\n return -1;\n }\n if (valueB === null) {\n return 1;\n }\n return valueA < valueB ? -1 : 1;\n }\n return 0;\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nimport { fetchAutocompletionList } from './fetchAutocompletionList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nexport interface LocationFilterInnerProps {\n initialValue?: string;\n placeholderText?: string;\n fields: string[];\n}\n\nexport interface LocationFilterProps extends LocationFilterInnerProps {\n width: string;\n}\n\nexport const LocationFilter: FunctionComponent<LocationFilterProps> = ({ width, ...innerProps }) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <LocationFilterInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const LocationFilterInner = ({ initialValue, fields, placeholderText }: LocationFilterInnerProps) => {\n const lapis = useContext(LapisUrlContext);\n\n const [value, setValue] = useState(initialValue ?? '');\n const [unknownLocation, setUnknownLocation] = useState(false);\n\n const divRef = useRef<HTMLDivElement>(null);\n\n const { data, error, isLoading } = useQuery(() => fetchAutocompletionList(fields, lapis), [fields, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n if (error) {\n return <ErrorDisplay error={error} />;\n }\n\n const onInput = (event: JSXInternal.TargetedInputEvent<HTMLInputElement>) => {\n const inputValue = event.currentTarget.value;\n setValue(inputValue);\n if (inputValue.trim() === value.trim() && inputValue !== '') {\n return;\n }\n const eventDetail = parseLocation(inputValue, fields);\n if (hasAllUndefined(eventDetail) || hasMatchingEntry(data, eventDetail)) {\n divRef.current?.dispatchEvent(\n new CustomEvent('gs-location-changed', {\n detail: eventDetail,\n bubbles: true,\n composed: true,\n }),\n );\n setUnknownLocation(false);\n } else {\n setUnknownLocation(true);\n }\n };\n\n return (\n <div class='flex w-full' ref={divRef}>\n <input\n type='text'\n class={`input input-bordered grow ${unknownLocation ? 'border-2 border-error' : ''}`}\n value={value}\n onInput={onInput}\n list='countries'\n placeholder={placeholderText}\n />\n <datalist id='countries'>\n {data?.map((v) => {\n const value = fields\n .map((field) => v[field])\n .filter((value) => value !== null)\n .join(' / ');\n return <option key={value} value={value} />;\n })}\n </datalist>\n </div>\n );\n};\n\nconst parseLocation = (location: string, fields: string[]) => {\n if (location === '') {\n return fields.reduce((acc, field) => ({ ...acc, [field]: undefined }), {});\n }\n const fieldValues = location.split('/').map((part) => part.trim());\n\n return fields.reduce((acc, field, i) => ({ ...acc, [field]: fieldValues[i] }), {});\n};\n\nconst hasAllUndefined = (obj: Record<string, string | undefined>) =>\n Object.values(obj).every((value) => value === undefined);\n\nconst hasMatchingEntry = (data: Record<string, string>[] | null, eventDetail: Record<string, string>) => {\n if (data === null) {\n return false;\n }\n\n const matchingEntries = Object.entries(eventDetail)\n .filter(([, value]) => value !== undefined)\n .reduce((filteredData, [key, value]) => filteredData.filter((it) => it[key] === value), data);\n\n return matchingEntries.length > 0;\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { LocationFilter } from '../../preact/locationFilter/location-filter';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n *\n * This component provides an input field to specify filters for locations.\n *\n * It expects a list of fields that form a strict hierarchical order, such as continent, country, and city.\n * The component retrieves a list of all possible values for these fields from the Lapis instance.\n * This list is then utilized to display autocomplete suggestions and to validate the input.\n *\n * Given `fields` are `['field1', 'field2', ..., 'fieldN']`,\n * then valid values for the location filter must be in the form `valueForField1 / valueForField2 / ... / valueForFieldK`,\n * where `1 <= K <= N`.\n * Values for the fields `i > K` are considered `undefined`.\n *\n * @fires {CustomEvent<Record<string, string>>} gs-location-changed\n * Fired when a value from the datalist is selected or when a valid value is typed into the field.\n * The `details` of this event contain an object with all `fields` as keys\n * and the corresponding values as values, even if they are `undefined`.\n * Example:\n * ```\n * {\n * continent: \"Asia\",\n * country: \"China\",\n * city: \"Beijing\",\n * district: undefined,\n * }\n * ```\n */\n@customElement('gs-location-filter')\nexport class LocationFilterComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this location filter.\n * Must be of the form `valueForField1 / valueForField2 / ... / valueForFieldN`.\n */\n @property()\n initialValue = '';\n\n /**\n * Required.\n *\n * The fields to display in the location filter, in hierarchical order.\n * The top-level field should be the first entry in the array.\n * This component assumes that the values for each field form a strict hierarchy\n * (e.g., `fields = ['continent', 'country', 'city']`).\n */\n @property({ type: Array })\n fields: string[] = [];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The placeholder text to display in the input field, if it is empty.\n */\n @property()\n placeholderText: string = '';\n\n override render() {\n return (\n <LocationFilter\n initialValue={this.initialValue}\n fields={this.fields}\n width={this.width}\n placeholderText={this.placeholderText}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-location-filter': LocationFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-location-changed': CustomEvent<Record<string, string>>;\n }\n}\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchAutocompleteList(lapis: string, field: string, signal?: AbortSignal) {\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string>>({}, [field]);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n return data.map((item) => item[field]);\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef } from 'preact/hooks';\n\nimport { fetchAutocompleteList } from './fetchAutocompleteList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nexport interface TextInputInnerProps {\n lapisField: string;\n placeholderText?: string;\n initialValue?: string;\n}\n\nexport interface TextInputProps extends TextInputInnerProps {\n width: string;\n}\n\nexport const TextInput: FunctionComponent<TextInputProps> = ({ width, ...innerProps }) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <TextInputInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst TextInputInner: FunctionComponent<TextInputInnerProps> = ({ lapisField, placeholderText, initialValue }) => {\n const lapis = useContext(LapisUrlContext);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data, error, isLoading } = useQuery(() => fetchAutocompleteList(lapis, lapisField), [lapisField, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n const onInput = () => {\n const value = inputRef.current?.value === '' ? undefined : inputRef.current?.value;\n\n if (isValidValue(value)) {\n inputRef.current?.dispatchEvent(\n new CustomEvent('gs-text-input-changed', {\n detail: { [lapisField]: value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n const isValidValue = (value: string | undefined) => {\n if (value === undefined) {\n return true;\n }\n return data.includes(value);\n };\n\n return (\n <>\n <input\n type='text'\n class='input input-bordered w-full'\n placeholder={placeholderText !== undefined ? placeholderText : lapisField}\n onInput={onInput}\n ref={inputRef}\n list={lapisField}\n value={initialValue}\n />\n <datalist id={lapisField}>\n {data.map((item) => (\n <option value={item} key={item} />\n ))}\n </datalist>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { TextInput } from '../../preact/textInput/text-input';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n *\n * ## Context\n *\n * This component provides a text input field to specify filters for arbitrary fields of this LAPIS instance.\n *\n * @fires {CustomEvent<Record<string, string>>} gs-text-input-changed\n * Fired when the input field is changed.\n * The `details` of this event contain an object with the `lapisField` as key and the input value as value.\n * Example:\n * ```\n * {\n * \"host\": \"Homo sapiens\"\n * }\n * ```\n */\n@customElement('gs-text-input')\nexport class TextInputComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this text input.\n */\n @property()\n initialValue: string = '';\n\n /**\n * Required.\n *\n * The LAPIS field name to use for this text input.\n * The field must exist on this LAPIS instance.\n */\n @property()\n lapisField = '';\n\n /**\n * The placeholder text to display in the input field.\n */\n @property()\n placeholderText: string = '';\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <TextInput\n lapisField={this.lapisField}\n placeholderText={this.placeholderText}\n initialValue={this.initialValue}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-text-input': TextInputComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-text-input-changed': CustomEvent<Record<string, string>>;\n }\n}\n","import { type ComponentChildren, type FunctionalComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\n\nimport { type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\n\n/**\n * Sometimes the reference genome is not immediately available.\n * This component will display a loading spinner until the reference genome is available.\n * Child components can assume that the reference genome is available on the first render,\n * which e.g. matters for initial values of `useState`.\n */\nexport const ReferenceGenomesAwaiter: FunctionalComponent<{ children: ComponentChildren }> = ({ children }) => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n if (isNotInitialized(referenceGenome)) {\n return <div className='laoding loading-spinner loading-md'>Loading...</div>;\n }\n\n return <>{children}</>;\n};\n\nfunction isNotInitialized(referenceGenome: ReferenceGenome) {\n return referenceGenome.nucleotideSequences.length === 0 && referenceGenome.genes.length === 0;\n}\n","import { useContext } from 'preact/hooks';\n\nimport { isSingleSegmented } from '../../lapisApi/ReferenceGenome';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\nimport Info, { InfoHeadline1, InfoHeadline2, InfoParagraph } from '../components/info';\n\nexport const MutationFilterInfo = () => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const firstGene = referenceGenome.genes[0].name;\n return (\n <Info height={'80vh'}>\n <InfoHeadline1> Mutation Filter</InfoHeadline1>\n <InfoParagraph>This component allows you to filter for mutations at specific positions.</InfoParagraph>\n\n <InfoHeadline2> Nucleotide Mutations and Insertions</InfoHeadline2>\n {isSingleSegmented(referenceGenome) ? (\n <SingleSegmentedNucleotideMutationsInfo />\n ) : (\n <MultiSegmentedNucleotideMutationsInfo />\n )}\n\n <InfoHeadline2>Amino Acid Mutations and Insertions</InfoHeadline2>\n <InfoParagraph>\n An amino acid mutation has the format <b><gene>:<position><base></b> or\n <b><gene>:<base_ref><position><base></b>. A <b><base></b> can be one of\n the 20 amino acid codes. It can also be <b>-</b> for deletion and <b>X</b> for unknown. Example:{' '}\n <b>E:57Q</b>.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_{firstGene}:31:N</b> would filter for sequences with an insertion\n of N between positions 31 and 32 in the gene {firstGene}.\n </InfoParagraph>\n <InfoParagraph>\n This organism has the following genes: {referenceGenome.genes.map((gene) => gene.name).join(', ')}.\n </InfoParagraph>\n\n <InfoHeadline2>Insertion Wildcards</InfoHeadline2>\n <InfoParagraph>\n This component supports insertion queries that contain wildcards <b>?</b>. For example{' '}\n <b>ins_{firstGene}:214:?EP?</b> will match all cases where segment <b>{firstGene}</b> has an insertion\n of <b>EP</b> between the positions <b>214</b> and <b>215</b> but also an insertion of other amino acids\n which include the <b>EP</b>, e.g. the insertion <b>EPE</b> will be matched.\n </InfoParagraph>\n <InfoParagraph>\n You can also use wildcards to match any insertion at a given position. For example{' '}\n <b>ins_{firstGene}:214:?</b> match any (but at least one) insertion between the positions 214 and 215.\n </InfoParagraph>\n\n <InfoHeadline2>Multiple Mutations</InfoHeadline2>\n <InfoParagraph>\n Multiple mutation filters can be provided by adding one mutation after the other.\n </InfoParagraph>\n\n <InfoHeadline2>Any Mutation</InfoHeadline2>\n <InfoParagraph>\n To filter for any mutation at a given position you can omit the <b><base></b>. Example:{' '}\n <b>{firstGene}:20</b>.\n </InfoParagraph>\n\n <InfoHeadline2>No Mutation</InfoHeadline2>\n <InfoParagraph>\n You can write a <b>.</b> for the <b><base></b> to filter for sequences for which it is confirmed\n that no mutation occurred, i.e. has the same base as the reference genome at the specified position.\n </InfoParagraph>\n </Info>\n );\n};\n\nconst SingleSegmentedNucleotideMutationsInfo = () => {\n return (\n <>\n <InfoParagraph>\n This organism is single-segmented. Thus, nucleotide mutations have the format{' '}\n <b><position><base></b> or <b><base_ref><position><base></b>. The{' '}\n <b><base_ref></b> is the reference base at the position. It is optional. A <b><base></b> can\n be one of the four nucleotides <b>A</b>, <b>T</b>, <b>C</b>, and <b>G</b>. It can also be <b>-</b> for\n deletion and <b>N</b> for unknown. For example if the reference sequence is <b>A</b> at position{' '}\n <b>23</b> both: <b>23T</b> and <b>A23T</b> will yield the same results.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_1046:A</b> would filter for sequences with an insertion of A\n between the positions 1046 and 1047 in the nucleotide sequence.\n </InfoParagraph>\n </>\n );\n};\n\nconst MultiSegmentedNucleotideMutationsInfo = () => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const firstSegment = referenceGenome.nucleotideSequences[0].name;\n\n return (\n <>\n <InfoParagraph>\n This organism is multi-segmented. Thus, nucleotide mutations have the format{' '}\n <b><segment>:<position><base></b> or{' '}\n <b><segment>:<base_ref><position><base></b>. <b><base_ref></b> is the\n reference base at the position. It is optional. A <b><base></b> can be one of the four nucleotides{' '}\n <b>A</b>, <b>T</b>, <b>C</b>, and <b>G</b>. It can also be <b>-</b> for deletion and <b>N</b> for\n unknown. For example if the reference sequence is <b>A</b> at position <b>23</b> both:{' '}\n <b>{firstSegment}:23T</b> and <b>{firstSegment}:A23T</b> will yield the same results.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_{firstSegment}:10462:A</b>.\n </InfoParagraph>\n <InfoParagraph>\n This organism has the following segments:{' '}\n {referenceGenome.nucleotideSequences.map((gene) => gene.name).join(', ')}.\n </InfoParagraph>{' '}\n </>\n );\n};\n","import { isSingleSegmented, type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport type { SequenceType } from '../../types';\n\nexport const sequenceTypeFromSegment = (\n possibleSegment: string | undefined,\n referenceGenome: ReferenceGenome,\n): SequenceType | undefined => {\n if (possibleSegment === undefined) {\n return isSingleSegmented(referenceGenome) ? 'nucleotide' : undefined;\n }\n\n if (referenceGenome.nucleotideSequences.some((sequence) => sequence.name === possibleSegment)) {\n return 'nucleotide';\n }\n\n if (referenceGenome.genes.some((gene) => gene.name === possibleSegment)) {\n return 'amino acid';\n }\n return undefined;\n};\n","import { type SelectedFilters } from './mutation-filter';\nimport { sequenceTypeFromSegment } from './sequenceTypeFromSegment';\nimport type { ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { Deletion, Insertion, Substitution } from '../../utils/mutations';\n\ntype ParsedMutationFilter = {\n [MutationType in keyof SelectedFilters]: { type: MutationType; value: SelectedFilters[MutationType][number] };\n}[keyof SelectedFilters];\n\nexport const parseAndValidateMutation = (\n value: string,\n referenceGenome: ReferenceGenome,\n): ParsedMutationFilter | null => {\n const possibleInsertion = Insertion.parse(value);\n if (possibleInsertion !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleInsertion.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideInsertions', value: possibleInsertion };\n case 'amino acid':\n return { type: 'aminoAcidInsertions', value: possibleInsertion };\n case undefined:\n return null;\n }\n }\n\n const possibleDeletion = Deletion.parse(value);\n if (possibleDeletion !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleDeletion.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideMutations', value: possibleDeletion };\n case 'amino acid':\n return { type: 'aminoAcidMutations', value: possibleDeletion };\n case undefined:\n return null;\n }\n }\n\n const possibleSubstitution = Substitution.parse(value);\n if (possibleSubstitution !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleSubstitution.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideMutations', value: possibleSubstitution };\n case 'amino acid':\n return { type: 'aminoAcidMutations', value: possibleSubstitution };\n case undefined:\n return null;\n }\n }\n\n return null;\n};\n","import type { FunctionComponent } from 'preact';\n\nexport const DeleteIcon: FunctionComponent = () => {\n return (\n <svg\n fill='currentColor'\n stroke-width='0'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 16 16'\n style='overflow: visible; color: currentcolor;'\n height='1em'\n width='1em'\n >\n <path d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z' />\n </svg>\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\n\nimport { MutationFilterInfo } from './mutation-filter-info';\nimport { parseAndValidateMutation } from './parseAndValidateMutation';\nimport { type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { type Deletion, type Insertion, type Mutation, type Substitution } from '../../utils/mutations';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { DeleteIcon } from '../shared/icons/DeleteIcon';\n\nexport interface MutationFilterInnerProps {\n initialValue?: SelectedMutationFilterStrings | string[] | undefined;\n}\n\nexport interface MutationFilterProps extends MutationFilterInnerProps {\n width: string;\n}\n\nexport type SelectedFilters = {\n nucleotideMutations: (Substitution | Deletion)[];\n aminoAcidMutations: (Substitution | Deletion)[];\n nucleotideInsertions: Insertion[];\n aminoAcidInsertions: Insertion[];\n};\n\nexport type SelectedMutationFilterStrings = {\n [Key in keyof SelectedFilters]: string[];\n};\n\nexport const MutationFilter: FunctionComponent<MutationFilterProps> = ({ initialValue, width }) => {\n return (\n <ErrorBoundary size={{ height: '3.375rem', width }}>\n <div style={width}>\n <MutationFilterInner initialValue={initialValue} />\n </div>\n </ErrorBoundary>\n );\n};\n\nexport const MutationFilterInner: FunctionComponent<MutationFilterInnerProps> = ({ initialValue }) => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n const [selectedFilters, setSelectedFilters] = useState<SelectedFilters>(\n getInitialState(initialValue, referenceGenome),\n );\n const [inputValue, setInputValue] = useState('');\n const [isError, setIsError] = useState(false);\n const formRef = useRef<HTMLFormElement>(null);\n\n const handleSubmit = (event: Event) => {\n event.preventDefault();\n if (inputValue === '') {\n return;\n }\n\n const parsedMutation = parseAndValidateMutation(inputValue, referenceGenome);\n\n if (parsedMutation === null) {\n setIsError(true);\n return;\n }\n\n const newSelectedValues = {\n ...selectedFilters,\n [parsedMutation.type]: [...selectedFilters[parsedMutation.type], parsedMutation.value],\n };\n\n setSelectedFilters(newSelectedValues);\n fireChangeEvent(newSelectedValues);\n setInputValue('');\n };\n\n const fireChangeEvent = (selectedFilters: SelectedFilters) => {\n const detail = mapToMutationFilterStrings(selectedFilters);\n\n formRef.current?.dispatchEvent(\n new CustomEvent<SelectedMutationFilterStrings>('gs-mutation-filter-changed', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n const handleOnBlur = () => {\n const detail = mapToMutationFilterStrings(selectedFilters);\n\n formRef.current?.dispatchEvent(\n new CustomEvent<SelectedMutationFilterStrings>('gs-mutation-filter-on-blur', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n const handleInputChange = (event: Event) => {\n setInputValue((event.target as HTMLInputElement).value);\n setIsError(false);\n };\n\n return (\n <form className='w-full border boder-gray-300 rounded-md relative' onSubmit={handleSubmit} ref={formRef}>\n <div className='absolute -top-3 -right-3'>\n <MutationFilterInfo />\n </div>\n <div className='w-full flex p-2 flex-wrap items-center'>\n <SelectedMutationDisplay\n selectedFilters={selectedFilters}\n setSelectedFilters={setSelectedFilters}\n fireChangeEvent={fireChangeEvent}\n />\n <div\n className={`w-full flex border ${isError ? 'border-red-500' : 'border-gray-300'} border-solid m-2 text-sm focus-within:border-gray-400 `}\n >\n <input\n className='grow flex-1 p-1 border-none focus:outline-none focus:ring-0'\n type='text'\n value={inputValue}\n onInput={handleInputChange}\n placeholder={getPlaceholder(referenceGenome)}\n onBlur={handleOnBlur}\n />\n <button type='submit' className='btn btn-xs m-1'>\n +\n </button>\n </div>\n </div>\n </form>\n );\n};\n\nfunction getInitialState(\n initialValue: SelectedMutationFilterStrings | string[] | undefined,\n referenceGenome: ReferenceGenome,\n) {\n if (initialValue === undefined) {\n return {\n nucleotideMutations: [],\n aminoAcidMutations: [],\n nucleotideInsertions: [],\n aminoAcidInsertions: [],\n };\n }\n\n const values = Array.isArray(initialValue) ? initialValue : Object.values(initialValue).flatMap((it) => it);\n\n return values.reduce(\n (selectedFilters, value) => {\n const parsedMutation = parseAndValidateMutation(value, referenceGenome);\n if (parsedMutation === null) {\n return selectedFilters;\n }\n\n return {\n ...selectedFilters,\n [parsedMutation.type]: [...selectedFilters[parsedMutation.type], parsedMutation.value],\n };\n },\n {\n nucleotideMutations: [],\n aminoAcidMutations: [],\n nucleotideInsertions: [],\n aminoAcidInsertions: [],\n } as SelectedFilters,\n );\n}\n\nfunction getPlaceholder(referenceGenome: ReferenceGenome) {\n const segmentPrefix =\n referenceGenome.nucleotideSequences.length > 1 ? `${referenceGenome.nucleotideSequences[0].name}:` : '';\n const firstGene = referenceGenome.genes[0].name;\n\n return `Enter a mutation (e.g. ${segmentPrefix}A123T, ins_${segmentPrefix}123:AT, ${firstGene}:M123E, ins_${firstGene}:123:ME)`;\n}\n\nconst SelectedMutationDisplay: FunctionComponent<{\n selectedFilters: SelectedFilters;\n setSelectedFilters: (selectedFilters: SelectedFilters) => void;\n fireChangeEvent: (selectedFilters: SelectedFilters) => void;\n}> = ({ selectedFilters, setSelectedFilters, fireChangeEvent }) => {\n const onSelectedRemoved = <MutationType extends keyof SelectedFilters>(\n mutation: SelectedFilters[MutationType][number],\n key: MutationType,\n ) => {\n const newSelectedValues = {\n ...selectedFilters,\n [key]: selectedFilters[key].filter((i) => !mutation.equals(i)),\n };\n\n setSelectedFilters(newSelectedValues);\n\n fireChangeEvent(newSelectedValues);\n };\n\n return (\n <>\n {selectedFilters.nucleotideMutations.map((mutation) => (\n <SelectedNucleotideMutation\n key={mutation.toString()}\n mutation={mutation}\n onDelete={(mutation: Substitution | Deletion) => onSelectedRemoved(mutation, 'nucleotideMutations')}\n />\n ))}\n {selectedFilters.aminoAcidMutations.map((mutation) => (\n <SelectedAminoAcidMutation\n key={mutation.toString()}\n mutation={mutation}\n onDelete={(mutation: Substitution | Deletion) => onSelectedRemoved(mutation, 'aminoAcidMutations')}\n />\n ))}\n {selectedFilters.nucleotideInsertions.map((insertion) => (\n <SelectedNucleotideInsertion\n key={insertion.toString()}\n insertion={insertion}\n onDelete={(insertion) => onSelectedRemoved(insertion, 'nucleotideInsertions')}\n />\n ))}\n {selectedFilters.aminoAcidInsertions.map((insertion) => (\n <SelectedAminoAcidInsertion\n key={insertion.toString()}\n insertion={insertion}\n onDelete={(insertion: Insertion) => onSelectedRemoved(insertion, 'aminoAcidInsertions')}\n />\n ))}\n </>\n );\n};\n\nconst SelectedAminoAcidInsertion: FunctionComponent<{\n insertion: Insertion;\n onDelete: (insertion: Insertion) => void;\n}> = ({ insertion, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('teal', 0.3);\n const textColor = singleGraphColorRGBByName('teal', 1);\n return (\n <SelectedFilter\n mutation={insertion}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\nconst SelectedAminoAcidMutation: FunctionComponent<{\n mutation: Substitution | Deletion;\n onDelete: (mutation: Substitution | Deletion) => void;\n}> = ({ mutation, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('rose', 0.3);\n const textColor = singleGraphColorRGBByName('rose', 1);\n return (\n <SelectedFilter\n mutation={mutation}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\nconst SelectedNucleotideMutation: FunctionComponent<{\n mutation: Substitution | Deletion;\n onDelete: (insertion: Substitution | Deletion) => void;\n}> = ({ mutation, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('indigo', 0.3);\n const textColor = singleGraphColorRGBByName('indigo', 1);\n return (\n <SelectedFilter\n mutation={mutation}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\nconst SelectedNucleotideInsertion: FunctionComponent<{\n insertion: Insertion;\n onDelete: (insertion: Insertion) => void;\n}> = ({ insertion, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('green', 0.3);\n const textColor = singleGraphColorRGBByName('green', 1);\n\n return (\n <SelectedFilter\n mutation={insertion}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\ntype SelectedFilterProps<MutationType extends Mutation> = {\n mutation: MutationType;\n onDelete: (mutation: MutationType) => void;\n backgroundColor: string;\n textColor: string;\n};\n\nconst SelectedFilter = <MutationType extends Mutation>({\n mutation,\n onDelete,\n backgroundColor,\n textColor,\n}: SelectedFilterProps<MutationType>) => {\n return (\n <span\n class='inline-block mx-1 px-2 py-1 font-medium text-xs rounded-full'\n style={{ backgroundColor, color: textColor }}\n >\n {mutation.toString()}\n <button type='button' onClick={() => onDelete(mutation)}>\n <DeleteIcon />\n </button>\n </span>\n );\n};\n\nfunction mapToMutationFilterStrings(selectedFilters: SelectedFilters) {\n return {\n aminoAcidMutations: selectedFilters.aminoAcidMutations.map((mutation) => mutation.toString()),\n nucleotideMutations: selectedFilters.nucleotideMutations.map((mutation) => mutation.toString()),\n aminoAcidInsertions: selectedFilters.aminoAcidInsertions.map((insertion) => insertion.toString()),\n nucleotideInsertions: selectedFilters.nucleotideInsertions.map((insertion) => insertion.toString()),\n };\n}\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { ReferenceGenomesAwaiter } from '../../preact/components/ReferenceGenomesAwaiter';\nimport {\n MutationFilter,\n type MutationFilterProps,\n type SelectedMutationFilterStrings,\n} from '../../preact/mutationFilter/mutation-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n * This component provides an input field to specify filters for nucleotide and amino acid mutations and insertions.\n *\n * Input values have to be provided one at a time and submitted by pressing the Enter key or by clicking the '+' button.\n * After submission, the component validates the input and fires an event with the selected mutations.\n * All previously selected mutations are displayed at the input field and added to the event.\n * Users can remove a mutation by clicking the 'x' button next to the mutation.\n *\n * ## Input Validation\n *\n * Validation of the input is performed according to the following rules:\n *\n * ### Mutations\n *\n * Mutations have to conform to the following format: `<gene/segment>:<symbol at reference><position><Substituted symbol/Deletion>`\n * - Gene/segment: The gene or segment where the mutation occurs. Must be contained in the reference genome.\n * (Optional for elements with only one gene/segment)\n * - Symbol at reference: The symbol at the reference position. (Optional)\n * - Position: The position of the mutation. (Required)\n * - Substituted symbol/Deletion: The substituted symbol or '-' for a deletion. (Required)\n *\n * Examples: `S:614G`, `614G`, `614-`, `614G`\n *\n * ### Insertions\n *\n * Insertions have to conform to the following format: `ins_<gene/segment>:<position>:<Inserted symbols>`\n * - Gene/segment: The gene or segment where the insertion occurs. Must be contained in the reference genome.\n * (Optional for elements with only one gene/segment)\n * - Position: The position of the insertion. (Required)\n * - Inserted symbols: The symbols that are inserted. (Required)\n *\n * Examples: `ins_S:614:G`, `ins_614:G`\n *\n * @fires {CustomEvent<{\n * nucleotideMutations: string[],\n * aminoAcidMutations: string[],\n * nucleotideInsertions: string[],\n * aminoAcidInsertions: string[]\n * }>} gs-mutation-filter-changed\n * Fired when:\n * - The user has submitted a valid mutation or insertion\n * - The user has removed a mutation or insertion\n *\n * @fires {CustomEvent<{\n * nucleotideMutations: string[],\n * aminoAcidMutations: string[],\n * nucleotideInsertions: string[],\n * aminoAcidInsertions: string[]\n * }>} gs-mutation-filter-on-blur\n * Fired when:\n * - the mutation filter has lost focus\n * Contains the selected mutations in the format\n */\n@customElement('gs-mutation-filter')\nexport class MutationFilterComponent extends PreactLitAdapter {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * The initial value to use for this mutation filter.\n * All values provided must be valid mutations or insertions.\n * Invalid values will be ignored.\n */\n @property({ type: Object })\n initialValue:\n {\n nucleotideMutations: string[];\n aminoAcidMutations: string[];\n nucleotideInsertions: string[];\n aminoAcidInsertions: string[];\n }\n | string[]\n | undefined = undefined;\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <ReferenceGenomesAwaiter>\n <MutationFilter initialValue={this.initialValue} width={this.width} />\n </ReferenceGenomesAwaiter>\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutation-filter': MutationFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-mutation-filter-changed': CustomEvent<SelectedMutationFilterStrings>;\n 'gs-mutation-filter-on-blur': CustomEvent<SelectedMutationFilterStrings>;\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof MutationFilterComponent.prototype.initialValue, MutationFilterProps['initialValue']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchLineageAutocompleteList(lapis: string, field: string, signal?: AbortSignal) {\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string>>({}, [field]);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n return data.flatMap((item) => [item[field], `${item[field]}*`]).sort();\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef } from 'preact/hooks';\n\nimport { fetchLineageAutocompleteList } from './fetchLineageAutocompleteList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nexport interface LineageFilterInnerProps {\n lapisField: string;\n placeholderText?: string;\n initialValue?: string;\n}\n\nexport interface LineageFilterProps extends LineageFilterInnerProps {\n width: string;\n}\n\nexport const LineageFilter: FunctionComponent<LineageFilterProps> = ({ width, ...innerProps }) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <LineageFilterInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst LineageFilterInner: FunctionComponent<LineageFilterInnerProps> = ({\n lapisField,\n placeholderText,\n initialValue,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data, error, isLoading } = useQuery(\n () => fetchLineageAutocompleteList(lapis, lapisField),\n [lapisField, lapis],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n return <ErrorDisplay error={error} />;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n const onInput = () => {\n const value = inputRef.current?.value === '' ? undefined : inputRef.current?.value;\n\n if (isValidValue(value)) {\n inputRef.current?.dispatchEvent(\n new CustomEvent('gs-lineage-filter-changed', {\n detail: { [lapisField]: value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n const isValidValue = (value: string | undefined) => {\n if (value === undefined) {\n return true;\n }\n return data.includes(value);\n };\n\n return (\n <>\n <input\n type='text'\n class='input input-bordered w-full'\n placeholder={placeholderText !== undefined ? placeholderText : lapisField}\n onInput={onInput}\n ref={inputRef}\n list={lapisField}\n value={initialValue}\n />\n <datalist id={lapisField}>\n {data.map((item) => (\n <option value={item} key={item} />\n ))}\n </datalist>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { LineageFilter } from '../../preact/lineageFilter/lineage-filter';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n *\n * ## Context\n *\n * This component provides a text input field to filter by lineages.\n * Currently, it is designed to work well with Pango Lineages,\n * but it may also be used for other lineage types, if suitable.\n *\n * It fetches all available values of the `lapisField` from the LAPIS instance\n * and provides an autocomplete list with the available values of the lineage and sublineage queries\n * (a `*` appended to the lineage value).\n *\n * @fires {CustomEvent<Record<string, string>>} gs-lineage-filter-changed\n * Fired when the input field is changed.\n * The `details` of this event contain an object with the `lapisField` as key and the input value as value.\n * Example:\n * ```\n * {\n * \"pangoLineage\": \"B.1.1.7\"\n * }\n * ```\n */\n@customElement('gs-lineage-filter')\nexport class LineageFilterComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this lineage filter.\n */\n @property()\n initialValue: string = '';\n\n /**\n * Required.\n *\n * The LAPIS field name to use for this lineage filter.\n * The field must exist on this LAPIS instance.\n */\n @property()\n lapisField = '';\n\n /**\n * The placeholder text to display in the input field.\n */\n @property()\n placeholderText: string = '';\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <LineageFilter\n lapisField={this.lapisField}\n placeholderText={this.placeholderText}\n initialValue={this.initialValue}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-lineage-filter': LineageFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-lineage-filter-changed': CustomEvent<Record<string, string>>;\n }\n}\n"],"names":["t","e","o","s","r","n","S","c","i","h","a","l","p","d","u","f","y","_a","b","z","problemDetail","__decorateClass","property","customElement","D","wrapper","useRef","useEffect","jsx","useState","useMemo","jsxs","createContext","x","item","useContext","size","useErrorBoundary","heightOfTabs","error","Toolbar","byProportion","maxInData","datasets","getDataset","tooltip","v","padStart","padZoneStr","monthDiff","C.M","absFloor","prettyUnit","C.Y","C.W","C.D","C.DATE","C.H","C.MIN","C.S","C.MS","isUndefined","isDayjs","parseLocale","dayjs","parseDate","C.REGEX_PARSE","m","Dayjs","C.INVALID_DATE_STRING","instanceFactory","instanceFactorySet","C.MILLISECONDS_A_MINUTE","C.MILLISECONDS_A_HOUR","C.MILLISECONDS_A_SECOND","C.FORMAT_DEFAULT","getShort","get$H","matches","C.REGEX_FORMAT","diff","getMonth","C.Q","C.MILLISECONDS_A_WEEK","C.MILLISECONDS_A_DAY","proto","getYearFirstThursday","getCurrentWeekThursday","total","data","granularity","aggregatedResponse","getDatasets","lapisFilter","Fragment","j","key","value","options","selectedFilters","mutation","insertion","backgroundColor","textColor"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[0,1,2,3,10,11,69,70,71,72,73,74]}
|