@genspectrum/dashboard-components 1.15.0 → 1.17.0

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 (60) hide show
  1. package/custom-elements.json +5 -5
  2. package/dist/components.d.ts +66 -67
  3. package/dist/components.js +457 -256
  4. package/dist/components.js.map +1 -1
  5. package/dist/util.d.ts +69 -66
  6. package/package.json +2 -9
  7. package/src/preact/MutationAnnotationsContext.tsx +1 -1
  8. package/src/preact/components/csv-download-button.tsx +22 -14
  9. package/src/preact/components/features-over-time-grid.tsx +189 -43
  10. package/src/preact/components/mutations-over-time-mutations-filter.stories.tsx +1 -1
  11. package/src/preact/components/mutations-over-time-mutations-filter.tsx +1 -1
  12. package/src/preact/mutationsOverTime/__mockData__/aminoAcidMutationsByDay/aminoAcidMutationsOverTimePage1.json +52 -0
  13. package/src/preact/mutationsOverTime/__mockData__/byWeek/mutationsOverTimePage1.json +76 -0
  14. package/src/preact/mutationsOverTime/__mockData__/defaultMockData/mockDefaultMutationsOverTimeWithFilter.json +43 -0
  15. package/src/preact/mutationsOverTime/__mockData__/defaultMockData/mutationsOverTimePage1.json +126 -0
  16. package/src/preact/mutationsOverTime/__mockData__/defaultMockData/mutationsOverTimePage2.json +116 -0
  17. package/src/preact/mutationsOverTime/__mockData__/defaultMockData/mutationsOverTimePageSize20.json +216 -0
  18. package/src/preact/mutationsOverTime/getFilteredMutationCodes.spec.ts +236 -0
  19. package/src/preact/mutationsOverTime/{getFilteredMutationsOverTimeData.ts → getFilteredMutationCodes.ts} +32 -45
  20. package/src/preact/mutationsOverTime/mutations-over-time.stories.tsx +128 -23
  21. package/src/preact/mutationsOverTime/mutations-over-time.tsx +139 -74
  22. package/src/preact/mutationsOverTime/useMutationsOverTimePageData.ts +111 -0
  23. package/src/preact/queriesOverTime/queries-over-time-row-label-tooltip.stories.tsx +8 -10
  24. package/src/preact/queriesOverTime/queries-over-time-row-label-tooltip.tsx +7 -17
  25. package/src/preact/queriesOverTime/queries-over-time.tsx +1 -1
  26. package/src/preact/shared/tanstackTable/pagination-context.tsx +5 -2
  27. package/src/preact/shared/tanstackTable/pagination.tsx +11 -9
  28. package/src/preact/shared/tanstackTable/tanstackTable.tsx +7 -4
  29. package/src/preact/wastewater/mutationsOverTime/wastewater-mutations-over-time.tsx +1 -1
  30. package/src/query/queryMutationsOverTime.spec.ts +187 -662
  31. package/src/query/queryMutationsOverTime.ts +46 -33
  32. package/src/utilEntrypoint.ts +1 -1
  33. package/src/utils/useControlledState.ts +15 -0
  34. package/src/web-components/gs-app.ts +2 -3
  35. package/src/web-components/input/gs-date-range-filter.tsx +2 -3
  36. package/src/web-components/input/gs-lineage-filter.tsx +2 -3
  37. package/src/web-components/input/gs-location-filter.tsx +2 -3
  38. package/src/web-components/input/gs-mutation-filter.tsx +3 -4
  39. package/src/web-components/input/gs-number-range-filter.tsx +2 -3
  40. package/src/web-components/input/gs-text-filter.tsx +2 -3
  41. package/src/web-components/mutation-annotations-context.ts +3 -1
  42. package/src/web-components/visualization/gs-aggregate.tsx +2 -3
  43. package/src/web-components/visualization/gs-genome-data-viewer.tsx +2 -3
  44. package/src/web-components/visualization/gs-mutation-comparison.tsx +2 -3
  45. package/src/web-components/visualization/gs-mutations-over-time.stories.ts +78 -22
  46. package/src/web-components/visualization/gs-mutations-over-time.tsx +2 -3
  47. package/src/web-components/visualization/gs-mutations.tsx +7 -8
  48. package/src/web-components/visualization/gs-number-sequences-over-time.tsx +2 -3
  49. package/src/web-components/visualization/gs-prevalence-over-time.tsx +2 -3
  50. package/src/web-components/visualization/gs-queries-over-time.tsx +2 -3
  51. package/src/web-components/visualization/gs-relative-growth-advantage.tsx +2 -3
  52. package/src/web-components/visualization/gs-sequences-by-location.tsx +2 -3
  53. package/src/web-components/visualization/gs-statistics.tsx +2 -3
  54. package/src/web-components/wastewaterVisualization/gs-wastewater-mutations-over-time.tsx +2 -3
  55. package/standalone-bundle/dashboard-components.js +6877 -6697
  56. package/standalone-bundle/dashboard-components.js.map +1 -1
  57. package/src/preact/mutationsOverTime/__mockData__/aminoAcidMutationsByDay/aminoAcidMutationsOverTime.json +0 -5496
  58. package/src/preact/mutationsOverTime/__mockData__/byWeek/mutationsOverTime.json +0 -7100
  59. package/src/preact/mutationsOverTime/__mockData__/defaultMockData/mutationsOverTime.json +0 -12646
  60. package/src/preact/mutationsOverTime/getFilteredMutationsOverTime.spec.ts +0 -417
@@ -1,5 +1,7 @@
1
+ import { createColumnHelper, getCoreRowModel, getPaginationRowModel } from '@tanstack/table-core';
2
+ import type { Table } from '@tanstack/table-core';
1
3
  import { type FunctionComponent, type JSX } from 'preact';
2
- import { useMemo } from 'preact/hooks';
4
+ import { type Dispatch, type StateUpdater, useMemo } from 'preact/hooks';
3
5
  import z from 'zod';
4
6
 
5
7
  import { type ColorScale, getColorWithinScale, getTextColorForScale } from './color-scale-selector';
@@ -11,13 +13,7 @@ import { type TemporalDataMap } from '../mutationsOverTime/MutationOverTimeData'
11
13
  import { formatProportion } from '../shared/table/formatProportion';
12
14
  import { type PageSizes, Pagination } from '../shared/tanstackTable/pagination';
13
15
  import { usePageSizeContext } from '../shared/tanstackTable/pagination-context';
14
- import {
15
- createColumnHelper,
16
- flexRender,
17
- getCoreRowModel,
18
- getPaginationRowModel,
19
- usePreactTable,
20
- } from '../shared/tanstackTable/tanstackTable';
16
+ import { flexRender, usePreactTable } from '../shared/tanstackTable/tanstackTable';
21
17
 
22
18
  const NON_BREAKING_SPACE = '\u00A0';
23
19
 
@@ -60,18 +56,118 @@ function FeaturesOverTimeGrid<F>({
60
56
  featureRenderer,
61
57
  tooltipPortalTarget,
62
58
  }: FeaturesOverTimeGridProps<F>) {
63
- const tableData = useMemo(() => {
64
- const firstAxisKeys = data.getFirstAxisKeys();
65
- return data.getAsArray().map((row, index): RowType<F> => {
66
- const firstAxisKey = firstAxisKeys[index];
67
- const customValues = customColumns.map((col) => col.values[featureRenderer.asString(firstAxisKey)]);
68
- return { feature: firstAxisKey, values: [...row], customValues };
69
- });
70
- }, [data, customColumns, featureRenderer]);
59
+ const tableData = useGridTableData(data, customColumns, featureRenderer);
60
+ const columns = useGridColumns(
61
+ data.getSecondAxisKeys(),
62
+ rowLabelHeader,
63
+ customColumns,
64
+ colorScale,
65
+ tooltipPortalTarget,
66
+ featureRenderer,
67
+ );
68
+ const { pageSize } = usePageSizeContext();
69
+
70
+ const table = usePreactTable({
71
+ data: tableData,
72
+ columns,
73
+ getCoreRowModel: getCoreRowModel(),
74
+ getPaginationRowModel: getPaginationRowModel(),
75
+ initialState: {
76
+ pagination: { pageIndex: 0, pageSize },
77
+ },
78
+ });
79
+
80
+ return <FeaturesOverTimeGridDisplay table={table} pageSizes={pageSizes} />;
81
+ }
82
+
83
+ export interface FeaturesOverTimeGridServerPaginatedProps<F> {
84
+ rowLabelHeader: string;
85
+ data: TemporalDataMap<F> | null;
86
+ isLoading: boolean;
87
+ /** Labels to show in the row label column while the page data is loading. */
88
+ loadingRowLabels: string[];
89
+ /** Date columns to show in the header while loading */
90
+ requestedDateRanges: Temporal[];
91
+ colorScale: ColorScale;
92
+ pageSizes: PageSizes;
93
+ /** Controlled page index (0-based). */
94
+ pageIndex: number;
95
+ /** Total number of rows across all pages. */
96
+ totalRows: number;
97
+ onPageChange: Dispatch<StateUpdater<number>>;
98
+ customColumns?: CustomColumn[];
99
+ featureRenderer: FeatureRenderer<F>;
100
+ tooltipPortalTarget: HTMLElement | null;
101
+ }
102
+
103
+ export function FeaturesOverTimeGridServerPaginated<F>({
104
+ rowLabelHeader,
105
+ data,
106
+ isLoading,
107
+ loadingRowLabels,
108
+ requestedDateRanges,
109
+ colorScale,
110
+ pageSizes,
111
+ pageIndex,
112
+ totalRows,
113
+ onPageChange,
114
+ customColumns = EMPTY_COLUMNS,
115
+ featureRenderer,
116
+ tooltipPortalTarget,
117
+ }: FeaturesOverTimeGridServerPaginatedProps<F>) {
118
+ const tableData = useGridTableData(data, customColumns, featureRenderer);
119
+ const columns = useGridColumns(
120
+ data?.getSecondAxisKeys() ?? requestedDateRanges,
121
+ rowLabelHeader,
122
+ customColumns,
123
+ colorScale,
124
+ tooltipPortalTarget,
125
+ featureRenderer,
126
+ );
127
+ const { pageSize, setPageSize } = usePageSizeContext();
128
+
129
+ const table = usePreactTable({
130
+ data: tableData,
131
+ columns,
132
+ getCoreRowModel: getCoreRowModel(),
133
+ // getPaginationRowModel not needed with manualPagination: true
134
+ manualPagination: true,
135
+ pageCount: Math.ceil(totalRows / pageSize),
136
+ state: {
137
+ pagination: { pageIndex, pageSize },
138
+ },
139
+ onPaginationChange: (updater) => {
140
+ const current = { pageIndex, pageSize };
141
+ const next = typeof updater === 'function' ? updater(current) : updater;
142
+ if (next.pageIndex !== current.pageIndex) {
143
+ onPageChange(next.pageIndex);
144
+ }
145
+ if (next.pageSize !== current.pageSize) {
146
+ setPageSize(next.pageSize);
147
+ }
148
+ },
149
+ });
71
150
 
72
- const columns = useMemo(() => {
151
+ return (
152
+ <FeaturesOverTimeGridDisplay
153
+ table={table}
154
+ pageSizes={pageSizes}
155
+ loadingState={{ isLoading, loadingRowLabels }}
156
+ totalRows={totalRows}
157
+ />
158
+ );
159
+ }
160
+
161
+ function useGridColumns<F>(
162
+ dates: Temporal[],
163
+ rowLabelHeader: string,
164
+ customColumns: CustomColumn[],
165
+ colorScale: ColorScale,
166
+ tooltipPortalTarget: HTMLElement | null,
167
+ featureRenderer: FeatureRenderer<F>,
168
+ ) {
169
+ return useMemo(() => {
73
170
  const columnHelper = createColumnHelper<RowType<F>>();
74
- const dates = data.getSecondAxisKeys();
75
171
 
76
172
  const featureHeader = columnHelper.accessor((row) => row.feature, {
77
173
  id: 'feature',
@@ -137,21 +233,48 @@ function FeaturesOverTimeGrid<F>({
137
233
  });
138
234
 
139
235
  return [featureHeader, ...customColumnHeaders, ...dateHeaders];
140
- }, [colorScale, data, customColumns, tooltipPortalTarget, featureRenderer, rowLabelHeader]);
236
+ }, [colorScale, dates, customColumns, tooltipPortalTarget, featureRenderer, rowLabelHeader]);
237
+ }
141
238
 
142
- const { pageSize } = usePageSizeContext();
143
- const table = usePreactTable({
144
- data: tableData,
145
- columns,
146
- getCoreRowModel: getCoreRowModel(),
147
- getPaginationRowModel: getPaginationRowModel(),
148
- initialState: {
149
- pagination: {
150
- pageIndex: 0,
151
- pageSize,
152
- },
153
- },
154
- });
239
+ function useGridTableData<F>(
240
+ data: TemporalDataMap<F> | null | undefined,
241
+ customColumns: CustomColumn[],
242
+ featureRenderer: FeatureRenderer<F>,
243
+ ) {
244
+ return useMemo(() => {
245
+ if (!data) {
246
+ return [];
247
+ }
248
+ const firstAxisKeys = data.getFirstAxisKeys();
249
+ return data.getAsArray().map((row, index): RowType<F> => {
250
+ const firstAxisKey = firstAxisKeys[index];
251
+ const customValues = customColumns.map((col) => col.values[featureRenderer.asString(firstAxisKey)]);
252
+ return { feature: firstAxisKey, values: [...row], customValues };
253
+ });
254
+ }, [data, customColumns, featureRenderer]);
255
+ }
256
+
257
+ type FeaturesOverTimeGridDisplayProps<F> = {
258
+ table: Table<RowType<F>>;
259
+ pageSizes: PageSizes;
260
+ /** Override for the pagination row count (server-driven pagination). */
261
+ totalRows?: number;
262
+ loadingState?:
263
+ | {
264
+ isLoading: boolean;
265
+ /** Labels to render in the row label column while loading. One skeleton row is shown per label. */
266
+ loadingRowLabels: string[];
267
+ }
268
+ | { isLoading: false; loadingRowLabels?: never };
269
+ };
270
+
271
+ function FeaturesOverTimeGridDisplay<F>({
272
+ table,
273
+ pageSizes,
274
+ loadingState,
275
+ totalRows,
276
+ }: FeaturesOverTimeGridDisplayProps<F>) {
277
+ const displayedTotalRows = totalRows ?? table.getCoreRowModel().rows.length;
155
278
 
156
279
  return (
157
280
  <div className='w-full'>
@@ -170,22 +293,45 @@ function FeaturesOverTimeGrid<F>({
170
293
  ))}
171
294
  </thead>
172
295
  <tbody>
173
- {table.getRowModel().rows.map((row) => (
174
- <tr key={row.id}>
175
- {row.getVisibleCells().map((cell) => (
176
- <td key={cell.id}>{flexRender(cell.column.columnDef.cell, cell.getContext())}</td>
296
+ {loadingState?.isLoading ? (
297
+ loadingState.loadingRowLabels.map((label, rowIndex) => (
298
+ <tr key={label}>
299
+ <td className='text-center'>{label}</td>
300
+ {rowIndex === 0 && (
301
+ <td
302
+ rowSpan={loadingState.loadingRowLabels.length}
303
+ colSpan={table.getFlatHeaders().length - 1}
304
+ className='text-center'
305
+ >
306
+ <span className='loading loading-spinner loading-sm' />
307
+ </td>
308
+ )}
309
+ </tr>
310
+ ))
311
+ ) : (
312
+ <>
313
+ {table.getRowModel().rows.map((row) => (
314
+ <tr key={row.id}>
315
+ {row.getVisibleCells().map((cell) => (
316
+ <td key={cell.id}>
317
+ {flexRender(cell.column.columnDef.cell, cell.getContext())}
318
+ </td>
319
+ ))}
320
+ </tr>
177
321
  ))}
178
- </tr>
179
- ))}
180
- {table.getRowModel().rows.length === 0 && (
181
- <td colSpan={table.getFlatHeaders().length}>
182
- <div className={'text-center'}>No data available for your filters.</div>
183
- </td>
322
+ {table.getRowModel().rows.length === 0 && (
323
+ <tr>
324
+ <td colSpan={table.getFlatHeaders().length}>
325
+ <div className={'text-center'}>No data available for your filters.</div>
326
+ </td>
327
+ </tr>
328
+ )}
329
+ </>
184
330
  )}
185
331
  </tbody>
186
332
  </table>
187
333
  <div className={'mt-2'}>
188
- <Pagination table={table} pageSizes={pageSizes} />
334
+ <Pagination table={table} pageSizes={pageSizes} totalRows={displayedTotalRows} />
189
335
  </div>
190
336
  </div>
191
337
  );
@@ -9,7 +9,7 @@ import {
9
9
  } from './mutations-over-time-mutations-filter';
10
10
  import { type MutationAnnotations } from '../../web-components/mutation-annotations-context';
11
11
  import { MutationAnnotationsContextProvider } from '../MutationAnnotationsContext';
12
- import { type MutationFilter } from '../mutationsOverTime/getFilteredMutationsOverTimeData';
12
+ import { type MutationFilter } from '../mutationsOverTime/getFilteredMutationCodes';
13
13
 
14
14
  const meta: Meta = {
15
15
  title: 'Component/Mutations over time mutations filter',
@@ -3,7 +3,7 @@ import { type Dispatch, type StateUpdater, useCallback, useEffect, useState } fr
3
3
 
4
4
  import { Dropdown } from './dropdown';
5
5
  import { useRawMutationAnnotations } from '../MutationAnnotationsContext';
6
- import { type MutationFilter } from '../mutationsOverTime/getFilteredMutationsOverTimeData';
6
+ import { type MutationFilter } from '../mutationsOverTime/getFilteredMutationCodes';
7
7
  import { DeleteIcon } from '../shared/icons/DeleteIcon';
8
8
 
9
9
  export type MutationsOverTimeMutationsFilterProps = {
@@ -0,0 +1,52 @@
1
+ {
2
+ "data": {
3
+ "mutations": ["ORF1a:T170I", "ORF1a:F499L", "S:T572I"],
4
+ "dateRanges": [
5
+ { "dateFrom": "2024-01-20", "dateTo": "2024-01-20" },
6
+ { "dateFrom": "2024-01-21", "dateTo": "2024-01-21" },
7
+ { "dateFrom": "2024-01-22", "dateTo": "2024-01-22" },
8
+ { "dateFrom": "2024-01-23", "dateTo": "2024-01-23" },
9
+ { "dateFrom": "2024-01-24", "dateTo": "2024-01-24" },
10
+ { "dateFrom": "2024-01-25", "dateTo": "2024-01-25" },
11
+ { "dateFrom": "2024-01-26", "dateTo": "2024-01-26" }
12
+ ],
13
+ "data": [
14
+ [
15
+ { "count": 121, "coverage": 455 },
16
+ { "count": 155, "coverage": 535 },
17
+ { "count": 314, "coverage": 1100 },
18
+ { "count": 245, "coverage": 1032 },
19
+ { "count": 225, "coverage": 968 },
20
+ { "count": 197, "coverage": 839 },
21
+ { "count": 171, "coverage": 635 }
22
+ ],
23
+ [
24
+ { "count": 20, "coverage": 459 },
25
+ { "count": 33, "coverage": 536 },
26
+ { "count": 79, "coverage": 1149 },
27
+ { "count": 71, "coverage": 1061 },
28
+ { "count": 66, "coverage": 995 },
29
+ { "count": 49, "coverage": 857 },
30
+ { "count": 42, "coverage": 668 }
31
+ ],
32
+ [
33
+ { "count": 26, "coverage": 456 },
34
+ { "count": 37, "coverage": 541 },
35
+ { "count": 83, "coverage": 1141 },
36
+ { "count": 81, "coverage": 1051 },
37
+ { "count": 70, "coverage": 986 },
38
+ { "count": 64, "coverage": 848 },
39
+ { "count": 48, "coverage": 664 }
40
+ ]
41
+ ],
42
+ "totalCountsByDateRange": [466, 548, 1155, 1067, 1007, 865, 671]
43
+ },
44
+ "info": {
45
+ "dataVersion": "1774200829",
46
+ "requestId": "74b55554-9ee9-4776-ba5f-48b93782ed51",
47
+ "requestInfo": "sars_cov-2_nextstrain_open on lapis.cov-spectrum.org at 2026-03-24T08:59:15.215671655",
48
+ "reportTo": "Please report to https://github.com/GenSpectrum/LAPIS/issues in case you encounter any unexpected issues. Please include the request ID and the requestInfo in your report.",
49
+ "lapisVersion": "0.7.0",
50
+ "siloVersion": "0.10.0"
51
+ }
52
+ }
@@ -0,0 +1,76 @@
1
+ {
2
+ "data": {
3
+ "mutations": ["C44T", "C774T", "C1762A", "C11747T", "G17562T", "T18453C", "G21641T", "C23277T", "C29870A"],
4
+ "dateRanges": [
5
+ { "dateFrom": "2024-01-15", "dateTo": "2024-01-21" },
6
+ { "dateFrom": "2024-01-22", "dateTo": "2024-01-28" },
7
+ { "dateFrom": "2024-01-29", "dateTo": "2024-02-04" },
8
+ { "dateFrom": "2024-02-05", "dateTo": "2024-02-11" }
9
+ ],
10
+ "data": [
11
+ [
12
+ { "count": 548, "coverage": 923 },
13
+ { "count": 605, "coverage": 1040 },
14
+ { "count": 571, "coverage": 916 },
15
+ { "count": 481, "coverage": 858 }
16
+ ],
17
+ [
18
+ { "count": 1404, "coverage": 5260 },
19
+ { "count": 1358, "coverage": 5415 },
20
+ { "count": 1473, "coverage": 5404 },
21
+ { "count": 1370, "coverage": 5120 }
22
+ ],
23
+ [
24
+ { "count": 348, "coverage": 5345 },
25
+ { "count": 360, "coverage": 5592 },
26
+ { "count": 273, "coverage": 5470 },
27
+ { "count": 214, "coverage": 5158 }
28
+ ],
29
+ [
30
+ { "count": 322, "coverage": 5006 },
31
+ { "count": 323, "coverage": 5215 },
32
+ { "count": 259, "coverage": 5214 },
33
+ { "count": 191, "coverage": 4831 }
34
+ ],
35
+ [
36
+ { "count": 381, "coverage": 5383 },
37
+ { "count": 402, "coverage": 5618 },
38
+ { "count": 353, "coverage": 5500 },
39
+ { "count": 303, "coverage": 5194 }
40
+ ],
41
+ [
42
+ { "count": 1175, "coverage": 5348 },
43
+ { "count": 1104, "coverage": 5557 },
44
+ { "count": 1156, "coverage": 5474 },
45
+ { "count": 1100, "coverage": 5176 }
46
+ ],
47
+ [
48
+ { "count": 300, "coverage": 4800 },
49
+ { "count": 512, "coverage": 4860 },
50
+ { "count": 311, "coverage": 4833 },
51
+ { "count": 124, "coverage": 4390 }
52
+ ],
53
+ [
54
+ { "count": 337, "coverage": 5391 },
55
+ { "count": 431, "coverage": 5615 },
56
+ { "count": 565, "coverage": 5497 },
57
+ { "count": 662, "coverage": 5193 }
58
+ ],
59
+ [
60
+ { "count": 17, "coverage": 251 },
61
+ { "count": 7, "coverage": 260 },
62
+ { "count": 17, "coverage": 237 },
63
+ { "count": 13, "coverage": 185 }
64
+ ]
65
+ ],
66
+ "totalCountsByDateRange": [5395, 5624, 5506, 5200]
67
+ },
68
+ "info": {
69
+ "dataVersion": "1774200829",
70
+ "requestId": "84c09426-1724-49bb-8e8e-fcc0d98d2c89",
71
+ "requestInfo": "sars_cov-2_nextstrain_open on lapis.cov-spectrum.org at 2026-03-24T08:56:49.830150373",
72
+ "reportTo": "Please report to https://github.com/GenSpectrum/LAPIS/issues in case you encounter any unexpected issues. Please include the request ID and the requestInfo in your report.",
73
+ "lapisVersion": "0.7.0",
74
+ "siloVersion": "0.10.0"
75
+ }
76
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "data": {
3
+ "mutations": ["T21653-", "T21655-"],
4
+ "dateRanges": [
5
+ { "dateFrom": "2024-01-01", "dateTo": "2024-01-31" },
6
+ { "dateFrom": "2024-02-01", "dateTo": "2024-02-29" },
7
+ { "dateFrom": "2024-03-01", "dateTo": "2024-03-31" },
8
+ { "dateFrom": "2024-04-01", "dateTo": "2024-04-30" },
9
+ { "dateFrom": "2024-05-01", "dateTo": "2024-05-31" },
10
+ { "dateFrom": "2024-06-01", "dateTo": "2024-06-30" },
11
+ { "dateFrom": "2024-07-01", "dateTo": "2024-07-31" }
12
+ ],
13
+ "data": [
14
+ [
15
+ { "count": 13, "coverage": 13948 },
16
+ { "count": 15, "coverage": 17359 },
17
+ { "count": 41, "coverage": 8319 },
18
+ { "count": 237, "coverage": 6564 },
19
+ { "count": 1370, "coverage": 9054 },
20
+ { "count": 5079, "coverage": 16077 },
21
+ { "count": 3245, "coverage": 7342 }
22
+ ],
23
+ [
24
+ { "count": 12, "coverage": 13941 },
25
+ { "count": 14, "coverage": 17360 },
26
+ { "count": 41, "coverage": 8327 },
27
+ { "count": 235, "coverage": 6596 },
28
+ { "count": 1376, "coverage": 9143 },
29
+ { "count": 5089, "coverage": 16368 },
30
+ { "count": 3256, "coverage": 7477 }
31
+ ]
32
+ ],
33
+ "totalCountsByDateRange": [14065, 17583, 8432, 6680, 9252, 16512, 7508]
34
+ },
35
+ "info": {
36
+ "dataVersion": "1774200829",
37
+ "requestId": "dcc96846-d1d8-4ae2-afbe-60fcda8e64f0",
38
+ "requestInfo": "sars_cov-2_nextstrain_open on lapis.cov-spectrum.org at 2026-03-24T09:25:28.706437897",
39
+ "reportTo": "Please report to https://github.com/GenSpectrum/LAPIS/issues in case you encounter any unexpected issues. Please include the request ID and the requestInfo in your report.",
40
+ "lapisVersion": "0.7.0",
41
+ "siloVersion": "0.10.0"
42
+ }
43
+ }
@@ -0,0 +1,126 @@
1
+ {
2
+ "data": {
3
+ "mutations": [
4
+ "C44T",
5
+ "C774T",
6
+ "C7113T",
7
+ "C12616T",
8
+ "A13121T",
9
+ "G15372T",
10
+ "G17334T",
11
+ "T18453C",
12
+ "A19722G",
13
+ "T21653-"
14
+ ],
15
+ "dateRanges": [
16
+ { "dateFrom": "2024-01-01", "dateTo": "2024-01-31" },
17
+ { "dateFrom": "2024-02-01", "dateTo": "2024-02-29" },
18
+ { "dateFrom": "2024-03-01", "dateTo": "2024-03-31" },
19
+ { "dateFrom": "2024-04-01", "dateTo": "2024-04-30" },
20
+ { "dateFrom": "2024-05-01", "dateTo": "2024-05-31" },
21
+ { "dateFrom": "2024-06-01", "dateTo": "2024-06-30" },
22
+ { "dateFrom": "2024-07-01", "dateTo": "2024-07-31" }
23
+ ],
24
+ "data": [
25
+ [
26
+ { "count": 1447, "coverage": 2444 },
27
+ { "count": 1917, "coverage": 3372 },
28
+ { "count": 1028, "coverage": 1810 },
29
+ { "count": 1005, "coverage": 1373 },
30
+ { "count": 1863, "coverage": 2315 },
31
+ { "count": 4282, "coverage": 4958 },
32
+ { "count": 1775, "coverage": 2237 }
33
+ ],
34
+ [
35
+ { "count": 3596, "coverage": 13661 },
36
+ { "count": 4644, "coverage": 17266 },
37
+ { "count": 1957, "coverage": 8250 },
38
+ { "count": 860, "coverage": 6549 },
39
+ { "count": 379, "coverage": 9171 },
40
+ { "count": 178, "coverage": 16412 },
41
+ { "count": 41, "coverage": 7462 }
42
+ ],
43
+ [
44
+ { "count": 41, "coverage": 13981 },
45
+ { "count": 202, "coverage": 17441 },
46
+ { "count": 568, "coverage": 8356 },
47
+ { "count": 1740, "coverage": 6589 },
48
+ { "count": 4746, "coverage": 9111 },
49
+ { "count": 11247, "coverage": 16298 },
50
+ { "count": 5484, "coverage": 7443 }
51
+ ],
52
+ [
53
+ { "count": 25, "coverage": 13988 },
54
+ { "count": 26, "coverage": 17508 },
55
+ { "count": 3, "coverage": 8376 },
56
+ { "count": 3, "coverage": 6645 },
57
+ { "count": 58, "coverage": 9199 },
58
+ { "count": 950, "coverage": 16346 },
59
+ { "count": 1144, "coverage": 7459 }
60
+ ],
61
+ [
62
+ { "count": 1, "coverage": 14032 },
63
+ { "count": 1, "coverage": 17551 },
64
+ { "count": 1, "coverage": 8418 },
65
+ { "count": 0, "coverage": 6672 },
66
+ { "count": 44, "coverage": 9238 },
67
+ { "count": 922, "coverage": 16465 },
68
+ { "count": 1119, "coverage": 7468 }
69
+ ],
70
+ [
71
+ { "count": 8, "coverage": 13900 },
72
+ { "count": 11, "coverage": 17458 },
73
+ { "count": 44, "coverage": 8358 },
74
+ { "count": 200, "coverage": 6577 },
75
+ { "count": 769, "coverage": 9065 },
76
+ { "count": 3065, "coverage": 16446 },
77
+ { "count": 1930, "coverage": 7464 }
78
+ ],
79
+ [
80
+ { "count": 65, "coverage": 14003 },
81
+ { "count": 200, "coverage": 17511 },
82
+ { "count": 565, "coverage": 8397 },
83
+ { "count": 1702, "coverage": 6603 },
84
+ { "count": 4598, "coverage": 9035 },
85
+ { "count": 11288, "coverage": 16416 },
86
+ { "count": 5451, "coverage": 7457 }
87
+ ],
88
+ [
89
+ { "count": 2949, "coverage": 13937 },
90
+ { "count": 3625, "coverage": 17486 },
91
+ { "count": 1511, "coverage": 8380 },
92
+ { "count": 585, "coverage": 6635 },
93
+ { "count": 239, "coverage": 9210 },
94
+ { "count": 76, "coverage": 16400 },
95
+ { "count": 19, "coverage": 7481 }
96
+ ],
97
+ [
98
+ { "count": 1, "coverage": 14014 },
99
+ { "count": 7, "coverage": 17517 },
100
+ { "count": 36, "coverage": 8404 },
101
+ { "count": 196, "coverage": 6641 },
102
+ { "count": 789, "coverage": 9202 },
103
+ { "count": 3041, "coverage": 16418 },
104
+ { "count": 1925, "coverage": 7470 }
105
+ ],
106
+ [
107
+ { "count": 13, "coverage": 13948 },
108
+ { "count": 15, "coverage": 17359 },
109
+ { "count": 41, "coverage": 8319 },
110
+ { "count": 237, "coverage": 6564 },
111
+ { "count": 1370, "coverage": 9054 },
112
+ { "count": 5079, "coverage": 16077 },
113
+ { "count": 3245, "coverage": 7342 }
114
+ ]
115
+ ],
116
+ "totalCountsByDateRange": [14065, 17583, 8432, 6680, 9252, 16512, 7508]
117
+ },
118
+ "info": {
119
+ "dataVersion": "1774200829",
120
+ "requestId": "8eb0eb23-a6f9-4f2b-8ffd-706a15ef77be",
121
+ "requestInfo": "sars_cov-2_nextstrain_open on lapis.cov-spectrum.org at 2026-03-24T08:50:10.039520257",
122
+ "reportTo": "Please report to https://github.com/GenSpectrum/LAPIS/issues in case you encounter any unexpected issues. Please include the request ID and the requestInfo in your report.",
123
+ "lapisVersion": "0.7.0",
124
+ "siloVersion": "0.10.0"
125
+ }
126
+ }