@genspectrum/dashboard-components 1.18.0 → 1.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/util.d.ts CHANGED
@@ -1268,7 +1268,7 @@ declare global {
1268
1268
 
1269
1269
  declare global {
1270
1270
  interface HTMLElementTagNameMap {
1271
- 'gs-genome-data-viewer': GenomeDataViewerComponent;
1271
+ 'gs-wastewater-mutations-over-time': WastewaterMutationsOverTimeComponent;
1272
1272
  }
1273
1273
  }
1274
1274
 
@@ -1276,7 +1276,7 @@ declare global {
1276
1276
  declare global {
1277
1277
  namespace React.JSX {
1278
1278
  interface IntrinsicElements {
1279
- 'gs-genome-data-viewer': GenomeDataViewerComponent;
1279
+ 'gs-wastewater-mutations-over-time': WastewaterMutationsOverTimeComponent;
1280
1280
  }
1281
1281
  }
1282
1282
  }
@@ -1284,7 +1284,11 @@ declare global {
1284
1284
 
1285
1285
  declare global {
1286
1286
  interface HTMLElementTagNameMap {
1287
- 'gs-mutation-comparison': MutationComparisonComponent;
1287
+ 'gs-date-range-filter': DateRangeFilterComponent;
1288
+ }
1289
+ interface HTMLElementEventMap {
1290
+ [gsEventNames.dateRangeFilterChanged]: CustomEvent<Record<string, string>>;
1291
+ [gsEventNames.dateRangeOptionChanged]: DateRangeOptionChangedEvent;
1288
1292
  }
1289
1293
  }
1290
1294
 
@@ -1292,7 +1296,7 @@ declare global {
1292
1296
  declare global {
1293
1297
  namespace React.JSX {
1294
1298
  interface IntrinsicElements {
1295
- 'gs-mutation-comparison': MutationComparisonComponent;
1299
+ 'gs-date-range-filter': DateRangeFilterComponent;
1296
1300
  }
1297
1301
  }
1298
1302
  }
@@ -1300,7 +1304,10 @@ declare global {
1300
1304
 
1301
1305
  declare global {
1302
1306
  interface HTMLElementTagNameMap {
1303
- 'gs-mutations': MutationsComponent;
1307
+ 'gs-text-filter': TextFilterComponent;
1308
+ }
1309
+ interface HTMLElementEventMap {
1310
+ [gsEventNames.textFilterChanged]: TextFilterChangedEvent;
1304
1311
  }
1305
1312
  }
1306
1313
 
@@ -1308,7 +1315,7 @@ declare global {
1308
1315
  declare global {
1309
1316
  namespace React.JSX {
1310
1317
  interface IntrinsicElements {
1311
- 'gs-mutations': MutationsComponent;
1318
+ 'gs-text-filter': TextFilterComponent;
1312
1319
  }
1313
1320
  }
1314
1321
  }
@@ -1316,7 +1323,10 @@ declare global {
1316
1323
 
1317
1324
  declare global {
1318
1325
  interface HTMLElementTagNameMap {
1319
- 'gs-prevalence-over-time': PrevalenceOverTimeComponent;
1326
+ 'gs-location-filter': LocationFilterComponent;
1327
+ }
1328
+ interface HTMLElementEventMap {
1329
+ [gsEventNames.locationChanged]: LocationChangedEvent;
1320
1330
  }
1321
1331
  }
1322
1332
 
@@ -1324,7 +1334,7 @@ declare global {
1324
1334
  declare global {
1325
1335
  namespace React.JSX {
1326
1336
  interface IntrinsicElements {
1327
- 'gs-prevalence-over-time': PrevalenceOverTimeComponent;
1337
+ 'gs-location-filter': LocationFilterComponent;
1328
1338
  }
1329
1339
  }
1330
1340
  }
@@ -1332,7 +1342,10 @@ declare global {
1332
1342
 
1333
1343
  declare global {
1334
1344
  interface HTMLElementTagNameMap {
1335
- 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;
1345
+ 'gs-mutation-filter': MutationFilterComponent;
1346
+ }
1347
+ interface HTMLElementEventMap {
1348
+ [gsEventNames.mutationFilterChanged]: CustomEvent<MutationsFilter>;
1336
1349
  }
1337
1350
  }
1338
1351
 
@@ -1340,7 +1353,7 @@ declare global {
1340
1353
  declare global {
1341
1354
  namespace React.JSX {
1342
1355
  interface IntrinsicElements {
1343
- 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;
1356
+ 'gs-mutation-filter': MutationFilterComponent;
1344
1357
  }
1345
1358
  }
1346
1359
  }
@@ -1348,7 +1361,11 @@ declare global {
1348
1361
 
1349
1362
  declare global {
1350
1363
  interface HTMLElementTagNameMap {
1351
- 'gs-aggregate': AggregateComponent;
1364
+ 'gs-lineage-filter': LineageFilterComponent;
1365
+ }
1366
+ interface HTMLElementEventMap {
1367
+ [gsEventNames.lineageFilterChanged]: LineageFilterChangedEvent;
1368
+ [gsEventNames.lineageFilterMultiChanged]: LineageMultiFilterChangedEvent;
1352
1369
  }
1353
1370
  }
1354
1371
 
@@ -1356,7 +1373,7 @@ declare global {
1356
1373
  declare global {
1357
1374
  namespace React.JSX {
1358
1375
  interface IntrinsicElements {
1359
- 'gs-aggregate': AggregateComponent;
1376
+ 'gs-lineage-filter': LineageFilterComponent;
1360
1377
  }
1361
1378
  }
1362
1379
  }
@@ -1364,7 +1381,11 @@ declare global {
1364
1381
 
1365
1382
  declare global {
1366
1383
  interface HTMLElementTagNameMap {
1367
- 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;
1384
+ 'gs-number-range-filter': NumberRangeFilterComponent;
1385
+ }
1386
+ interface HTMLElementEventMap {
1387
+ [gsEventNames.numberRangeFilterChanged]: NumberRangeFilterChangedEvent;
1388
+ [gsEventNames.numberRangeValueChanged]: NumberRangeValueChangedEvent;
1368
1389
  }
1369
1390
  }
1370
1391
 
@@ -1372,7 +1393,7 @@ declare global {
1372
1393
  declare global {
1373
1394
  namespace React.JSX {
1374
1395
  interface IntrinsicElements {
1375
- 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;
1396
+ 'gs-number-range-filter': NumberRangeFilterComponent;
1376
1397
  }
1377
1398
  }
1378
1399
  }
@@ -1380,7 +1401,7 @@ declare global {
1380
1401
 
1381
1402
  declare global {
1382
1403
  interface HTMLElementTagNameMap {
1383
- 'gs-mutations-over-time': MutationsOverTimeComponent;
1404
+ 'gs-genome-data-viewer': GenomeDataViewerComponent;
1384
1405
  }
1385
1406
  }
1386
1407
 
@@ -1388,7 +1409,7 @@ declare global {
1388
1409
  declare global {
1389
1410
  namespace React.JSX {
1390
1411
  interface IntrinsicElements {
1391
- 'gs-mutations-over-time': MutationsOverTimeComponent;
1412
+ 'gs-genome-data-viewer': GenomeDataViewerComponent;
1392
1413
  }
1393
1414
  }
1394
1415
  }
@@ -1396,7 +1417,7 @@ declare global {
1396
1417
 
1397
1418
  declare global {
1398
1419
  interface HTMLElementTagNameMap {
1399
- 'gs-queries-over-time': QueriesOverTimeComponent;
1420
+ 'gs-mutations': MutationsComponent;
1400
1421
  }
1401
1422
  }
1402
1423
 
@@ -1404,7 +1425,7 @@ declare global {
1404
1425
  declare global {
1405
1426
  namespace React.JSX {
1406
1427
  interface IntrinsicElements {
1407
- 'gs-queries-over-time': QueriesOverTimeComponent;
1428
+ 'gs-mutations': MutationsComponent;
1408
1429
  }
1409
1430
  }
1410
1431
  }
@@ -1412,7 +1433,7 @@ declare global {
1412
1433
 
1413
1434
  declare global {
1414
1435
  interface HTMLElementTagNameMap {
1415
- 'gs-sequences-by-location': SequencesByLocationComponent;
1436
+ 'gs-mutation-comparison': MutationComparisonComponent;
1416
1437
  }
1417
1438
  }
1418
1439
 
@@ -1420,7 +1441,7 @@ declare global {
1420
1441
  declare global {
1421
1442
  namespace React.JSX {
1422
1443
  interface IntrinsicElements {
1423
- 'gs-sequences-by-location': SequencesByLocationComponent;
1444
+ 'gs-mutation-comparison': MutationComparisonComponent;
1424
1445
  }
1425
1446
  }
1426
1447
  }
@@ -1428,7 +1449,7 @@ declare global {
1428
1449
 
1429
1450
  declare global {
1430
1451
  interface HTMLElementTagNameMap {
1431
- 'gs-statistics': StatisticsComponent;
1452
+ 'gs-prevalence-over-time': PrevalenceOverTimeComponent;
1432
1453
  }
1433
1454
  }
1434
1455
 
@@ -1436,7 +1457,7 @@ declare global {
1436
1457
  declare global {
1437
1458
  namespace React.JSX {
1438
1459
  interface IntrinsicElements {
1439
- 'gs-statistics': StatisticsComponent;
1460
+ 'gs-prevalence-over-time': PrevalenceOverTimeComponent;
1440
1461
  }
1441
1462
  }
1442
1463
  }
@@ -1444,10 +1465,7 @@ declare global {
1444
1465
 
1445
1466
  declare global {
1446
1467
  interface HTMLElementTagNameMap {
1447
- 'gs-location-filter': LocationFilterComponent;
1448
- }
1449
- interface HTMLElementEventMap {
1450
- [gsEventNames.locationChanged]: LocationChangedEvent;
1468
+ 'gs-aggregate': AggregateComponent;
1451
1469
  }
1452
1470
  }
1453
1471
 
@@ -1455,7 +1473,7 @@ declare global {
1455
1473
  declare global {
1456
1474
  namespace React.JSX {
1457
1475
  interface IntrinsicElements {
1458
- 'gs-location-filter': LocationFilterComponent;
1476
+ 'gs-aggregate': AggregateComponent;
1459
1477
  }
1460
1478
  }
1461
1479
  }
@@ -1463,10 +1481,7 @@ declare global {
1463
1481
 
1464
1482
  declare global {
1465
1483
  interface HTMLElementTagNameMap {
1466
- 'gs-text-filter': TextFilterComponent;
1467
- }
1468
- interface HTMLElementEventMap {
1469
- [gsEventNames.textFilterChanged]: TextFilterChangedEvent;
1484
+ 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;
1470
1485
  }
1471
1486
  }
1472
1487
 
@@ -1474,7 +1489,7 @@ declare global {
1474
1489
  declare global {
1475
1490
  namespace React.JSX {
1476
1491
  interface IntrinsicElements {
1477
- 'gs-text-filter': TextFilterComponent;
1492
+ 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;
1478
1493
  }
1479
1494
  }
1480
1495
  }
@@ -1482,11 +1497,7 @@ declare global {
1482
1497
 
1483
1498
  declare global {
1484
1499
  interface HTMLElementTagNameMap {
1485
- 'gs-date-range-filter': DateRangeFilterComponent;
1486
- }
1487
- interface HTMLElementEventMap {
1488
- [gsEventNames.dateRangeFilterChanged]: CustomEvent<Record<string, string>>;
1489
- [gsEventNames.dateRangeOptionChanged]: DateRangeOptionChangedEvent;
1500
+ 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;
1490
1501
  }
1491
1502
  }
1492
1503
 
@@ -1494,7 +1505,7 @@ declare global {
1494
1505
  declare global {
1495
1506
  namespace React.JSX {
1496
1507
  interface IntrinsicElements {
1497
- 'gs-date-range-filter': DateRangeFilterComponent;
1508
+ 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;
1498
1509
  }
1499
1510
  }
1500
1511
  }
@@ -1502,10 +1513,7 @@ declare global {
1502
1513
 
1503
1514
  declare global {
1504
1515
  interface HTMLElementTagNameMap {
1505
- 'gs-mutation-filter': MutationFilterComponent;
1506
- }
1507
- interface HTMLElementEventMap {
1508
- [gsEventNames.mutationFilterChanged]: CustomEvent<MutationsFilter>;
1516
+ 'gs-mutations-over-time': MutationsOverTimeComponent;
1509
1517
  }
1510
1518
  }
1511
1519
 
@@ -1513,7 +1521,7 @@ declare global {
1513
1521
  declare global {
1514
1522
  namespace React.JSX {
1515
1523
  interface IntrinsicElements {
1516
- 'gs-mutation-filter': MutationFilterComponent;
1524
+ 'gs-mutations-over-time': MutationsOverTimeComponent;
1517
1525
  }
1518
1526
  }
1519
1527
  }
@@ -1521,11 +1529,7 @@ declare global {
1521
1529
 
1522
1530
  declare global {
1523
1531
  interface HTMLElementTagNameMap {
1524
- 'gs-number-range-filter': NumberRangeFilterComponent;
1525
- }
1526
- interface HTMLElementEventMap {
1527
- [gsEventNames.numberRangeFilterChanged]: NumberRangeFilterChangedEvent;
1528
- [gsEventNames.numberRangeValueChanged]: NumberRangeValueChangedEvent;
1532
+ 'gs-queries-over-time': QueriesOverTimeComponent;
1529
1533
  }
1530
1534
  }
1531
1535
 
@@ -1533,7 +1537,7 @@ declare global {
1533
1537
  declare global {
1534
1538
  namespace React.JSX {
1535
1539
  interface IntrinsicElements {
1536
- 'gs-number-range-filter': NumberRangeFilterComponent;
1540
+ 'gs-queries-over-time': QueriesOverTimeComponent;
1537
1541
  }
1538
1542
  }
1539
1543
  }
@@ -1541,11 +1545,7 @@ declare global {
1541
1545
 
1542
1546
  declare global {
1543
1547
  interface HTMLElementTagNameMap {
1544
- 'gs-lineage-filter': LineageFilterComponent;
1545
- }
1546
- interface HTMLElementEventMap {
1547
- [gsEventNames.lineageFilterChanged]: LineageFilterChangedEvent;
1548
- [gsEventNames.lineageFilterMultiChanged]: LineageMultiFilterChangedEvent;
1548
+ 'gs-statistics': StatisticsComponent;
1549
1549
  }
1550
1550
  }
1551
1551
 
@@ -1553,7 +1553,7 @@ declare global {
1553
1553
  declare global {
1554
1554
  namespace React.JSX {
1555
1555
  interface IntrinsicElements {
1556
- 'gs-lineage-filter': LineageFilterComponent;
1556
+ 'gs-statistics': StatisticsComponent;
1557
1557
  }
1558
1558
  }
1559
1559
  }
@@ -1561,7 +1561,7 @@ declare global {
1561
1561
 
1562
1562
  declare global {
1563
1563
  interface HTMLElementTagNameMap {
1564
- 'gs-wastewater-mutations-over-time': WastewaterMutationsOverTimeComponent;
1564
+ 'gs-sequences-by-location': SequencesByLocationComponent;
1565
1565
  }
1566
1566
  }
1567
1567
 
@@ -1569,7 +1569,7 @@ declare global {
1569
1569
  declare global {
1570
1570
  namespace React.JSX {
1571
1571
  interface IntrinsicElements {
1572
- 'gs-wastewater-mutations-over-time': WastewaterMutationsOverTimeComponent;
1572
+ 'gs-sequences-by-location': SequencesByLocationComponent;
1573
1573
  }
1574
1574
  }
1575
1575
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@genspectrum/dashboard-components",
3
- "version": "1.18.0",
3
+ "version": "1.18.1",
4
4
  "description": "GenSpectrum web components for building dashboards",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",
@@ -190,50 +190,59 @@ export function DownshiftMultiCombobox<Item>({
190
190
  environment,
191
191
  });
192
192
 
193
- const { isOpen, getToggleButtonProps, getMenuProps, getInputProps, highlightedIndex, getItemProps, closeMenu } =
194
- useCombobox({
195
- items: availableItems,
196
- itemToString(item) {
197
- return itemToString(item);
198
- },
199
- inputValue: itemsFilter,
200
- onStateChange({ inputValue: newInputValue, type, selectedItem: newSelectedItem }) {
201
- switch (type) {
202
- case useCombobox.stateChangeTypes.InputKeyDownEnter:
203
- case useCombobox.stateChangeTypes.ItemClick:
204
- if (newSelectedItem) {
205
- dispatchEvent([...selectedItems, newSelectedItem]);
206
- setItemsFilter('');
207
- }
208
- break;
209
- case useCombobox.stateChangeTypes.InputChange:
210
- setItemsFilter(newInputValue?.trim() ?? '');
211
- break;
212
- default:
213
- break;
214
- }
215
- },
216
- stateReducer(state, actionAndChanges) {
217
- const { changes, type } = actionAndChanges;
218
- switch (type) {
219
- case useCombobox.stateChangeTypes.InputKeyDownEnter:
220
- case useCombobox.stateChangeTypes.ItemClick:
221
- return {
222
- ...changes,
223
- isOpen: true,
224
- highlightedIndex: state.highlightedIndex,
225
- inputValue: '',
226
- };
227
- default:
228
- return changes;
229
- }
230
- },
231
- environment,
232
- });
193
+ const {
194
+ isOpen,
195
+ getToggleButtonProps,
196
+ getMenuProps,
197
+ getInputProps,
198
+ highlightedIndex,
199
+ getItemProps,
200
+ closeMenu,
201
+ selectItem,
202
+ } = useCombobox({
203
+ items: availableItems,
204
+ itemToString(item) {
205
+ return itemToString(item);
206
+ },
207
+ inputValue: itemsFilter,
208
+ onStateChange({ inputValue: newInputValue, type, selectedItem: newSelectedItem }) {
209
+ switch (type) {
210
+ case useCombobox.stateChangeTypes.InputKeyDownEnter:
211
+ case useCombobox.stateChangeTypes.ItemClick:
212
+ if (newSelectedItem) {
213
+ dispatchEvent([...selectedItems, newSelectedItem]);
214
+ setItemsFilter('');
215
+ }
216
+ break;
217
+ case useCombobox.stateChangeTypes.InputChange:
218
+ setItemsFilter(newInputValue?.trim() ?? '');
219
+ break;
220
+ default:
221
+ break;
222
+ }
223
+ },
224
+ stateReducer(state, actionAndChanges) {
225
+ const { changes, type } = actionAndChanges;
226
+ switch (type) {
227
+ case useCombobox.stateChangeTypes.InputKeyDownEnter:
228
+ case useCombobox.stateChangeTypes.ItemClick:
229
+ return {
230
+ ...changes,
231
+ isOpen: true,
232
+ highlightedIndex: state.highlightedIndex,
233
+ inputValue: '',
234
+ };
235
+ default:
236
+ return changes;
237
+ }
238
+ },
239
+ environment,
240
+ });
233
241
 
234
242
  const clearAll = () => {
235
243
  dispatchEvent([]);
236
244
  setItemsFilter('');
245
+ selectItem(null);
237
246
  };
238
247
 
239
248
  const buttonRef = useRef(null);
@@ -259,7 +268,10 @@ export function DownshiftMultiCombobox<Item>({
259
268
  aria-label={`remove ${itemToString(selectedItem)}`}
260
269
  className='cursor-pointer hover:text-red-600'
261
270
  type='button'
262
- onClick={() => removeSelectedItem(selectedItem)}
271
+ onClick={() => {
272
+ removeSelectedItem(selectedItem);
273
+ selectItem(null);
274
+ }}
263
275
  tabIndex={-1}
264
276
  >
265
277
  ×
@@ -422,6 +422,119 @@ export const MultiSelectClearAll: StoryObj<LineageFilterProps> = {
422
422
  },
423
423
  };
424
424
 
425
+ export const MultiSelectReselectAfterClearAll: StoryObj<LineageFilterProps> = {
426
+ render: (args) => (
427
+ <LapisUrlContextProvider value={LAPIS_URL}>
428
+ <LineageFilter {...args} />
429
+ </LapisUrlContextProvider>
430
+ ),
431
+ args: {
432
+ ...Default.args,
433
+ multiSelect: true,
434
+ value: ['A.1', 'B.1'],
435
+ placeholderText: 'Select lineages',
436
+ },
437
+ play: async ({ canvasElement, step }) => {
438
+ const canvas = within(canvasElement);
439
+ const lineageChangedListenerMock = fn();
440
+
441
+ await step('Setup event listener mock', () => {
442
+ canvasElement.addEventListener(gsEventNames.lineageFilterMultiChanged, lineageChangedListenerMock);
443
+ });
444
+
445
+ await step('multi-select filter is rendered with initial values', async () => {
446
+ await waitFor(async () => {
447
+ await expect(canvas.getByText('A.1')).toBeVisible();
448
+ await expect(canvas.getByText('B.1')).toBeVisible();
449
+ });
450
+ });
451
+
452
+ await step('clear all selections', async () => {
453
+ const clearButton = canvas.getByLabelText('clear selection');
454
+ await userEvent.click(clearButton);
455
+
456
+ await waitFor(() => {
457
+ return expect(lineageChangedListenerMock.mock.calls.at(-1)![0].detail).toStrictEqual({
458
+ pangoLineage: undefined,
459
+ });
460
+ });
461
+ });
462
+
463
+ await step('reselect A.1 from the dropdown', async () => {
464
+ const input = await canvas.findByPlaceholderText('Select lineages');
465
+ await userEvent.type(input, 'A.1');
466
+ await userEvent.click(canvas.getByRole('option', { name: 'A.1(2,574)' }));
467
+
468
+ await waitFor(() => {
469
+ return expect(lineageChangedListenerMock.mock.calls.at(-1)![0].detail).toStrictEqual({
470
+ pangoLineage: ['A.1'],
471
+ });
472
+ });
473
+ });
474
+
475
+ await step('verify A.1 is shown', async () => {
476
+ await expect(canvas.getByText('A.1')).toBeVisible();
477
+ });
478
+ },
479
+ };
480
+
481
+ export const MultiSelectReselectAfterRemove: StoryObj<LineageFilterProps> = {
482
+ render: (args) => (
483
+ <LapisUrlContextProvider value={LAPIS_URL}>
484
+ <LineageFilter {...args} />
485
+ </LapisUrlContextProvider>
486
+ ),
487
+ args: {
488
+ ...Default.args,
489
+ multiSelect: true,
490
+ value: ['A.1', 'B.1'],
491
+ placeholderText: 'Select lineages',
492
+ },
493
+ play: async ({ canvasElement, step }) => {
494
+ const canvas = within(canvasElement);
495
+ const lineageChangedListenerMock = fn();
496
+
497
+ await step('Setup event listener mock', () => {
498
+ canvasElement.addEventListener(gsEventNames.lineageFilterMultiChanged, lineageChangedListenerMock);
499
+ });
500
+
501
+ await step('multi-select filter is rendered with initial values', async () => {
502
+ await waitFor(async () => {
503
+ await expect(canvas.getByText('A.1')).toBeVisible();
504
+ await expect(canvas.getByText('B.1')).toBeVisible();
505
+ });
506
+ });
507
+
508
+ await step('remove A.1', async () => {
509
+ const removeButton = canvas.getByLabelText('remove A.1');
510
+ await userEvent.click(removeButton);
511
+
512
+ await waitFor(() => {
513
+ return expect(lineageChangedListenerMock.mock.calls.at(-1)![0].detail).toStrictEqual({
514
+ pangoLineage: ['B.1'],
515
+ });
516
+ });
517
+ });
518
+
519
+ await step('reselect A.1 from the dropdown', async () => {
520
+ const input = await canvas.findByPlaceholderText('Select lineages');
521
+ await userEvent.type(input, 'A.1');
522
+ await userEvent.click(canvas.getByRole('option', { name: 'A.1(2,574)' }));
523
+
524
+ await waitFor(() => {
525
+ return expect(lineageChangedListenerMock.mock.calls.at(-1)![0].detail).toStrictEqual({
526
+ pangoLineage: ['B.1', 'A.1'],
527
+ });
528
+ });
529
+ });
530
+
531
+ await step('verify A.1 is shown again', async () => {
532
+ await expect(canvas.getByText('A.1')).toBeVisible();
533
+ await expect(canvas.getByText('B.1')).toBeVisible();
534
+ });
535
+ },
536
+ };
537
+
425
538
  async function prepare(canvasElement: HTMLElement, step: StepFunction<PreactRenderer, unknown>) {
426
539
  const canvas = within(canvasElement);
427
540