@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/components.d.ts +57 -57
- package/dist/components.js +15 -2
- package/dist/components.js.map +1 -1
- package/dist/util.d.ts +57 -57
- package/package.json +1 -1
- package/src/preact/components/downshift-combobox.tsx +53 -41
- package/src/preact/lineageFilter/lineage-filter.stories.tsx +113 -0
- package/standalone-bundle/dashboard-components.js +849 -838
- package/standalone-bundle/dashboard-components.js.map +1 -1
package/dist/util.d.ts
CHANGED
|
@@ -1268,7 +1268,7 @@ declare global {
|
|
|
1268
1268
|
|
|
1269
1269
|
declare global {
|
|
1270
1270
|
interface HTMLElementTagNameMap {
|
|
1271
|
-
'gs-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
1572
|
+
'gs-sequences-by-location': SequencesByLocationComponent;
|
|
1573
1573
|
}
|
|
1574
1574
|
}
|
|
1575
1575
|
}
|
package/package.json
CHANGED
|
@@ -190,50 +190,59 @@ export function DownshiftMultiCombobox<Item>({
|
|
|
190
190
|
environment,
|
|
191
191
|
});
|
|
192
192
|
|
|
193
|
-
const {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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={() =>
|
|
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
|
|