@genspectrum/dashboard-components 0.6.14 → 0.6.16

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.
Files changed (35) hide show
  1. package/custom-elements.json +12 -6
  2. package/dist/dashboard-components.js +104 -60
  3. package/dist/dashboard-components.js.map +1 -1
  4. package/dist/genspectrum-components.d.ts +27 -9
  5. package/dist/style.css +2 -5
  6. package/package.json +3 -3
  7. package/src/index.ts +8 -0
  8. package/src/lapisApi/lapisApi.ts +15 -7
  9. package/src/preact/components/color-scale-selector-dropdown.stories.tsx +1 -1
  10. package/src/preact/components/error-boundary.stories.tsx +21 -4
  11. package/src/preact/components/error-display.stories.tsx +20 -2
  12. package/src/preact/components/error-display.tsx +64 -10
  13. package/src/preact/components/info.stories.tsx +5 -5
  14. package/src/preact/components/info.tsx +1 -3
  15. package/src/preact/components/proportion-selector-dropdown.stories.tsx +13 -4
  16. package/src/preact/components/proportion-selector-dropdown.tsx +7 -4
  17. package/src/preact/dateRangeSelector/date-range-selector.stories.tsx +2 -3
  18. package/src/preact/lineageFilter/lineage-filter.stories.tsx +2 -3
  19. package/src/preact/locationFilter/fetchAutocompletionList.ts +1 -14
  20. package/src/preact/locationFilter/location-filter.stories.tsx +2 -3
  21. package/src/preact/mutationFilter/mutation-filter.stories.tsx +2 -3
  22. package/src/preact/mutationsOverTime/mutations-over-time.tsx +1 -0
  23. package/src/preact/prevalenceOverTime/prevalence-over-time.tsx +1 -1
  24. package/src/preact/relativeGrowthAdvantage/relative-growth-advantage.tsx +1 -1
  25. package/src/preact/shared/floating-ui/hooks.ts +1 -1
  26. package/src/preact/textInput/text-input.stories.tsx +2 -3
  27. package/src/web-components/app.stories.ts +0 -2
  28. package/src/web-components/errorHandling.mdx +8 -0
  29. package/src/web-components/input/gs-date-range-selector.stories.ts +2 -3
  30. package/src/web-components/input/gs-lineage-filter.stories.ts +2 -3
  31. package/src/web-components/input/gs-location-filter.stories.ts +2 -3
  32. package/src/web-components/input/gs-mutation-filter.stories.ts +2 -3
  33. package/src/web-components/input/gs-text-input.stories.ts +2 -3
  34. package/standalone-bundle/dashboard-components.js +1724 -1692
  35. package/standalone-bundle/dashboard-components.js.map +1 -1
@@ -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/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/fullscreen.tsx","../src/preact/components/info.tsx","../src/preact/components/loading-display.tsx","../src/preact/shared/floating-ui/hooks.ts","../src/preact/components/dropdown.tsx","../src/preact/components/checkbox-selector.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/ReferenceGenomeContext.ts","../src/preact/components/segment-selector.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/utils/map2d.ts","../src/preact/mutationsOverTime/getFilteredMutationsOverTimeData.ts","../src/preact/components/color-scale-selector.tsx","../src/preact/components/tooltip.tsx","../src/preact/mutationsOverTime/mutations-over-time-grid.tsx","../src/query/queryMutationsOverTime.ts","../src/preact/components/color-scale-selector-dropdown.tsx","../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/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=\"&quot;\";break;case 38:f=\"&amp;\";break;case 60:f=\"&lt;\";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 return 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 { type MutableRef, 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 resizeChartAfterFullscreenChange(chartRef, 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\nconst resizeChartAfterFullscreenChange = (\n chartRef: MutableRef<Chart | null>,\n ctx: CanvasRenderingContext2D,\n configuration: ChartConfiguration,\n) => {\n document.addEventListener('fullscreenchange', () => {\n chartRef.current?.destroy();\n chartRef.current = new Chart(ctx, configuration);\n });\n};\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 DisplayedMutationType } from '../components/mutation-type-selector';\nimport { type DisplayedSegment } from '../components/segment-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 { 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 (\n <div style={size} className='bg-white'>\n {children}\n </div>\n );\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 { useEffect, useRef, useState } from 'preact/hooks';\n\nexport const Fullscreen = () => {\n const element = useRef<HTMLButtonElement>(null);\n const isFullscreen = useFullscreenStatus();\n return (\n <button\n ref={element}\n onClick={async () => {\n if (element.current) {\n if (isFullscreen) {\n await document.exitFullscreen();\n } else {\n const componentRoot = findComponentRoot(element.current);\n if (componentRoot) {\n await componentRoot.requestFullscreen();\n }\n }\n }\n }}\n className={`mt-0.5 iconify text-2xl ${isFullscreen ? 'mdi--fullscreen-exit hover:scale-90' : 'mdi--fullscreen hover:scale-110'}`}\n title={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n />\n );\n};\n\nfunction findComponentRoot(element: HTMLElement) {\n return findShadowRoot(element)?.children[0];\n}\n\nfunction findShadowRoot(element: HTMLElement) {\n let current: Node = element;\n while (current) {\n if (current instanceof ShadowRoot) {\n return current;\n }\n if (current.parentNode === null) {\n return null;\n }\n current = current.parentNode;\n }\n return null;\n}\n\nfunction useFullscreenStatus(): boolean {\n const [isFullscreen, setIsFullscreen] = useState<boolean>(document.fullscreenElement !== null);\n useEffect(() => {\n const handleFullscreenChange = () => {\n setIsFullscreen(document.fullscreenElement !== null);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n return isFullscreen;\n}\n","import { type FunctionComponent } from 'preact';\nimport { useRef } from 'preact/hooks';\n\nexport interface InfoProps {}\n\nconst Info: FunctionComponent<InfoProps> = ({ children }) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n\n const toggleHelp = () => {\n dialogRef.current?.showModal();\n };\n\n return (\n <div className='relative'>\n <button type='button' className='btn btn-xs' onClick={toggleHelp}>\n ?\n </button>\n <dialog ref={dialogRef} className={'modal modal-bottom sm:modal-middle'}>\n <div className='modal-box sm:max-w-5xl'>\n <form method='dialog'>\n <button className='btn btn-sm btn-circle btn-ghost absolute right-2 top-2'>✕</button>\n </form>\n <div className={'flex flex-col'}>{children}</div>\n <div className='modal-action'>\n <form method='dialog'>\n <button className={'float-right underline text-sm hover:text-blue-700 mr-2'}>Close</button>\n </form>\n </div>\n </div>\n <form method='dialog' className='modal-backdrop'>\n <button>Helper to close when clicked outside</button>\n </form>\n </dialog>\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 type InfoComponentCodeProps = {\n componentName: string;\n params: object;\n lapisUrl: string;\n};\n\nexport const InfoComponentCode: FunctionComponent<InfoComponentCodeProps> = ({ componentName, params, lapisUrl }) => {\n const componentCode = componentParametersToCode(componentName, params, lapisUrl);\n const codePenData = {\n title: 'GenSpectrum dashboard component',\n html: generateFullExampleCode(componentCode, componentName),\n layout: 'left',\n editors: '100',\n };\n return (\n <>\n <InfoHeadline2>Use this component yourself</InfoHeadline2>\n <InfoParagraph>\n This component was created using the following parameters:\n <div className='p-4 border border-gray-200 rounded-lg overflow-x-auto'>\n <pre>\n <code>{componentCode}</code>\n </pre>\n </div>\n </InfoParagraph>\n <InfoParagraph>\n You can add this component to your own website using the{' '}\n <InfoLink href='https://github.com/GenSpectrum/dashboard-components'>\n GenSpectrum dashboard components library\n </InfoLink>{' '}\n and the code from above.\n </InfoParagraph>\n <InfoParagraph>\n <form action='https://codepen.io/pen/define' method='POST' target='_blank'>\n <input\n type='hidden'\n name='data'\n value={JSON.stringify(codePenData).replace(/\"/g, '&quot;').replace(/'/g, '&apos;')}\n />\n\n <button className='text-blue-600 hover:text-blue-800' type='submit'>\n Click here to try it out on CodePen.\n </button>\n </form>\n </InfoParagraph>\n </>\n );\n};\n\nexport default Info;\n\nfunction componentParametersToCode(componentName: string, params: object, lapisUrl: string) {\n const stringifyIfNeeded = (value: unknown) => {\n return typeof value === 'object' ? JSON.stringify(value) : value;\n };\n\n const attributes = indentLines(\n Object.entries(params)\n .map(([key, value]) => `${key}='${stringifyIfNeeded(value)}'`)\n .join('\\n'),\n 4,\n );\n return `<gs-app lapis=\"${lapisUrl}\">\\n <gs-${componentName}\\n${attributes}\\n />\\n</gs-app>`;\n}\n\nfunction generateFullExampleCode(componentCode: string, componentName: string) {\n const storyBookPath = `/docs/visualization-${componentName}--docs`;\n return `<html>\n<head>\n <script type=\"module\" src=\"https://unpkg.com/@genspectrum/dashboard-components@latest/standalone-bundle/dashboard-components.js\"></script>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/@genspectrum/dashboard-components@latest/dist/style.css\" />\n</head>\n\n<body>\n <!-- Component documentation: https://genspectrum.github.io/dashboard-components/?path=${storyBookPath} -->\n${indentLines(componentCode, 2)}\n</body>\n</html>\n`;\n}\n\nfunction indentLines(text: string, numberSpaces: number) {\n const spaces = ' '.repeat(numberSpaces);\n return text\n .split('\\n')\n .map((line) => spaces + line)\n .join('\\n');\n}\n","import { type FunctionComponent } from 'preact';\n\nexport const LoadingDisplay: FunctionComponent = () => {\n return (\n <div\n aria-label={'Loading'}\n className='h-full w-full border-2 border-gray-100 rounded-md flex justify-center items-center'\n >\n <div className='loading loading-spinner loading-md text-neutral-500' />\n </div>\n );\n};\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 <>\n <button type='button' className='btn btn-xs whitespace-nowrap w-full' onClick={toggle} ref={referenceRef}>\n {buttonTitle}\n </button>\n <div ref={floatingRef} className={`${dropdownClass} ${showContent ? '' : 'hidden'}`}>\n {children}\n </div>\n </>\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 <button\n className='btn btn-xs btn-ghost'\n onClick={() => {\n const newItems = items.map((item) => ({ ...item, checked: true }));\n setItems(newItems);\n }}\n >\n Select all\n </button>\n <button\n className='btn btn-xs btn-ghost'\n onClick={() => {\n const newItems = items.map((item) => ({ ...item, checked: false }));\n setItems(newItems);\n }}\n >\n Select none\n </button>\n <div className='divider mt-0 mb-0' />\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 { 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 return (\n <div className='w-[6rem]'>\n <CheckboxSelector\n items={displayedMutationTypes}\n label={getMutationTypesSelectorLabel(displayedMutationTypes)}\n setItems={(items) => setDisplayedMutationTypes(items)}\n />\n </div>\n );\n};\n\nconst getMutationTypesSelectorLabel = (displayedMutationTypes: DisplayedMutationType[]) => {\n const checkedLabels = displayedMutationTypes.filter((displayedMutationType) => displayedMutationType.checked);\n\n if (checkedLabels.length === 0) {\n return `No types`;\n }\n if (displayedMutationTypes.length === checkedLabels.length) {\n return displayedMutationTypes\n .map((type) => {\n switch (type.type) {\n case 'substitution':\n return 'Subst.';\n case 'deletion':\n return 'Del.';\n }\n })\n .join(', ');\n }\n\n return checkedLabels\n .map((type) => {\n return type.label;\n })\n .join(', ');\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 w-full h-full'>\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 indicateError?: boolean;\n};\n\nconst percentageInRange = (percentage: number) => {\n return percentage <= 100 && percentage >= 0;\n};\n\nexport const PercentInput: FunctionComponent<PercentInputProps> = ({\n percentage,\n setPercentage,\n indicateError = false,\n}) => {\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 if (value === internalPercentage || input.value === '') {\n return;\n }\n\n const inRange = percentageInRange(value);\n\n if (inRange) {\n setPercentage(value);\n }\n setInternalPercentage(value);\n };\n\n const isError = indicateError || !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';\nimport { useEffect, useRef, useState } from 'preact/hooks';\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\nfunction useUpdateExternalValueInIntervals(\n setExternalValue: (minProportion: number) => void,\n updateIntervalInMs: number,\n internalValue: number,\n) {\n const hasMounted = useRef(false);\n\n useEffect(() => {\n if (!hasMounted.current) {\n hasMounted.current = true;\n return;\n }\n\n const minTimeout = setTimeout(() => {\n setExternalValue(internalValue);\n }, updateIntervalInMs);\n\n return () => clearTimeout(minTimeout);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- We only want to run this effect when the internal value changes\n }, [internalValue]);\n}\n\nexport const ProportionSelector: FunctionComponent<ProportionSelectorProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n}) => {\n const updateIntervalInMs = 300;\n const { min: minProportion, max: maxProportion } = proportionInterval;\n\n const [internalMinProportion, setInternalMinProportion] = useState(minProportion);\n const [internalMaxProportion, setInternalMaxProportion] = useState(maxProportion);\n\n useUpdateExternalValueInIntervals(setMinProportion, updateIntervalInMs, internalMinProportion);\n const updateMinPercentage = (minPercentage: number) => {\n const newMinProportion = minPercentage / 100;\n setInternalMinProportion(newMinProportion);\n };\n\n useUpdateExternalValueInIntervals(setMaxProportion, updateIntervalInMs, internalMaxProportion);\n const updateMaxPercentage = (maxPercentage: number) => {\n const newMaxProportion = maxPercentage / 100;\n setInternalMaxProportion(newMaxProportion);\n };\n\n const indicateError = internalMinProportion > internalMaxProportion;\n\n return (\n <div class='flex flex-col w-64 mb-2'>\n <div class='flex items-center '>\n <PercentInput\n percentage={internalMinProportion * 100}\n setPercentage={updateMinPercentage}\n indicateError={indicateError}\n />\n <div class='m-2'>-</div>\n <PercentInput\n percentage={internalMaxProportion * 100}\n setPercentage={updateMaxPercentage}\n indicateError={indicateError}\n />\n </div>\n <div class='my-1'>\n <MinMaxRangeSlider\n min={internalMinProportion * 100}\n max={internalMaxProportion * 100}\n setMin={updateMinPercentage}\n setMax={updateMaxPercentage}\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 <div className='w-44'>\n <Dropdown buttonTitle={`Proportion ${label}`} placement={'bottom-start'}>\n <ProportionSelector\n proportionInterval={proportionInterval}\n setMinProportion={setMinProportion}\n setMaxProportion={setMaxProportion}\n />\n </Dropdown>\n </div>\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};\n\nexport const SegmentSelector: FunctionComponent<SegmentSelectorProps> = ({\n displayedSegments,\n setDisplayedSegments,\n}) => {\n if (displayedSegments.length <= 1) {\n return null;\n }\n\n return (\n <div className='w-24'>\n <CheckboxSelector\n items={displayedSegments}\n label={getSegmentSelectorLabel(displayedSegments)}\n setItems={(items) => setDisplayedSegments(items)}\n />\n </div>\n );\n};\n\nconst getSegmentSelectorLabel = (displayedSegments: DisplayedSegment[]) => {\n const allSelectedSelected = displayedSegments\n .filter((segment) => segment.checked)\n .map((segment) => segment.segment);\n\n if (allSelectedSelected.length === 0) {\n return `No segments`;\n }\n if (displayedSegments.length === allSelectedSelected.length) {\n return `All segments`;\n }\n\n const longestDisplayString = `All segments`;\n\n const allSelectedSelectedString = allSelectedSelected.join(', ');\n\n if (longestDisplayString.length >= allSelectedSelectedString.length) {\n return allSelectedSelectedString;\n }\n\n return `${allSelectedSelected.length} ${allSelectedSelected.length === 1 ? 'segment' : 'segments'}`;\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 { 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 { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport { Fullscreen } from '../components/fullscreen';\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 { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\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>Info for mutation comparison</Info>\n <Fullscreen />\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>;\ntype WidthMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.width, MutationComparisonProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.height, MutationComparisonProps['height']>\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.pageSize, MutationComparisonProps['pageSize']>\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';\nimport { useMemo } from 'preact/hooks';\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 = useMemo(\n () => getMutationsGridData(data, sequenceType, proportionInterval).map((row) => Object.values(row)),\n [data, proportionInterval, sequenceType],\n );\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 DisplayedMutationType } from '../components/mutation-type-selector';\nimport { type DisplayedSegment } from '../components/segment-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 { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoHeadline1, InfoHeadline2, InfoLink, InfoParagraph } 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 { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\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 <MutationsInfo />\n <Fullscreen />\n </>\n );\n};\n\nconst MutationsInfo = () => (\n <Info>\n <InfoHeadline1>Mutations</InfoHeadline1>\n <InfoParagraph>\n This shows mutations of a variant. There are three types of mutations:{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Substitution'>substitutions</InfoLink>,{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Deletion'>deletions</InfoLink> and{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Insertion'>insertions</InfoLink>.\n </InfoParagraph>\n <InfoHeadline2>Proportion calculation</InfoHeadline2>\n <InfoParagraph>\n The proportion of a mutation is calculated by dividing the number of sequences with the mutation by the\n total number of sequences with a non-ambiguous symbol at the position.\n </InfoParagraph>\n <InfoParagraph>\n <b>Example:</b> Assume we look at nucleotide mutations at position 5 where the reference has a T and assume\n there are 10 sequences in total:\n <ul className='list-disc list-inside ml-2'>\n <li>3 sequences have a C,</li>\n <li>2 sequences have a T,</li>\n <li>1 sequence has a G,</li>\n <li>3 sequences have an N,</li>\n <li>1 sequence has a Y (which means T or C),</li>\n </ul>\n then the proportion of the T5C mutation is 50%. The 4 sequences that have an N or Y are excluded from the\n calculation.\n </InfoParagraph>\n </Info>\n);\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { Mutations, type MutationsProps } from '../../preact/mutations/mutations';\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<\n Equals<typeof MutationsComponent.prototype.lapisFilter, MutationsProps['lapisFilter']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationsComponent.prototype.sequenceType, MutationsProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<Equals<typeof MutationsComponent.prototype.views, MutationsProps['views']>>;\ntype WidthMatches = Expect<Equals<typeof MutationsComponent.prototype.width, MutationsProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof MutationsComponent.prototype.height, MutationsProps['height']>>;\ntype PageSizeMatches = Expect<Equals<typeof MutationsComponent.prototype.pageSize, MutationsProps['pageSize']>>;\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\nexport type 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\n/**\n * https://day.js.org/docs/en/plugin/advanced-format\n */\nconst FORMAT_ISO_WEEK_YEAR_WEEK = 'GGGG-[W]WW';\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(FORMAT_ISO_WEEK_YEAR_WEEK));\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(FORMAT_ISO_WEEK_YEAR_WEEK);\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(FORMAT_ISO_WEEK_YEAR_WEEK);\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('-W').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 Operator<Fields & { count: number }>\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 { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, 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 AxisMax } 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 {\n width: string;\n height: string;\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 yAxisMaxLinear: AxisMax;\n yAxisMaxLogarithmic: AxisMax;\n}\n\nexport const PrevalenceOverTime: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <PrevalenceOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const PrevalenceOverTimeInner: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { numeratorFilter, denominatorFilter, granularity, smoothingWindow, lapisDateField } = componentProps;\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 <PrevalenceOverTimeTabs data={data} {...componentProps} />;\n};\n\ntype PrevalenceOverTimeTabsProps = PrevalenceOverTimeProps & {\n data: PrevalenceOverTimeData;\n};\n\nconst PrevalenceOverTimeTabs: FunctionComponent<PrevalenceOverTimeTabsProps> = ({ data, ...componentProps }) => {\n const { views, granularity, confidenceIntervalMethods, pageSize, yAxisMaxLinear, yAxisMaxLogarithmic } =\n componentProps;\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n const [confidenceIntervalMethod, setConfidenceIntervalMethod] = useState<ConfidenceIntervalMethod>(\n confidenceIntervalMethods.length > 0 ? confidenceIntervalMethods[0] : 'none',\n );\n const yAxisMaxConfig = { linear: yAxisMaxLinear, logarithmic: yAxisMaxLogarithmic };\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 confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n {...componentProps}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = PrevalenceOverTimeProps & {\n activeTab: string;\n data: PrevalenceOverTimeData;\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 confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n data,\n ...componentProps\n}) => {\n const { confidenceIntervalMethods, granularity } = componentProps;\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 {...componentProps} />\n <Fullscreen />\n </>\n );\n};\n\nconst PrevalenceOverTimeInfo: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { granularity, smoothingWindow, views } = componentProps;\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Prevalence over time</InfoHeadline1>\n <InfoParagraph>\n This presents the proportion of one or more variants per <b>{granularity}</b>\n {smoothingWindow > 0 && `, smoothed using a ${smoothingWindow}-${granularity} sliding window`}. The\n proportion is calculated as the number of sequences of the variant(s) divided by the number of sequences\n that match the <code>denominatorFilter</code> (see below).\n </InfoParagraph>\n <InfoParagraph>\n Sequences that have no assigned date will not be shown in the line and bubble chart. They will show up\n in the bar and table view with date \"unknown\".\n </InfoParagraph>\n {views.includes('bubble') && (\n <>\n <InfoHeadline2>Bubble chart</InfoHeadline2>\n <InfoParagraph>\n The size of the bubble scales with the total number of available sequences from the{' '}\n {granularity}.\n </InfoParagraph>\n </>\n )}\n <InfoComponentCode componentName='prevalence-over-time' params={componentProps} lapisUrl={lapis} />\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 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 yAxisMaxLinear={this.yAxisMaxLinear}\n yAxisMaxLogarithmic={this.yAxisMaxLogarithmic}\n />\n );\n }\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 SmoothingWindowMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.smoothingWindow, PrevalenceOverTimeProps['smoothingWindow']>\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>;\ntype WidhtMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.width, PrevalenceOverTimeProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.height, PrevalenceOverTimeProps['height']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.lapisDateField, PrevalenceOverTimeProps['lapisDateField']>\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.pageSize, PrevalenceOverTimeProps['pageSize']>\n>;\ntype YAxisMaxLinearMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.yAxisMaxLinear, PrevalenceOverTimeProps['yAxisMaxLinear']>\n>;\ntype YAxisMaxLogarithmicMatches = Expect<\n Equals<\n typeof PrevalenceOverTimeComponent.prototype.yAxisMaxLogarithmic,\n PrevalenceOverTimeProps['yAxisMaxLogarithmic']\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 { Fullscreen } from '../components/fullscreen';\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 <Fullscreen />\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} from '../../preact/relativeGrowthAdvantage/relative-growth-advantage';\nimport { type AxisMax } from '../../preact/shared/charts/getYAxisMax';\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<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.numeratorFilter,\n RelativeGrowthAdvantageProps['numeratorFilter']\n >\n>;\ntype DenominatorMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.denominatorFilter,\n RelativeGrowthAdvantageProps['denominatorFilter']\n >\n>;\ntype GenerationTimeMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.generationTime,\n RelativeGrowthAdvantageProps['generationTime']\n >\n>;\ntype ViewsMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.views, RelativeGrowthAdvantageProps['views']>\n>;\ntype WidthMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.width, RelativeGrowthAdvantageProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.height, RelativeGrowthAdvantageProps['height']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.lapisDateField,\n RelativeGrowthAdvantageProps['lapisDateField']\n >\n>;\ntype YAxisMaxLinearMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.yAxisMaxLinear,\n Required<RelativeGrowthAdvantageProps['yAxisMaxConfig']>['linear']\n >\n>;\ntype YAxisMaxLogarithmicMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.yAxisMaxLogarithmic,\n Required<RelativeGrowthAdvantageProps['yAxisMaxConfig']>['logarithmic']\n >\n>;\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 { Fullscreen } from '../components/fullscreen';\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 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} fields={fields} />} />;\n};\n\ntype ToolbarProps = {\n data: AggregateData;\n fields: string[];\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({ data, fields }) => {\n return (\n <div class='flex flex-row'>\n <CsvDownloadButton className='mx-1 btn btn-xs' getData={() => data} filename='aggregate.csv' />\n <Info>\n <InfoHeadline1>Aggregated data</InfoHeadline1>\n <InfoParagraph>\n This table shows the number and proportion of sequences stratified by the following fields:{' '}\n {fields.join(', ')}. The proportion is calculated with respect to the total count within the\n filtered dataset.\n </InfoParagraph>\n </Info>\n <Fullscreen />\n </div>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { Aggregate, type AggregateProps, type View } from '../../preact/aggregatedData/aggregate';\nimport { type LapisFilter } from '../../types';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\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\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype FieldsMatches = Expect<Equals<typeof AggregateComponent.prototype.fields, AggregateProps['fields']>>;\ntype ViewsMatches = Expect<Equals<typeof AggregateComponent.prototype.views, AggregateProps['views']>>;\ntype FilterMatches = Expect<Equals<typeof AggregateComponent.prototype.filter, AggregateProps['filter']>>;\ntype WidthMatches = Expect<Equals<typeof AggregateComponent.prototype.width, AggregateProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof AggregateComponent.prototype.height, AggregateProps['height']>>;\ntype InitialSortFieldMatches = Expect<\n Equals<typeof AggregateComponent.prototype.initialSortField, AggregateProps['initialSortField']>\n>;\ntype InitialSortDirectionMatches = Expect<\n Equals<typeof AggregateComponent.prototype.initialSortDirection, AggregateProps['initialSortDirection']>\n>;\ntype PageSizeMatches = Expect<Equals<typeof AggregateComponent.prototype.pageSize, AggregateProps['pageSize']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\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 { type FunctionComponent } from 'preact';\nimport { 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 { Fullscreen } from '../components/fullscreen';\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 [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 (\n <NumberSequencesOverTimeTabs\n views={views}\n data={data}\n granularity={granularity}\n smoothingWindow={smoothingWindow}\n pageSize={pageSize}\n />\n );\n};\n\ninterface NumberSequencesOverTimeTabsProps {\n views: NumberSequencesOverTimeView[];\n data: NumberOfSequencesDatasets;\n granularity: TemporalGranularity;\n smoothingWindow: number;\n pageSize: boolean | number;\n}\n\nconst NumberSequencesOverTimeTabs = ({\n views,\n data,\n granularity,\n smoothingWindow,\n pageSize,\n}: 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 smoothingWindow={smoothingWindow}\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 smoothingWindow: number;\n}\n\nconst Toolbar = ({\n activeTab,\n data,\n granularity,\n yAxisScaleType,\n setYAxisScaleType,\n smoothingWindow,\n}: 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 granularity={granularity} smoothingWindow={smoothingWindow} />\n <Fullscreen />\n </>\n );\n};\n\ntype NumberSequencesOverTimeInfoProps = {\n granularity: TemporalGranularity;\n smoothingWindow: number;\n};\n\nconst NumberSequencesOverTimeInfo: FunctionComponent<NumberSequencesOverTimeInfoProps> = ({\n granularity,\n smoothingWindow,\n}) => (\n <Info>\n <InfoHeadline1>Number of sequences over time</InfoHeadline1>\n <InfoParagraph>\n This presents the number of available sequences of a variant per <b>{granularity}</b>\n {smoothingWindow > 0 && `, smoothed using a ${smoothingWindow}-${granularity} sliding window`}.\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 LapisDateFieldMatches = Expect<\n Equals<\n typeof NumberSequencesOverTimeComponent.prototype.lapisDateField,\n NumberSequencesOverTimeProps['lapisDateField']\n >\n>;\ntype ViewsMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.views, NumberSequencesOverTimeProps['views']>\n>;\ntype WidhtMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.width, NumberSequencesOverTimeProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.height, NumberSequencesOverTimeProps['height']>\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>;\ntype PageSizeMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.pageSize, NumberSequencesOverTimeProps['pageSize']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import hash from 'object-hash';\n\nexport interface Map2d<Key1, Key2, Value> {\n get(keyFirstAxis: Key1, keySecondAxis: Key2): Value | undefined;\n\n set(keyFirstAxis: Key1, keySecondAxis: Key2, value: Value): void;\n\n getRow(key: Key1, fillEmptyWith: Value): Value[];\n\n deleteRow(key: Key1): void;\n\n getFirstAxisKeys(): Key1[];\n\n getSecondAxisKeys(): Key2[];\n\n getAsArray(fillEmptyWith: Value): Value[][];\n\n serializeFirstAxis(key: Key1): string;\n serializeSecondAxis(key: Key2): string;\n\n readonly keysFirstAxis: Map<string, Key1>;\n readonly keysSecondAxis: Map<string, Key2>;\n}\n\nexport class Map2dBase<Key1 extends object | string, Key2 extends object | string, Value>\n implements Map2d<Key1, Key2, Value>\n{\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\nexport class Map2dView<Key1 extends object | string, Key2 extends object | string, Value>\n implements Map2d<Key1, Key2, Value>\n{\n readonly keysFirstAxis;\n readonly keysSecondAxis;\n\n readonly baseMap: Map2d<Key1, Key2, Value>;\n\n constructor(map: Map2d<Key1, Key2, Value>) {\n this.keysFirstAxis = new Map(map.keysFirstAxis);\n this.keysSecondAxis = new Map(map.keysSecondAxis);\n\n if (map instanceof Map2dView) {\n this.baseMap = map.baseMap;\n }\n this.baseMap = map;\n }\n\n serializeFirstAxis(key: Key1) {\n return this.baseMap.serializeFirstAxis(key);\n }\n\n serializeSecondAxis(key: Key2) {\n return this.baseMap.serializeSecondAxis(key);\n }\n\n deleteRow(key: Key1) {\n this.keysFirstAxis.delete(this.serializeFirstAxis(key));\n }\n\n get(keyFirstAxis: Key1, keySecondAxis: Key2) {\n const firstAxisKey = this.serializeFirstAxis(keyFirstAxis);\n const secondAxisKey = this.serializeSecondAxis(keySecondAxis);\n\n if (!this.keysFirstAxis.has(firstAxisKey) || !this.keysSecondAxis.has(secondAxisKey)) {\n return undefined;\n }\n\n return this.baseMap.get(keyFirstAxis, keySecondAxis);\n }\n\n set() {\n throw new Error('Cannot set value on a Map2dView');\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.baseMap.get(firstAxisKey, secondAxisKey) ?? fillEmptyWith;\n });\n });\n }\n\n getRow(key: Key1, fillEmptyWith: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n if (!this.keysFirstAxis.has(serializedKeyFirstAxis)) {\n return [];\n }\n\n return this.baseMap.getRow(key, fillEmptyWith);\n }\n}\n","import { type Dataset } from '../../operator/Dataset';\nimport { type MutationOverTimeDataGroupedByMutation } from '../../query/queryMutationsOverTime';\nimport { type DeletionEntry, type SubstitutionEntry } from '../../types';\nimport { Map2dView } from '../../utils/map2d';\nimport type { DisplayedMutationType } from '../components/mutation-type-selector';\nimport type { DisplayedSegment } from '../components/segment-selector';\n\nexport function getFilteredMutationOverTimeData(\n data: MutationOverTimeDataGroupedByMutation,\n overallMutationData: Dataset<SubstitutionEntry | DeletionEntry>,\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n proportionInterval: { min: number; max: number },\n) {\n const filteredData = new Map2dView(data);\n filterDisplayedSegments(displayedSegments, filteredData);\n filterMutationTypes(displayedMutationTypes, filteredData);\n filterProportion(filteredData, overallMutationData, 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 overallMutationData: Dataset<SubstitutionEntry | DeletionEntry>,\n proportionInterval: {\n min: number;\n max: number;\n },\n) {\n const overallProportionsByMutation = overallMutationData.content.reduce(\n (acc, { mutation, proportion }) => ({\n ...acc,\n [mutation.toString()]: proportion,\n }),\n {} as Record<string, number>,\n );\n\n data.getFirstAxisKeys().forEach((mutation) => {\n const overallProportion = overallProportionsByMutation[mutation.toString()] || -1;\n\n if (overallProportion < proportionInterval.min || overallProportion > proportionInterval.max) {\n data.deleteRow(mutation);\n }\n });\n}\n","import { type FunctionComponent } from 'preact';\n\nimport { MinMaxRangeSlider } from './min-max-range-slider';\nimport { type GraphColor, singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface ColorScale {\n min: number;\n max: number;\n color: GraphColor;\n}\n\nexport interface ColorScaleSelectorProps {\n colorScale: ColorScale;\n setColorScale: (colorScale: ColorScale) => void;\n}\n\nexport const ColorScaleSelector: FunctionComponent<ColorScaleSelectorProps> = ({ colorScale, setColorScale }) => {\n const colorDisplayCss = `w-10 h-8 border border-gray-200 mx-2 text-xs flex items-center justify-center`;\n\n return (\n <div className='flex items-center'>\n <div\n style={{\n backgroundColor: singleGraphColorRGBByName(colorScale.color, 0),\n color: 'black',\n }}\n className={colorDisplayCss}\n >\n {formatProportion(colorScale.min, 0)}\n </div>\n <div className='w-64'>\n <MinMaxRangeSlider\n min={colorScale.min * 100}\n max={colorScale.max * 100}\n setMin={(percentage) => {\n setColorScale({ ...colorScale, min: percentage / 100 });\n }}\n setMax={(percentage) => {\n setColorScale({ ...colorScale, max: percentage / 100 });\n }}\n />\n </div>\n <div\n style={{\n backgroundColor: singleGraphColorRGBByName(colorScale.color, 1),\n color: 'white',\n }}\n className={colorDisplayCss}\n >\n {formatProportion(colorScale.max, 0)}\n </div>\n </div>\n );\n};\n\nexport const getColorWithingScale = (value: number, colorScale: ColorScale) => {\n if (colorScale.min === colorScale.max) {\n return singleGraphColorRGBByName(colorScale.color, 0);\n }\n\n const colorRange = colorScale.max - colorScale.min;\n\n const alpha = (value - colorScale.min) / colorRange;\n\n return singleGraphColorRGBByName(colorScale.color, alpha);\n};\n\nexport const getTextColorForScale = (value: number, colorScale: ColorScale) => {\n if (colorScale.min === colorScale.max) {\n return 'black';\n }\n\n const colorRange = colorScale.max - colorScale.min;\n\n const alpha = (value - colorScale.min) / colorRange;\n\n return alpha <= 0.5 ? 'black' : 'white';\n};\n","import { type FunctionComponent } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nexport type TooltipPosition =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'right';\n\nexport type TooltipProps = {\n content: string | JSXInternal.Element;\n position?: TooltipPosition;\n};\n\nfunction getPositionCss(position?: TooltipPosition) {\n switch (position) {\n case 'top':\n return 'bottom-full translate-x-[-50%] left-1/2 mb-1';\n case 'top-start':\n return 'bottom-full mr-1 mb-1';\n case 'top-end':\n return 'bottom-full right-0 ml-1 mb-1';\n case 'bottom':\n return 'top-full translate-x-[-50%] left-1/2 mt-1';\n case 'bottom-start':\n return 'mr-1 mt-1';\n case 'bottom-end':\n return 'right-0 ml-1 mt-1';\n case 'left':\n return 'right-full translate-y-[-50%] top-1/2 mr-1';\n case 'right':\n return 'left-full translate-y-[-50%] top-1/2 ml-1';\n case undefined:\n return '';\n }\n}\n\nconst Tooltip: FunctionComponent<TooltipProps> = ({ children, content, position = 'bottom' }) => {\n return (\n <div className='relative w-full h-full'>\n <div className='peer w-full h-full'>{children}</div>\n <div\n className={`absolute z-10 w-max bg-white p-4 border border-gray-200 rounded-md invisible peer-hover:visible ${getPositionCss(position)}`}\n >\n {content}\n </div>\n </div>\n );\n};\n\nexport default Tooltip;\n","import { Fragment, type FunctionComponent, type RefObject } from 'preact';\nimport { useEffect, useRef, useState } from 'preact/hooks';\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 { type ColorScale, getColorWithingScale, getTextColorForScale } from '../components/color-scale-selector';\nimport Tooltip, { type TooltipPosition } from '../components/tooltip';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsOverTimeGridProps {\n data: MutationOverTimeDataGroupedByMutation;\n colorScale: ColorScale;\n}\n\nconst MAX_NUMBER_OF_GRID_ROWS = 100;\nconst MUTATION_CELL_WIDTH_REM = 8;\n\nconst MutationsOverTimeGrid: FunctionComponent<MutationsOverTimeGridProps> = ({ data, colorScale }) => {\n const allMutations = data.getFirstAxisKeys().sort(sortSubstitutionsAndDeletions);\n const shownMutations = allMutations.slice(0, MAX_NUMBER_OF_GRID_ROWS);\n\n const dates = data.getSecondAxisKeys().sort((a, b) => compareTemporal(a, b));\n\n const [showProportionText, setShowProportionText] = useState(false);\n const gridRef = useRef<HTMLDivElement>(null);\n useShowProportion(gridRef, dates.length, setShowProportionText);\n\n return (\n <>\n {allMutations.length > MAX_NUMBER_OF_GRID_ROWS && (\n <div className='pl-2'>\n Showing {MAX_NUMBER_OF_GRID_ROWS} of {allMutations.length} mutations. You can narrow the filter to\n reduce the number of mutations.\n </div>\n )}\n <div\n ref={gridRef}\n style={{\n display: 'grid',\n gridTemplateRows: `repeat(${shownMutations.length}, 24px)`,\n gridTemplateColumns: `${MUTATION_CELL_WIDTH_REM}rem repeat(${dates.length}, minmax(0.05rem, 1fr))`,\n }}\n >\n {shownMutations.map((mutation, rowIndex) => {\n return (\n <Fragment key={`fragment-${mutation.toString()}`}>\n <div\n key={`mutation-${mutation.toString()}`}\n style={{ gridRowStart: rowIndex + 1, gridColumnStart: 1 }}\n >\n <MutationCell mutation={mutation} />\n </div>\n {dates.map((date, columnIndex) => {\n const value = data.get(mutation, date) ?? { proportion: 0, count: 0, totalCount: 0 };\n const tooltipPosition = getTooltipPosition(\n rowIndex,\n shownMutations.length,\n columnIndex,\n dates.length,\n );\n return (\n <div\n style={{ gridRowStart: rowIndex + 1, gridColumnStart: columnIndex + 2 }}\n key={`${mutation.toString()}-${date.toString()}`}\n >\n <ProportionCell\n value={value}\n date={date}\n mutation={mutation}\n tooltipPosition={tooltipPosition}\n showProportionText={showProportionText}\n colorScale={colorScale}\n />\n </div>\n );\n })}\n </Fragment>\n );\n })}\n </div>\n </>\n );\n};\n\nfunction useShowProportion(\n gridRef: RefObject<HTMLDivElement>,\n girdColumns: number,\n setShowProportionText: (value: ((prevState: boolean) => boolean) | boolean) => void,\n) {\n useEffect(() => {\n const checkWidth = () => {\n if (gridRef.current) {\n const width = gridRef.current.getBoundingClientRect().width;\n const widthPerDate = (width - remToPx(MUTATION_CELL_WIDTH_REM)) / girdColumns;\n const maxWidthProportionText = 28;\n\n setShowProportionText(widthPerDate > maxWidthProportionText);\n }\n };\n\n checkWidth();\n window.addEventListener('resize', checkWidth);\n\n return () => {\n window.removeEventListener('resize', checkWidth);\n };\n }, [girdColumns, gridRef, setShowProportionText]);\n}\n\nconst remToPx = (rem: number) => rem * parseFloat(getComputedStyle(document.documentElement).fontSize);\n\nfunction getTooltipPosition(rowIndex: number, rows: number, columnIndex: number, columns: number) {\n const tooltipX = rowIndex < rows / 2 ? 'bottom' : 'top';\n const tooltipY = columnIndex < columns / 2 ? 'start' : 'end';\n return `${tooltipX}-${tooltipY}` as const;\n}\n\nconst ProportionCell: FunctionComponent<{\n value: MutationOverTimeMutationValue;\n date: Temporal;\n mutation: Substitution | Deletion;\n tooltipPosition: TooltipPosition;\n showProportionText: boolean;\n colorScale: ColorScale;\n}> = ({ value, mutation, date, tooltipPosition, showProportionText, colorScale }) => {\n const tooltipContent = (\n <div>\n <p>\n <span className='font-bold'>{date.englishName()}</span>\n </p>\n <p>({timeIntervalDisplay(date)})</p>\n <p>{mutation.code}</p>\n <p>Proportion: {formatProportion(value.proportion)}</p>\n <p>\n Count: {value.count} / {value.totalCount} total\n </p>\n </div>\n );\n\n return (\n <div className={'py-1 w-full h-full'}>\n <Tooltip content={tooltipContent} position={tooltipPosition}>\n <div\n style={{\n backgroundColor: getColorWithingScale(value.proportion, colorScale),\n color: getTextColorForScale(value.proportion, colorScale),\n }}\n className={`w-full h-full text-center hover:font-bold text-xs group`}\n >\n {showProportionText ? formatProportion(value.proportion, 0) : undefined}\n </div>\n </Tooltip>\n </div>\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 MutationCell: FunctionComponent<{ mutation: Substitution | Deletion }> = ({ mutation }) => {\n return <div className='text-center'>{mutation.toString()}</div>;\n};\n\nexport default MutationsOverTimeGrid;\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 { Map2dBase, type 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 totalCount: number;\n};\n\nexport type MutationOverTimeMutationValue = { proportion: number; count: number; totalCount: 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 queryOverallMutationData(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n return fetchAndPrepareSubstitutionsOrDeletions(lapisFilter, sequenceType).evaluate(lapis, signal);\n}\n\nexport async function queryMutationsOverTimeData(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\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 const totalCountQuery = await getTotalNumberOfSequencesInDateRange(filter).evaluate(lapis, signal);\n return {\n date,\n mutations: data.content,\n totalCount: totalCountQuery.content[0].count,\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 Map2dBase<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 totalCount: mutationData.totalCount,\n });\n });\n });\n\n addZeroValuesForDatesWithNoMutationData(dataArray, data);\n\n return dataArray;\n}\n\nfunction addZeroValuesForDatesWithNoMutationData(\n dataArray: Map2dBase<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, totalCount: 0 });\n }\n });\n }\n}\n\nfunction getTotalNumberOfSequencesInDateRange(filter: LapisFilter) {\n return new FetchAggregatedOperator<{ count: number }>(filter);\n}\n","import { type FunctionComponent } from 'preact';\n\nimport { ColorScaleSelector, type ColorScaleSelectorProps } from './color-scale-selector';\nimport { Dropdown } from './dropdown';\n\nexport type ColorScaleSelectorDropdownProps = ColorScaleSelectorProps;\n\nexport const ColorScaleSelectorDropdown: FunctionComponent<ColorScaleSelectorDropdownProps> = ({\n colorScale,\n setColorScale,\n}) => {\n return (\n <div className='w-20'>\n <Dropdown buttonTitle={`Color scale`} placement={'bottom-start'}>\n <ColorScaleSelector colorScale={colorScale} setColorScale={setColorScale} />\n </Dropdown>\n </div>\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 { type Dataset } from '../../operator/Dataset';\nimport {\n type MutationOverTimeDataGroupedByMutation,\n queryMutationsOverTimeData,\n queryOverallMutationData,\n} from '../../query/queryMutationsOverTime';\nimport {\n type DeletionEntry,\n type LapisFilter,\n type SequenceType,\n type SubstitutionEntry,\n type TemporalGranularity,\n} from '../../types';\nimport { compareTemporal } from '../../utils/temporal';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { type ColorScale } from '../components/color-scale-selector';\nimport { ColorScaleSelectorDropdown } from '../components/color-scale-selector-dropdown';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport { Fullscreen } from '../components/fullscreen';\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 { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\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 const [mutationOverTimeData, overallMutationData] = await Promise.all([\n queryMutationsOverTimeData(lapisFilter, sequenceType, lapis, lapisDateField, granularity),\n queryOverallMutationData(lapisFilter, sequenceType, lapis),\n ]);\n return { mutationOverTimeData, overallMutationData };\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 (\n <MutationsOverTimeTabs\n overallMutationData={data.overallMutationData}\n mutationOverTimeData={data.mutationOverTimeData}\n sequenceType={sequenceType}\n views={views}\n />\n );\n};\n\ntype MutationOverTimeTabsProps = {\n mutationOverTimeData: MutationOverTimeDataGroupedByMutation;\n sequenceType: SequenceType;\n views: View[];\n overallMutationData: Dataset<SubstitutionEntry | DeletionEntry>;\n};\n\nconst MutationsOverTimeTabs: FunctionComponent<MutationOverTimeTabsProps> = ({\n mutationOverTimeData,\n sequenceType,\n views,\n overallMutationData,\n}) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 0.9 });\n const [colorScale, setColorScale] = useState<ColorScale>({ min: 0, max: 1, color: 'indigo' });\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 overallMutationData,\n displayedSegments,\n displayedMutationTypes,\n proportionInterval,\n ),\n [mutationOverTimeData, overallMutationData, 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} colorScale={colorScale} />,\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 proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n filteredData={filteredData}\n colorScale={colorScale}\n setColorScale={setColorScale}\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 proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n filteredData: MutationOverTimeDataGroupedByMutation;\n colorScale: ColorScale;\n setColorScale: Dispatch<StateUpdater<ColorScale>>;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n proportionInterval,\n setProportionInterval,\n filteredData,\n colorScale,\n setColorScale,\n}) => {\n return (\n <>\n {activeTab === 'Grid' && (\n <ColorScaleSelectorDropdown colorScale={colorScale} setColorScale={setColorScale} />\n )}\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\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={() => getDownloadData(filteredData)}\n filename='mutations_over_time.csv'\n />\n <Info>Info for mutations over time</Info>\n <Fullscreen />\n </>\n );\n};\n\nfunction getDownloadData(filteredData: MutationOverTimeDataGroupedByMutation) {\n const dates = filteredData.getSecondAxisKeys().sort((a, b) => compareTemporal(a, b));\n\n return filteredData\n .getFirstAxisKeys()\n .sort(sortSubstitutionsAndDeletions)\n .map((mutation) => {\n return dates.reduce(\n (accumulated, date) => {\n const proportion = filteredData.get(mutation, date)?.proportion ?? 0;\n return {\n ...accumulated,\n [date.toString()]: proportion,\n };\n },\n { mutation: mutation.toString() },\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 limits the number of rows columns for browser performance reasons.\n * Too much data might make the browser unresponsive.\n *\n * The number of columns is limited to 200.\n * If this number are exceeded, an error message will be shown.\n * It is your responsibility to make sure that this does not happen.\n * Depending on the selected date range in the `lapisFilter`, you can adapt the granularity accordingly\n * (e.g. use months instead of days).\n *\n * The number of rows is limited to 100.\n * If there are more, the component will only show 100 mutations and notify the user.\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 WidthMatches = Expect<Equals<typeof MutationsOverTimeComponent.prototype.width, MutationsOverTimeProps['width']>>;\ntype HeightMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.height, MutationsOverTimeProps['height']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.granularity, MutationsOverTimeProps['granularity']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.lapisDateField, MutationsOverTimeProps['lapisDateField']>\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, type DateRangeSelectorProps } from '../../preact/dateRangeSelector/date-range-selector';\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<\n typeof DateRangeSelectorComponent.prototype.customSelectOptions,\n DateRangeSelectorProps<string>['customSelectOptions']\n >\n>;\ntype EarliestDateMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.earliestDate, DateRangeSelectorProps<string>['earliestDate']>\n>;\ntype InitialValueMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialValue, DateRangeSelectorProps<string>['initialValue']>\n>;\ntype InitialDateFromMatches = Expect<\n Equals<\n typeof DateRangeSelectorComponent.prototype.initialDateFrom,\n DateRangeSelectorProps<string>['initialDateFrom']\n >\n>;\ntype InitialDateToMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialDateTo, DateRangeSelectorProps<string>['initialDateTo']>\n>;\ntype WidthMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.width, DateRangeSelectorProps<string>['width']>\n>;\ntype DateColumnMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.dateColumn, DateRangeSelectorProps<string>['dateColumn']>\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, type LocationFilterProps } from '../../preact/locationFilter/location-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\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\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof LocationFilterComponent.prototype.initialValue, LocationFilterProps['initialValue']>\n>;\ntype FieldsMatches = Expect<Equals<typeof LocationFilterComponent.prototype.fields, LocationFilterProps['fields']>>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof LocationFilterComponent.prototype.placeholderText, LocationFilterProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof LocationFilterComponent.prototype.width, LocationFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\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, type TextInputProps } from '../../preact/textInput/text-input';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\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\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof TextInputComponent.prototype.initialValue, TextInputProps['initialValue']>\n>;\ntype LapisFieldMatches = Expect<Equals<typeof TextInputComponent.prototype.lapisField, TextInputProps['lapisField']>>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof TextInputComponent.prototype.placeholderText, TextInputProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof TextInputComponent.prototype.width, TextInputProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\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>\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>&lt;gene&gt;:&lt;position&gt;&lt;base&gt;</b> or\n <b>&lt;gene&gt;:&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. A <b>&lt;base&gt;</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>&lt;base&gt;</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>&lt;base&gt;</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>&lt;position&gt;&lt;base&gt;</b> or <b>&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. The{' '}\n <b>&lt;base_ref&gt;</b> is the reference base at the position. It is optional. A <b>&lt;base&gt;</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>&lt;segment&gt;:&lt;position&gt;&lt;base&gt;</b> or{' '}\n <b>&lt;segment&gt;:&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. <b>&lt;base_ref&gt;</b> is the\n reference base at the position. It is optional. A <b>&lt;base&gt;</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';\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';\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 className='ml-1' type='button' onClick={() => onDelete(mutation)}>\n ✕\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>;\ntype WidthMatches = Expect<Equals<typeof MutationFilterComponent.prototype.width, MutationFilterProps['width']>>;\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, type LineageFilterProps } from '../../preact/lineageFilter/lineage-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\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\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.initialValue, LineageFilterProps['initialValue']>\n>;\ntype LapisFieldMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.lapisField, LineageFilterProps['lapisField']>\n>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.placeholderText, LineageFilterProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof LineageFilterComponent.prototype.width, LineageFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\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","useErrorBoundary","x","item","useContext","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","key","Fragment","options","value","selectedFilters","mutation","insertion"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[0,1,2,3,10,11,70,71,72,73,74,75]}
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/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/fullscreen.tsx","../src/preact/components/info.tsx","../src/preact/components/loading-display.tsx","../src/preact/shared/floating-ui/hooks.ts","../src/preact/components/dropdown.tsx","../src/preact/components/checkbox-selector.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/ReferenceGenomeContext.ts","../src/preact/components/segment-selector.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/utils/map2d.ts","../src/preact/mutationsOverTime/getFilteredMutationsOverTimeData.ts","../src/preact/components/color-scale-selector.tsx","../src/preact/components/tooltip.tsx","../src/preact/mutationsOverTime/mutations-over-time-grid.tsx","../src/query/queryMutationsOverTime.ts","../src/preact/components/color-scale-selector-dropdown.tsx","../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/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 public readonly requestedData: string,\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 public readonly requestedData: string,\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, 'aggregated data');\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, `${sequenceType} insertions`);\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, `${sequenceType} mutations`);\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, 'the reference genomes');\n return referenceGenomeResponse.parse(await response.json());\n}\n\nconst handleErrors = async (response: Response, requestedData: string) => {\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 requestedData,\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 requestedData,\n );\n }\n\n throw new UnknownLapisError(\n `${response.statusText}: ${JSON.stringify(json)}`,\n response.status,\n requestedData,\n );\n }\n throw new UnknownLapisError(`${response.statusText}: ${response.status}`, response.status, requestedData);\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=\"&quot;\";break;case 38:f=\"&amp;\";break;case 60:f=\"&lt;\";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 return 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 { type MutableRef, 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 resizeChartAfterFullscreenChange(chartRef, 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\nconst resizeChartAfterFullscreenChange = (\n chartRef: MutableRef<Chart | null>,\n ctx: CanvasRenderingContext2D,\n configuration: ChartConfiguration,\n) => {\n document.addEventListener('fullscreenchange', () => {\n chartRef.current?.destroy();\n chartRef.current = new Chart(ctx, configuration);\n });\n};\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 DisplayedMutationType } from '../components/mutation-type-selector';\nimport { type DisplayedSegment } from '../components/segment-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 { 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 { useEffect, useRef } from 'preact/hooks';\n\nimport { LapisError, UnknownLapisError } from '../../lapisApi/lapisApi';\n\nexport const GS_ERROR_EVENT_TYPE = 'gs-error';\n\nexport class ErrorEvent extends Event {\n constructor(public readonly error: Error) {\n super(GS_ERROR_EVENT_TYPE, {\n bubbles: true,\n composed: true,\n });\n }\n}\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 containerRef = useRef<HTMLInputElement>(null);\n const ref = useRef<HTMLDialogElement>(null);\n\n useEffect(() => {\n containerRef.current?.dispatchEvent(new ErrorEvent(error));\n });\n\n const { headline, details } = getDisplayedErrorMessage(error);\n\n return (\n <div\n ref={containerRef}\n className='h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center flex-col'\n >\n <div className='text-red-700 font-bold'>{headline}</div>\n <div>\n Oops! Something went wrong.\n {details !== undefined && (\n <>\n {' '}\n <button className='underline hover:text-gray-400' onClick={() => ref.current?.showModal()}>\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'>{details.headline}</h1>\n <p class='py-4'>{details.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\nfunction getDisplayedErrorMessage(error: Error) {\n if (error instanceof UserFacingError) {\n return {\n headline: `Error - ${error.headline}`,\n details: {\n headline: error.headline,\n message: error.message,\n },\n };\n }\n\n if (error instanceof LapisError) {\n return {\n headline: `Error - Failed fetching ${error.requestedData} from LAPIS`,\n details: {\n headline: `LAPIS request failed: ${error.requestedData} - ${error.problemDetail.status} ${error.problemDetail.title}`,\n message: error.problemDetail.detail ?? error.message,\n },\n };\n }\n\n if (error instanceof UnknownLapisError) {\n return {\n headline: `Error - Failed fetching ${error.requestedData} from LAPIS`,\n details: {\n headline: `LAPIS request failed: An unexpected error occurred while fetching ${error.requestedData}`,\n message: error.message,\n },\n };\n }\n\n return { headline: 'Error', details: undefined };\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 (\n <div style={size} className='bg-white'>\n {children}\n </div>\n );\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 { useEffect, useRef, useState } from 'preact/hooks';\n\nexport const Fullscreen = () => {\n const element = useRef<HTMLButtonElement>(null);\n const isFullscreen = useFullscreenStatus();\n return (\n <button\n ref={element}\n onClick={async () => {\n if (element.current) {\n if (isFullscreen) {\n await document.exitFullscreen();\n } else {\n const componentRoot = findComponentRoot(element.current);\n if (componentRoot) {\n await componentRoot.requestFullscreen();\n }\n }\n }\n }}\n className={`mt-0.5 iconify text-2xl ${isFullscreen ? 'mdi--fullscreen-exit hover:scale-90' : 'mdi--fullscreen hover:scale-110'}`}\n title={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n />\n );\n};\n\nfunction findComponentRoot(element: HTMLElement) {\n return findShadowRoot(element)?.children[0];\n}\n\nfunction findShadowRoot(element: HTMLElement) {\n let current: Node = element;\n while (current) {\n if (current instanceof ShadowRoot) {\n return current;\n }\n if (current.parentNode === null) {\n return null;\n }\n current = current.parentNode;\n }\n return null;\n}\n\nfunction useFullscreenStatus(): boolean {\n const [isFullscreen, setIsFullscreen] = useState<boolean>(document.fullscreenElement !== null);\n useEffect(() => {\n const handleFullscreenChange = () => {\n setIsFullscreen(document.fullscreenElement !== null);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n return isFullscreen;\n}\n","import { type FunctionComponent } from 'preact';\nimport { useRef } from 'preact/hooks';\n\nconst Info: FunctionComponent = ({ children }) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n\n const toggleHelp = () => {\n dialogRef.current?.showModal();\n };\n\n return (\n <div className='relative'>\n <button type='button' className='btn btn-xs' onClick={toggleHelp}>\n ?\n </button>\n <dialog ref={dialogRef} className={'modal modal-bottom sm:modal-middle'}>\n <div className='modal-box sm:max-w-5xl'>\n <form method='dialog'>\n <button className='btn btn-sm btn-circle btn-ghost absolute right-2 top-2'>✕</button>\n </form>\n <div className={'flex flex-col'}>{children}</div>\n <div className='modal-action'>\n <form method='dialog'>\n <button className={'float-right underline text-sm hover:text-blue-700 mr-2'}>Close</button>\n </form>\n </div>\n </div>\n <form method='dialog' className='modal-backdrop'>\n <button>Helper to close when clicked outside</button>\n </form>\n </dialog>\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 type InfoComponentCodeProps = {\n componentName: string;\n params: object;\n lapisUrl: string;\n};\n\nexport const InfoComponentCode: FunctionComponent<InfoComponentCodeProps> = ({ componentName, params, lapisUrl }) => {\n const componentCode = componentParametersToCode(componentName, params, lapisUrl);\n const codePenData = {\n title: 'GenSpectrum dashboard component',\n html: generateFullExampleCode(componentCode, componentName),\n layout: 'left',\n editors: '100',\n };\n return (\n <>\n <InfoHeadline2>Use this component yourself</InfoHeadline2>\n <InfoParagraph>\n This component was created using the following parameters:\n <div className='p-4 border border-gray-200 rounded-lg overflow-x-auto'>\n <pre>\n <code>{componentCode}</code>\n </pre>\n </div>\n </InfoParagraph>\n <InfoParagraph>\n You can add this component to your own website using the{' '}\n <InfoLink href='https://github.com/GenSpectrum/dashboard-components'>\n GenSpectrum dashboard components library\n </InfoLink>{' '}\n and the code from above.\n </InfoParagraph>\n <InfoParagraph>\n <form action='https://codepen.io/pen/define' method='POST' target='_blank'>\n <input\n type='hidden'\n name='data'\n value={JSON.stringify(codePenData).replace(/\"/g, '&quot;').replace(/'/g, '&apos;')}\n />\n\n <button className='text-blue-600 hover:text-blue-800' type='submit'>\n Click here to try it out on CodePen.\n </button>\n </form>\n </InfoParagraph>\n </>\n );\n};\n\nexport default Info;\n\nfunction componentParametersToCode(componentName: string, params: object, lapisUrl: string) {\n const stringifyIfNeeded = (value: unknown) => {\n return typeof value === 'object' ? JSON.stringify(value) : value;\n };\n\n const attributes = indentLines(\n Object.entries(params)\n .map(([key, value]) => `${key}='${stringifyIfNeeded(value)}'`)\n .join('\\n'),\n 4,\n );\n return `<gs-app lapis=\"${lapisUrl}\">\\n <gs-${componentName}\\n${attributes}\\n />\\n</gs-app>`;\n}\n\nfunction generateFullExampleCode(componentCode: string, componentName: string) {\n const storyBookPath = `/docs/visualization-${componentName}--docs`;\n return `<html>\n<head>\n <script type=\"module\" src=\"https://unpkg.com/@genspectrum/dashboard-components@latest/standalone-bundle/dashboard-components.js\"></script>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/@genspectrum/dashboard-components@latest/dist/style.css\" />\n</head>\n\n<body>\n <!-- Component documentation: https://genspectrum.github.io/dashboard-components/?path=${storyBookPath} -->\n${indentLines(componentCode, 2)}\n</body>\n</html>\n`;\n}\n\nfunction indentLines(text: string, numberSpaces: number) {\n const spaces = ' '.repeat(numberSpaces);\n return text\n .split('\\n')\n .map((line) => spaces + line)\n .join('\\n');\n}\n","import { type FunctionComponent } from 'preact';\n\nexport const LoadingDisplay: FunctionComponent = () => {\n return (\n <div\n aria-label={'Loading'}\n className='h-full w-full border-2 border-gray-100 rounded-md flex justify-center items-center'\n >\n <div className='loading loading-spinner loading-md text-neutral-500' />\n </div>\n );\n};\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<() => void | 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 <>\n <button type='button' className='btn btn-xs whitespace-nowrap w-full' onClick={toggle} ref={referenceRef}>\n {buttonTitle}\n </button>\n <div ref={floatingRef} className={`${dropdownClass} ${showContent ? '' : 'hidden'}`}>\n {children}\n </div>\n </>\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 <button\n className='btn btn-xs btn-ghost'\n onClick={() => {\n const newItems = items.map((item) => ({ ...item, checked: true }));\n setItems(newItems);\n }}\n >\n Select all\n </button>\n <button\n className='btn btn-xs btn-ghost'\n onClick={() => {\n const newItems = items.map((item) => ({ ...item, checked: false }));\n setItems(newItems);\n }}\n >\n Select none\n </button>\n <div className='divider mt-0 mb-0' />\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 { 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 return (\n <div className='w-[6rem]'>\n <CheckboxSelector\n items={displayedMutationTypes}\n label={getMutationTypesSelectorLabel(displayedMutationTypes)}\n setItems={(items) => setDisplayedMutationTypes(items)}\n />\n </div>\n );\n};\n\nconst getMutationTypesSelectorLabel = (displayedMutationTypes: DisplayedMutationType[]) => {\n const checkedLabels = displayedMutationTypes.filter((displayedMutationType) => displayedMutationType.checked);\n\n if (checkedLabels.length === 0) {\n return `No types`;\n }\n if (displayedMutationTypes.length === checkedLabels.length) {\n return displayedMutationTypes\n .map((type) => {\n switch (type.type) {\n case 'substitution':\n return 'Subst.';\n case 'deletion':\n return 'Del.';\n }\n })\n .join(', ');\n }\n\n return checkedLabels\n .map((type) => {\n return type.label;\n })\n .join(', ');\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 w-full h-full'>\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 indicateError?: boolean;\n};\n\nconst percentageInRange = (percentage: number) => {\n return percentage <= 100 && percentage >= 0;\n};\n\nexport const PercentInput: FunctionComponent<PercentInputProps> = ({\n percentage,\n setPercentage,\n indicateError = false,\n}) => {\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 if (value === internalPercentage || input.value === '') {\n return;\n }\n\n const inRange = percentageInRange(value);\n\n if (inRange) {\n setPercentage(value);\n }\n setInternalPercentage(value);\n };\n\n const isError = indicateError || !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';\nimport { useEffect, useRef, useState } from 'preact/hooks';\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\nfunction useUpdateExternalValueInIntervals(\n setExternalValue: (minProportion: number) => void,\n updateIntervalInMs: number,\n internalValue: number,\n) {\n const hasMounted = useRef(false);\n\n useEffect(() => {\n if (!hasMounted.current) {\n hasMounted.current = true;\n return;\n }\n\n const minTimeout = setTimeout(() => {\n setExternalValue(internalValue);\n }, updateIntervalInMs);\n\n return () => clearTimeout(minTimeout);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- We only want to run this effect when the internal value changes\n }, [internalValue]);\n}\n\nexport const ProportionSelector: FunctionComponent<ProportionSelectorProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n}) => {\n const updateIntervalInMs = 300;\n const { min: minProportion, max: maxProportion } = proportionInterval;\n\n const [internalMinProportion, setInternalMinProportion] = useState(minProportion);\n const [internalMaxProportion, setInternalMaxProportion] = useState(maxProportion);\n\n useUpdateExternalValueInIntervals(setMinProportion, updateIntervalInMs, internalMinProportion);\n const updateMinPercentage = (minPercentage: number) => {\n const newMinProportion = minPercentage / 100;\n setInternalMinProportion(newMinProportion);\n };\n\n useUpdateExternalValueInIntervals(setMaxProportion, updateIntervalInMs, internalMaxProportion);\n const updateMaxPercentage = (maxPercentage: number) => {\n const newMaxProportion = maxPercentage / 100;\n setInternalMaxProportion(newMaxProportion);\n };\n\n const indicateError = internalMinProportion > internalMaxProportion;\n\n return (\n <div class='flex flex-col w-64 mb-2'>\n <div class='flex items-center '>\n <PercentInput\n percentage={internalMinProportion * 100}\n setPercentage={updateMinPercentage}\n indicateError={indicateError}\n />\n <div class='m-2'>-</div>\n <PercentInput\n percentage={internalMaxProportion * 100}\n setPercentage={updateMaxPercentage}\n indicateError={indicateError}\n />\n </div>\n <div class='my-1'>\n <MinMaxRangeSlider\n min={internalMinProportion * 100}\n max={internalMaxProportion * 100}\n setMin={updateMinPercentage}\n setMax={updateMaxPercentage}\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 & { labelPrefix?: string };\n\nexport const ProportionSelectorDropdown: FunctionComponent<ProportionSelectorDropdownProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n labelPrefix = 'Proportion',\n}) => {\n const percentLabel = `${(proportionInterval.min * 100).toFixed(1)}% - ${(proportionInterval.max * 100).toFixed(1)}%`;\n\n const width = 'w-[calc(1.5 * var(--tw-space-x-reverse) + 1.5 * var(--tw-space-x))]';\n\n return (\n <div className={width}>\n <Dropdown buttonTitle={`${labelPrefix} ${percentLabel}`} placement={'bottom-start'}>\n <ProportionSelector\n proportionInterval={proportionInterval}\n setMinProportion={setMinProportion}\n setMaxProportion={setMaxProportion}\n />\n </Dropdown>\n </div>\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};\n\nexport const SegmentSelector: FunctionComponent<SegmentSelectorProps> = ({\n displayedSegments,\n setDisplayedSegments,\n}) => {\n if (displayedSegments.length <= 1) {\n return null;\n }\n\n return (\n <div className='w-24'>\n <CheckboxSelector\n items={displayedSegments}\n label={getSegmentSelectorLabel(displayedSegments)}\n setItems={(items) => setDisplayedSegments(items)}\n />\n </div>\n );\n};\n\nconst getSegmentSelectorLabel = (displayedSegments: DisplayedSegment[]) => {\n const allSelectedSelected = displayedSegments\n .filter((segment) => segment.checked)\n .map((segment) => segment.segment);\n\n if (allSelectedSelected.length === 0) {\n return `No segments`;\n }\n if (displayedSegments.length === allSelectedSelected.length) {\n return `All segments`;\n }\n\n const longestDisplayString = `All segments`;\n\n const allSelectedSelectedString = allSelectedSelected.join(', ');\n\n if (longestDisplayString.length >= allSelectedSelectedString.length) {\n return allSelectedSelectedString;\n }\n\n return `${allSelectedSelected.length} ${allSelectedSelected.length === 1 ? 'segment' : 'segments'}`;\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 { 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 { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport { Fullscreen } from '../components/fullscreen';\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 { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\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>Info for mutation comparison</Info>\n <Fullscreen />\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>;\ntype WidthMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.width, MutationComparisonProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.height, MutationComparisonProps['height']>\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.pageSize, MutationComparisonProps['pageSize']>\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';\nimport { useMemo } from 'preact/hooks';\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 = useMemo(\n () => getMutationsGridData(data, sequenceType, proportionInterval).map((row) => Object.values(row)),\n [data, proportionInterval, sequenceType],\n );\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 DisplayedMutationType } from '../components/mutation-type-selector';\nimport { type DisplayedSegment } from '../components/segment-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 { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoHeadline1, InfoHeadline2, InfoLink, InfoParagraph } 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 { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\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 <MutationsInfo />\n <Fullscreen />\n </>\n );\n};\n\nconst MutationsInfo = () => (\n <Info>\n <InfoHeadline1>Mutations</InfoHeadline1>\n <InfoParagraph>\n This shows mutations of a variant. There are three types of mutations:{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Substitution'>substitutions</InfoLink>,{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Deletion'>deletions</InfoLink> and{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Insertion'>insertions</InfoLink>.\n </InfoParagraph>\n <InfoHeadline2>Proportion calculation</InfoHeadline2>\n <InfoParagraph>\n The proportion of a mutation is calculated by dividing the number of sequences with the mutation by the\n total number of sequences with a non-ambiguous symbol at the position.\n </InfoParagraph>\n <InfoParagraph>\n <b>Example:</b> Assume we look at nucleotide mutations at position 5 where the reference has a T and assume\n there are 10 sequences in total:\n <ul className='list-disc list-inside ml-2'>\n <li>3 sequences have a C,</li>\n <li>2 sequences have a T,</li>\n <li>1 sequence has a G,</li>\n <li>3 sequences have an N,</li>\n <li>1 sequence has a Y (which means T or C),</li>\n </ul>\n then the proportion of the T5C mutation is 50%. The 4 sequences that have an N or Y are excluded from the\n calculation.\n </InfoParagraph>\n </Info>\n);\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { Mutations, type MutationsProps } from '../../preact/mutations/mutations';\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<\n Equals<typeof MutationsComponent.prototype.lapisFilter, MutationsProps['lapisFilter']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationsComponent.prototype.sequenceType, MutationsProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<Equals<typeof MutationsComponent.prototype.views, MutationsProps['views']>>;\ntype WidthMatches = Expect<Equals<typeof MutationsComponent.prototype.width, MutationsProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof MutationsComponent.prototype.height, MutationsProps['height']>>;\ntype PageSizeMatches = Expect<Equals<typeof MutationsComponent.prototype.pageSize, MutationsProps['pageSize']>>;\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\nexport type 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\n/**\n * https://day.js.org/docs/en/plugin/advanced-format\n */\nconst FORMAT_ISO_WEEK_YEAR_WEEK = 'GGGG-[W]WW';\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(FORMAT_ISO_WEEK_YEAR_WEEK));\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(FORMAT_ISO_WEEK_YEAR_WEEK);\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(FORMAT_ISO_WEEK_YEAR_WEEK);\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('-W').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 Operator<Fields & { count: number }>\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 { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, 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 AxisMax } 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 {\n width: string;\n height: string;\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 yAxisMaxLinear: AxisMax;\n yAxisMaxLogarithmic: AxisMax;\n}\n\nexport const PrevalenceOverTime: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <PrevalenceOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const PrevalenceOverTimeInner: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { numeratorFilter, denominatorFilter, granularity, smoothingWindow, lapisDateField } = componentProps;\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, lapisDateField],\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 <PrevalenceOverTimeTabs data={data} {...componentProps} />;\n};\n\ntype PrevalenceOverTimeTabsProps = PrevalenceOverTimeProps & {\n data: PrevalenceOverTimeData;\n};\n\nconst PrevalenceOverTimeTabs: FunctionComponent<PrevalenceOverTimeTabsProps> = ({ data, ...componentProps }) => {\n const { views, granularity, confidenceIntervalMethods, pageSize, yAxisMaxLinear, yAxisMaxLogarithmic } =\n componentProps;\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n const [confidenceIntervalMethod, setConfidenceIntervalMethod] = useState<ConfidenceIntervalMethod>(\n confidenceIntervalMethods.length > 0 ? confidenceIntervalMethods[0] : 'none',\n );\n const yAxisMaxConfig = { linear: yAxisMaxLinear, logarithmic: yAxisMaxLogarithmic };\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 confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n {...componentProps}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = PrevalenceOverTimeProps & {\n activeTab: string;\n data: PrevalenceOverTimeData;\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 confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n data,\n ...componentProps\n}) => {\n const { confidenceIntervalMethods, granularity } = componentProps;\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 {...componentProps} />\n <Fullscreen />\n </>\n );\n};\n\nconst PrevalenceOverTimeInfo: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { granularity, smoothingWindow, views } = componentProps;\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Prevalence over time</InfoHeadline1>\n <InfoParagraph>\n This presents the proportion of one or more variants per <b>{granularity}</b>\n {smoothingWindow > 0 && `, smoothed using a ${smoothingWindow}-${granularity} sliding window`}. The\n proportion is calculated as the number of sequences of the variant(s) divided by the number of sequences\n that match the <code>denominatorFilter</code> (see below).\n </InfoParagraph>\n <InfoParagraph>\n Sequences that have no assigned date will not be shown in the line and bubble chart. They will show up\n in the bar and table view with date \"unknown\".\n </InfoParagraph>\n {views.includes('bubble') && (\n <>\n <InfoHeadline2>Bubble chart</InfoHeadline2>\n <InfoParagraph>\n The size of the bubble scales with the total number of available sequences from the{' '}\n {granularity}.\n </InfoParagraph>\n </>\n )}\n <InfoComponentCode componentName='prevalence-over-time' params={componentProps} lapisUrl={lapis} />\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 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 yAxisMaxLinear={this.yAxisMaxLinear}\n yAxisMaxLogarithmic={this.yAxisMaxLogarithmic}\n />\n );\n }\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 SmoothingWindowMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.smoothingWindow, PrevalenceOverTimeProps['smoothingWindow']>\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>;\ntype WidhtMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.width, PrevalenceOverTimeProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.height, PrevalenceOverTimeProps['height']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.lapisDateField, PrevalenceOverTimeProps['lapisDateField']>\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.pageSize, PrevalenceOverTimeProps['pageSize']>\n>;\ntype YAxisMaxLinearMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.yAxisMaxLinear, PrevalenceOverTimeProps['yAxisMaxLinear']>\n>;\ntype YAxisMaxLogarithmicMatches = Expect<\n Equals<\n typeof PrevalenceOverTimeComponent.prototype.yAxisMaxLogarithmic,\n PrevalenceOverTimeProps['yAxisMaxLogarithmic']\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 { Fullscreen } from '../components/fullscreen';\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, lapisDateField],\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 <Fullscreen />\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} from '../../preact/relativeGrowthAdvantage/relative-growth-advantage';\nimport { type AxisMax } from '../../preact/shared/charts/getYAxisMax';\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<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.numeratorFilter,\n RelativeGrowthAdvantageProps['numeratorFilter']\n >\n>;\ntype DenominatorMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.denominatorFilter,\n RelativeGrowthAdvantageProps['denominatorFilter']\n >\n>;\ntype GenerationTimeMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.generationTime,\n RelativeGrowthAdvantageProps['generationTime']\n >\n>;\ntype ViewsMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.views, RelativeGrowthAdvantageProps['views']>\n>;\ntype WidthMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.width, RelativeGrowthAdvantageProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.height, RelativeGrowthAdvantageProps['height']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.lapisDateField,\n RelativeGrowthAdvantageProps['lapisDateField']\n >\n>;\ntype YAxisMaxLinearMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.yAxisMaxLinear,\n Required<RelativeGrowthAdvantageProps['yAxisMaxConfig']>['linear']\n >\n>;\ntype YAxisMaxLogarithmicMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.yAxisMaxLogarithmic,\n Required<RelativeGrowthAdvantageProps['yAxisMaxConfig']>['logarithmic']\n >\n>;\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 { Fullscreen } from '../components/fullscreen';\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 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} fields={fields} />} />;\n};\n\ntype ToolbarProps = {\n data: AggregateData;\n fields: string[];\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({ data, fields }) => {\n return (\n <div class='flex flex-row'>\n <CsvDownloadButton className='mx-1 btn btn-xs' getData={() => data} filename='aggregate.csv' />\n <Info>\n <InfoHeadline1>Aggregated data</InfoHeadline1>\n <InfoParagraph>\n This table shows the number and proportion of sequences stratified by the following fields:{' '}\n {fields.join(', ')}. The proportion is calculated with respect to the total count within the\n filtered dataset.\n </InfoParagraph>\n </Info>\n <Fullscreen />\n </div>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { Aggregate, type AggregateProps, type View } from '../../preact/aggregatedData/aggregate';\nimport { type LapisFilter } from '../../types';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\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\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype FieldsMatches = Expect<Equals<typeof AggregateComponent.prototype.fields, AggregateProps['fields']>>;\ntype ViewsMatches = Expect<Equals<typeof AggregateComponent.prototype.views, AggregateProps['views']>>;\ntype FilterMatches = Expect<Equals<typeof AggregateComponent.prototype.filter, AggregateProps['filter']>>;\ntype WidthMatches = Expect<Equals<typeof AggregateComponent.prototype.width, AggregateProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof AggregateComponent.prototype.height, AggregateProps['height']>>;\ntype InitialSortFieldMatches = Expect<\n Equals<typeof AggregateComponent.prototype.initialSortField, AggregateProps['initialSortField']>\n>;\ntype InitialSortDirectionMatches = Expect<\n Equals<typeof AggregateComponent.prototype.initialSortDirection, AggregateProps['initialSortDirection']>\n>;\ntype PageSizeMatches = Expect<Equals<typeof AggregateComponent.prototype.pageSize, AggregateProps['pageSize']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\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 { type FunctionComponent } from 'preact';\nimport { 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 { Fullscreen } from '../components/fullscreen';\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 [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 (\n <NumberSequencesOverTimeTabs\n views={views}\n data={data}\n granularity={granularity}\n smoothingWindow={smoothingWindow}\n pageSize={pageSize}\n />\n );\n};\n\ninterface NumberSequencesOverTimeTabsProps {\n views: NumberSequencesOverTimeView[];\n data: NumberOfSequencesDatasets;\n granularity: TemporalGranularity;\n smoothingWindow: number;\n pageSize: boolean | number;\n}\n\nconst NumberSequencesOverTimeTabs = ({\n views,\n data,\n granularity,\n smoothingWindow,\n pageSize,\n}: 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 smoothingWindow={smoothingWindow}\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 smoothingWindow: number;\n}\n\nconst Toolbar = ({\n activeTab,\n data,\n granularity,\n yAxisScaleType,\n setYAxisScaleType,\n smoothingWindow,\n}: 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 granularity={granularity} smoothingWindow={smoothingWindow} />\n <Fullscreen />\n </>\n );\n};\n\ntype NumberSequencesOverTimeInfoProps = {\n granularity: TemporalGranularity;\n smoothingWindow: number;\n};\n\nconst NumberSequencesOverTimeInfo: FunctionComponent<NumberSequencesOverTimeInfoProps> = ({\n granularity,\n smoothingWindow,\n}) => (\n <Info>\n <InfoHeadline1>Number of sequences over time</InfoHeadline1>\n <InfoParagraph>\n This presents the number of available sequences of a variant per <b>{granularity}</b>\n {smoothingWindow > 0 && `, smoothed using a ${smoothingWindow}-${granularity} sliding window`}.\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 LapisDateFieldMatches = Expect<\n Equals<\n typeof NumberSequencesOverTimeComponent.prototype.lapisDateField,\n NumberSequencesOverTimeProps['lapisDateField']\n >\n>;\ntype ViewsMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.views, NumberSequencesOverTimeProps['views']>\n>;\ntype WidhtMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.width, NumberSequencesOverTimeProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.height, NumberSequencesOverTimeProps['height']>\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>;\ntype PageSizeMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.pageSize, NumberSequencesOverTimeProps['pageSize']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import hash from 'object-hash';\n\nexport interface Map2d<Key1, Key2, Value> {\n get(keyFirstAxis: Key1, keySecondAxis: Key2): Value | undefined;\n\n set(keyFirstAxis: Key1, keySecondAxis: Key2, value: Value): void;\n\n getRow(key: Key1, fillEmptyWith: Value): Value[];\n\n deleteRow(key: Key1): void;\n\n getFirstAxisKeys(): Key1[];\n\n getSecondAxisKeys(): Key2[];\n\n getAsArray(fillEmptyWith: Value): Value[][];\n\n serializeFirstAxis(key: Key1): string;\n serializeSecondAxis(key: Key2): string;\n\n readonly keysFirstAxis: Map<string, Key1>;\n readonly keysSecondAxis: Map<string, Key2>;\n}\n\nexport class Map2dBase<Key1 extends object | string, Key2 extends object | string, Value>\n implements Map2d<Key1, Key2, Value>\n{\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\nexport class Map2dView<Key1 extends object | string, Key2 extends object | string, Value>\n implements Map2d<Key1, Key2, Value>\n{\n readonly keysFirstAxis;\n readonly keysSecondAxis;\n\n readonly baseMap: Map2d<Key1, Key2, Value>;\n\n constructor(map: Map2d<Key1, Key2, Value>) {\n this.keysFirstAxis = new Map(map.keysFirstAxis);\n this.keysSecondAxis = new Map(map.keysSecondAxis);\n\n if (map instanceof Map2dView) {\n this.baseMap = map.baseMap;\n }\n this.baseMap = map;\n }\n\n serializeFirstAxis(key: Key1) {\n return this.baseMap.serializeFirstAxis(key);\n }\n\n serializeSecondAxis(key: Key2) {\n return this.baseMap.serializeSecondAxis(key);\n }\n\n deleteRow(key: Key1) {\n this.keysFirstAxis.delete(this.serializeFirstAxis(key));\n }\n\n get(keyFirstAxis: Key1, keySecondAxis: Key2) {\n const firstAxisKey = this.serializeFirstAxis(keyFirstAxis);\n const secondAxisKey = this.serializeSecondAxis(keySecondAxis);\n\n if (!this.keysFirstAxis.has(firstAxisKey) || !this.keysSecondAxis.has(secondAxisKey)) {\n return undefined;\n }\n\n return this.baseMap.get(keyFirstAxis, keySecondAxis);\n }\n\n set() {\n throw new Error('Cannot set value on a Map2dView');\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.baseMap.get(firstAxisKey, secondAxisKey) ?? fillEmptyWith;\n });\n });\n }\n\n getRow(key: Key1, fillEmptyWith: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n if (!this.keysFirstAxis.has(serializedKeyFirstAxis)) {\n return [];\n }\n\n return this.baseMap.getRow(key, fillEmptyWith);\n }\n}\n","import { type Dataset } from '../../operator/Dataset';\nimport { type MutationOverTimeDataGroupedByMutation } from '../../query/queryMutationsOverTime';\nimport { type DeletionEntry, type SubstitutionEntry } from '../../types';\nimport { Map2dView } from '../../utils/map2d';\nimport type { DisplayedMutationType } from '../components/mutation-type-selector';\nimport type { DisplayedSegment } from '../components/segment-selector';\n\nexport function getFilteredMutationOverTimeData(\n data: MutationOverTimeDataGroupedByMutation,\n overallMutationData: Dataset<SubstitutionEntry | DeletionEntry>,\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n proportionInterval: { min: number; max: number },\n) {\n const filteredData = new Map2dView(data);\n filterDisplayedSegments(displayedSegments, filteredData);\n filterMutationTypes(displayedMutationTypes, filteredData);\n filterProportion(filteredData, overallMutationData, 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 overallMutationData: Dataset<SubstitutionEntry | DeletionEntry>,\n proportionInterval: {\n min: number;\n max: number;\n },\n) {\n const overallProportionsByMutation = overallMutationData.content.reduce(\n (acc, { mutation, proportion }) => ({\n ...acc,\n [mutation.toString()]: proportion,\n }),\n {} as Record<string, number>,\n );\n\n data.getFirstAxisKeys().forEach((mutation) => {\n const overallProportion = overallProportionsByMutation[mutation.toString()] || -1;\n\n if (overallProportion < proportionInterval.min || overallProportion > proportionInterval.max) {\n data.deleteRow(mutation);\n }\n });\n}\n","import { type FunctionComponent } from 'preact';\n\nimport { MinMaxRangeSlider } from './min-max-range-slider';\nimport { type GraphColor, singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface ColorScale {\n min: number;\n max: number;\n color: GraphColor;\n}\n\nexport interface ColorScaleSelectorProps {\n colorScale: ColorScale;\n setColorScale: (colorScale: ColorScale) => void;\n}\n\nexport const ColorScaleSelector: FunctionComponent<ColorScaleSelectorProps> = ({ colorScale, setColorScale }) => {\n const colorDisplayCss = `w-10 h-8 border border-gray-200 mx-2 text-xs flex items-center justify-center`;\n\n return (\n <div className='flex items-center'>\n <div\n style={{\n backgroundColor: singleGraphColorRGBByName(colorScale.color, 0),\n color: 'black',\n }}\n className={colorDisplayCss}\n >\n {formatProportion(colorScale.min, 0)}\n </div>\n <div className='w-64'>\n <MinMaxRangeSlider\n min={colorScale.min * 100}\n max={colorScale.max * 100}\n setMin={(percentage) => {\n setColorScale({ ...colorScale, min: percentage / 100 });\n }}\n setMax={(percentage) => {\n setColorScale({ ...colorScale, max: percentage / 100 });\n }}\n />\n </div>\n <div\n style={{\n backgroundColor: singleGraphColorRGBByName(colorScale.color, 1),\n color: 'white',\n }}\n className={colorDisplayCss}\n >\n {formatProportion(colorScale.max, 0)}\n </div>\n </div>\n );\n};\n\nexport const getColorWithingScale = (value: number, colorScale: ColorScale) => {\n if (colorScale.min === colorScale.max) {\n return singleGraphColorRGBByName(colorScale.color, 0);\n }\n\n const colorRange = colorScale.max - colorScale.min;\n\n const alpha = (value - colorScale.min) / colorRange;\n\n return singleGraphColorRGBByName(colorScale.color, alpha);\n};\n\nexport const getTextColorForScale = (value: number, colorScale: ColorScale) => {\n if (colorScale.min === colorScale.max) {\n return 'black';\n }\n\n const colorRange = colorScale.max - colorScale.min;\n\n const alpha = (value - colorScale.min) / colorRange;\n\n return alpha <= 0.5 ? 'black' : 'white';\n};\n","import { type FunctionComponent } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nexport type TooltipPosition =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'right';\n\nexport type TooltipProps = {\n content: string | JSXInternal.Element;\n position?: TooltipPosition;\n};\n\nfunction getPositionCss(position?: TooltipPosition) {\n switch (position) {\n case 'top':\n return 'bottom-full translate-x-[-50%] left-1/2 mb-1';\n case 'top-start':\n return 'bottom-full mr-1 mb-1';\n case 'top-end':\n return 'bottom-full right-0 ml-1 mb-1';\n case 'bottom':\n return 'top-full translate-x-[-50%] left-1/2 mt-1';\n case 'bottom-start':\n return 'mr-1 mt-1';\n case 'bottom-end':\n return 'right-0 ml-1 mt-1';\n case 'left':\n return 'right-full translate-y-[-50%] top-1/2 mr-1';\n case 'right':\n return 'left-full translate-y-[-50%] top-1/2 ml-1';\n case undefined:\n return '';\n }\n}\n\nconst Tooltip: FunctionComponent<TooltipProps> = ({ children, content, position = 'bottom' }) => {\n return (\n <div className='relative w-full h-full'>\n <div className='peer w-full h-full'>{children}</div>\n <div\n className={`absolute z-10 w-max bg-white p-4 border border-gray-200 rounded-md invisible peer-hover:visible ${getPositionCss(position)}`}\n >\n {content}\n </div>\n </div>\n );\n};\n\nexport default Tooltip;\n","import { Fragment, type FunctionComponent, type RefObject } from 'preact';\nimport { useEffect, useRef, useState } from 'preact/hooks';\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 { type ColorScale, getColorWithingScale, getTextColorForScale } from '../components/color-scale-selector';\nimport Tooltip, { type TooltipPosition } from '../components/tooltip';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsOverTimeGridProps {\n data: MutationOverTimeDataGroupedByMutation;\n colorScale: ColorScale;\n}\n\nconst MAX_NUMBER_OF_GRID_ROWS = 100;\nconst MUTATION_CELL_WIDTH_REM = 8;\n\nconst MutationsOverTimeGrid: FunctionComponent<MutationsOverTimeGridProps> = ({ data, colorScale }) => {\n const allMutations = data.getFirstAxisKeys().sort(sortSubstitutionsAndDeletions);\n const shownMutations = allMutations.slice(0, MAX_NUMBER_OF_GRID_ROWS);\n\n const dates = data.getSecondAxisKeys().sort((a, b) => compareTemporal(a, b));\n\n const [showProportionText, setShowProportionText] = useState(false);\n const gridRef = useRef<HTMLDivElement>(null);\n useShowProportion(gridRef, dates.length, setShowProportionText);\n\n return (\n <>\n {allMutations.length > MAX_NUMBER_OF_GRID_ROWS && (\n <div className='pl-2'>\n Showing {MAX_NUMBER_OF_GRID_ROWS} of {allMutations.length} mutations. You can narrow the filter to\n reduce the number of mutations.\n </div>\n )}\n <div\n ref={gridRef}\n style={{\n display: 'grid',\n gridTemplateRows: `repeat(${shownMutations.length}, 24px)`,\n gridTemplateColumns: `${MUTATION_CELL_WIDTH_REM}rem repeat(${dates.length}, minmax(0.05rem, 1fr))`,\n }}\n >\n {shownMutations.map((mutation, rowIndex) => {\n return (\n <Fragment key={`fragment-${mutation.toString()}`}>\n <div\n key={`mutation-${mutation.toString()}`}\n style={{ gridRowStart: rowIndex + 1, gridColumnStart: 1 }}\n >\n <MutationCell mutation={mutation} />\n </div>\n {dates.map((date, columnIndex) => {\n const value = data.get(mutation, date) ?? { proportion: 0, count: 0, totalCount: 0 };\n const tooltipPosition = getTooltipPosition(\n rowIndex,\n shownMutations.length,\n columnIndex,\n dates.length,\n );\n return (\n <div\n style={{ gridRowStart: rowIndex + 1, gridColumnStart: columnIndex + 2 }}\n key={`${mutation.toString()}-${date.toString()}`}\n >\n <ProportionCell\n value={value}\n date={date}\n mutation={mutation}\n tooltipPosition={tooltipPosition}\n showProportionText={showProportionText}\n colorScale={colorScale}\n />\n </div>\n );\n })}\n </Fragment>\n );\n })}\n </div>\n </>\n );\n};\n\nfunction useShowProportion(\n gridRef: RefObject<HTMLDivElement>,\n girdColumns: number,\n setShowProportionText: (value: ((prevState: boolean) => boolean) | boolean) => void,\n) {\n useEffect(() => {\n const checkWidth = () => {\n if (gridRef.current) {\n const width = gridRef.current.getBoundingClientRect().width;\n const widthPerDate = (width - remToPx(MUTATION_CELL_WIDTH_REM)) / girdColumns;\n const maxWidthProportionText = 28;\n\n setShowProportionText(widthPerDate > maxWidthProportionText);\n }\n };\n\n checkWidth();\n window.addEventListener('resize', checkWidth);\n\n return () => {\n window.removeEventListener('resize', checkWidth);\n };\n }, [girdColumns, gridRef, setShowProportionText]);\n}\n\nconst remToPx = (rem: number) => rem * parseFloat(getComputedStyle(document.documentElement).fontSize);\n\nfunction getTooltipPosition(rowIndex: number, rows: number, columnIndex: number, columns: number) {\n const tooltipX = rowIndex < rows / 2 ? 'bottom' : 'top';\n const tooltipY = columnIndex < columns / 2 ? 'start' : 'end';\n return `${tooltipX}-${tooltipY}` as const;\n}\n\nconst ProportionCell: FunctionComponent<{\n value: MutationOverTimeMutationValue;\n date: Temporal;\n mutation: Substitution | Deletion;\n tooltipPosition: TooltipPosition;\n showProportionText: boolean;\n colorScale: ColorScale;\n}> = ({ value, mutation, date, tooltipPosition, showProportionText, colorScale }) => {\n const tooltipContent = (\n <div>\n <p>\n <span className='font-bold'>{date.englishName()}</span>\n </p>\n <p>({timeIntervalDisplay(date)})</p>\n <p>{mutation.code}</p>\n <p>Proportion: {formatProportion(value.proportion)}</p>\n <p>\n Count: {value.count} / {value.totalCount} total\n </p>\n </div>\n );\n\n return (\n <div className={'py-1 w-full h-full'}>\n <Tooltip content={tooltipContent} position={tooltipPosition}>\n <div\n style={{\n backgroundColor: getColorWithingScale(value.proportion, colorScale),\n color: getTextColorForScale(value.proportion, colorScale),\n }}\n className={`w-full h-full text-center hover:font-bold text-xs group`}\n >\n {showProportionText ? formatProportion(value.proportion, 0) : undefined}\n </div>\n </Tooltip>\n </div>\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 MutationCell: FunctionComponent<{ mutation: Substitution | Deletion }> = ({ mutation }) => {\n return <div className='text-center'>{mutation.toString()}</div>;\n};\n\nexport default MutationsOverTimeGrid;\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 { Map2dBase, type 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 totalCount: number;\n};\n\nexport type MutationOverTimeMutationValue = { proportion: number; count: number; totalCount: 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 queryOverallMutationData(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n return fetchAndPrepareSubstitutionsOrDeletions(lapisFilter, sequenceType).evaluate(lapis, signal);\n}\n\nexport async function queryMutationsOverTimeData(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\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 const totalCountQuery = await getTotalNumberOfSequencesInDateRange(filter).evaluate(lapis, signal);\n return {\n date,\n mutations: data.content,\n totalCount: totalCountQuery.content[0].count,\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 Map2dBase<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 totalCount: mutationData.totalCount,\n });\n });\n });\n\n addZeroValuesForDatesWithNoMutationData(dataArray, data);\n\n return dataArray;\n}\n\nfunction addZeroValuesForDatesWithNoMutationData(\n dataArray: Map2dBase<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, totalCount: 0 });\n }\n });\n }\n}\n\nfunction getTotalNumberOfSequencesInDateRange(filter: LapisFilter) {\n return new FetchAggregatedOperator<{ count: number }>(filter);\n}\n","import { type FunctionComponent } from 'preact';\n\nimport { ColorScaleSelector, type ColorScaleSelectorProps } from './color-scale-selector';\nimport { Dropdown } from './dropdown';\n\nexport type ColorScaleSelectorDropdownProps = ColorScaleSelectorProps;\n\nexport const ColorScaleSelectorDropdown: FunctionComponent<ColorScaleSelectorDropdownProps> = ({\n colorScale,\n setColorScale,\n}) => {\n return (\n <div className='w-20'>\n <Dropdown buttonTitle={`Color scale`} placement={'bottom-start'}>\n <ColorScaleSelector colorScale={colorScale} setColorScale={setColorScale} />\n </Dropdown>\n </div>\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 { type Dataset } from '../../operator/Dataset';\nimport {\n type MutationOverTimeDataGroupedByMutation,\n queryMutationsOverTimeData,\n queryOverallMutationData,\n} from '../../query/queryMutationsOverTime';\nimport {\n type DeletionEntry,\n type LapisFilter,\n type SequenceType,\n type SubstitutionEntry,\n type TemporalGranularity,\n} from '../../types';\nimport { compareTemporal } from '../../utils/temporal';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { type ColorScale } from '../components/color-scale-selector';\nimport { ColorScaleSelectorDropdown } from '../components/color-scale-selector-dropdown';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { ErrorDisplay } from '../components/error-display';\nimport { Fullscreen } from '../components/fullscreen';\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 { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\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 const [mutationOverTimeData, overallMutationData] = await Promise.all([\n queryMutationsOverTimeData(lapisFilter, sequenceType, lapis, lapisDateField, granularity),\n queryOverallMutationData(lapisFilter, sequenceType, lapis),\n ]);\n return { mutationOverTimeData, overallMutationData };\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 (\n <MutationsOverTimeTabs\n overallMutationData={data.overallMutationData}\n mutationOverTimeData={data.mutationOverTimeData}\n sequenceType={sequenceType}\n views={views}\n />\n );\n};\n\ntype MutationOverTimeTabsProps = {\n mutationOverTimeData: MutationOverTimeDataGroupedByMutation;\n sequenceType: SequenceType;\n views: View[];\n overallMutationData: Dataset<SubstitutionEntry | DeletionEntry>;\n};\n\nconst MutationsOverTimeTabs: FunctionComponent<MutationOverTimeTabsProps> = ({\n mutationOverTimeData,\n sequenceType,\n views,\n overallMutationData,\n}) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 0.9 });\n const [colorScale, setColorScale] = useState<ColorScale>({ min: 0, max: 1, color: 'indigo' });\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 overallMutationData,\n displayedSegments,\n displayedMutationTypes,\n proportionInterval,\n ),\n [mutationOverTimeData, overallMutationData, 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} colorScale={colorScale} />,\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 proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n filteredData={filteredData}\n colorScale={colorScale}\n setColorScale={setColorScale}\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 proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n filteredData: MutationOverTimeDataGroupedByMutation;\n colorScale: ColorScale;\n setColorScale: Dispatch<StateUpdater<ColorScale>>;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n proportionInterval,\n setProportionInterval,\n filteredData,\n colorScale,\n setColorScale,\n}) => {\n return (\n <>\n {activeTab === 'Grid' && (\n <ColorScaleSelectorDropdown colorScale={colorScale} setColorScale={setColorScale} />\n )}\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\n />\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n labelPrefix='Mean proportion'\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getDownloadData(filteredData)}\n filename='mutations_over_time.csv'\n />\n <Info>Info for mutations over time</Info>\n <Fullscreen />\n </>\n );\n};\n\nfunction getDownloadData(filteredData: MutationOverTimeDataGroupedByMutation) {\n const dates = filteredData.getSecondAxisKeys().sort((a, b) => compareTemporal(a, b));\n\n return filteredData\n .getFirstAxisKeys()\n .sort(sortSubstitutionsAndDeletions)\n .map((mutation) => {\n return dates.reduce(\n (accumulated, date) => {\n const proportion = filteredData.get(mutation, date)?.proportion ?? 0;\n return {\n ...accumulated,\n [date.toString()]: proportion,\n };\n },\n { mutation: mutation.toString() },\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 limits the number of rows columns for browser performance reasons.\n * Too much data might make the browser unresponsive.\n *\n * The number of columns is limited to 200.\n * If this number are exceeded, an error message will be shown.\n * It is your responsibility to make sure that this does not happen.\n * Depending on the selected date range in the `lapisFilter`, you can adapt the granularity accordingly\n * (e.g. use months instead of days).\n *\n * The number of rows is limited to 100.\n * If there are more, the component will only show 100 mutations and notify the user.\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 WidthMatches = Expect<Equals<typeof MutationsOverTimeComponent.prototype.width, MutationsOverTimeProps['width']>>;\ntype HeightMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.height, MutationsOverTimeProps['height']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.granularity, MutationsOverTimeProps['granularity']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.lapisDateField, MutationsOverTimeProps['lapisDateField']>\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, type DateRangeSelectorProps } from '../../preact/dateRangeSelector/date-range-selector';\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<\n typeof DateRangeSelectorComponent.prototype.customSelectOptions,\n DateRangeSelectorProps<string>['customSelectOptions']\n >\n>;\ntype EarliestDateMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.earliestDate, DateRangeSelectorProps<string>['earliestDate']>\n>;\ntype InitialValueMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialValue, DateRangeSelectorProps<string>['initialValue']>\n>;\ntype InitialDateFromMatches = Expect<\n Equals<\n typeof DateRangeSelectorComponent.prototype.initialDateFrom,\n DateRangeSelectorProps<string>['initialDateFrom']\n >\n>;\ntype InitialDateToMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialDateTo, DateRangeSelectorProps<string>['initialDateTo']>\n>;\ntype WidthMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.width, DateRangeSelectorProps<string>['width']>\n>;\ntype DateColumnMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.dateColumn, DateRangeSelectorProps<string>['dateColumn']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\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 const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\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, type LocationFilterProps } from '../../preact/locationFilter/location-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\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\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof LocationFilterComponent.prototype.initialValue, LocationFilterProps['initialValue']>\n>;\ntype FieldsMatches = Expect<Equals<typeof LocationFilterComponent.prototype.fields, LocationFilterProps['fields']>>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof LocationFilterComponent.prototype.placeholderText, LocationFilterProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof LocationFilterComponent.prototype.width, LocationFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\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, type TextInputProps } from '../../preact/textInput/text-input';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\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\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof TextInputComponent.prototype.initialValue, TextInputProps['initialValue']>\n>;\ntype LapisFieldMatches = Expect<Equals<typeof TextInputComponent.prototype.lapisField, TextInputProps['lapisField']>>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof TextInputComponent.prototype.placeholderText, TextInputProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof TextInputComponent.prototype.width, TextInputProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\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>\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>&lt;gene&gt;:&lt;position&gt;&lt;base&gt;</b> or\n <b>&lt;gene&gt;:&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. A <b>&lt;base&gt;</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>&lt;base&gt;</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>&lt;base&gt;</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>&lt;position&gt;&lt;base&gt;</b> or <b>&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. The{' '}\n <b>&lt;base_ref&gt;</b> is the reference base at the position. It is optional. A <b>&lt;base&gt;</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>&lt;segment&gt;:&lt;position&gt;&lt;base&gt;</b> or{' '}\n <b>&lt;segment&gt;:&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. <b>&lt;base_ref&gt;</b> is the\n reference base at the position. It is optional. A <b>&lt;base&gt;</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';\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';\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 className='ml-1' type='button' onClick={() => onDelete(mutation)}>\n ✕\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>;\ntype WidthMatches = Expect<Equals<typeof MutationFilterComponent.prototype.width, MutationFilterProps['width']>>;\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, type LineageFilterProps } from '../../preact/lineageFilter/lineage-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\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\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.initialValue, LineageFilterProps['initialValue']>\n>;\ntype LapisFieldMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.lapisField, LineageFilterProps['lapisField']>\n>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.placeholderText, LineageFilterProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof LineageFilterComponent.prototype.width, LineageFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\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","useErrorBoundary","x","item","useContext","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","key","Fragment","options","value","selectedFilters","mutation","insertion"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[0,1,2,3,10,11,70,71,72,73,74,75]}