|
2 | 2 | import Tags from "src/components/Tags.svelte";
|
3 | 3 | import { type Concert } from "src/lib/bindings/Concert";
|
4 | 4 | import { formatDate, getPriceString } from "src/lib/utils";
|
5 |
| - import { selectedConcertIndices } from "src/lib/stores"; |
| 5 | + import { concertViews, selectedConcertIds } from "src/lib/stores"; |
| 6 | + import { notUndefined } from "src/lib/utils"; |
6 | 7 |
|
7 | 8 | export let allConcerts: Concert[];
|
8 |
| - export let shownIndices: number[]; |
| 9 | + export let shownIds: string[]; |
9 | 10 |
|
10 | 11 | // Event handler when a concert is clicked. The behaviour is chosen to
|
11 | 12 | // provide as intuitive a UI as possible
|
12 |
| - function selectOrDeselect(event: MouseEvent, idx: number) { |
13 |
| - if ($selectedConcertIndices.includes(idx)) { |
| 13 | + function selectOrDeselect(event: MouseEvent, id: string) { |
| 14 | + if ($selectedConcertIds.includes(id)) { |
14 | 15 | if (event.shiftKey) {
|
15 |
| - $selectedConcertIndices = $selectedConcertIndices.filter( |
16 |
| - (i) => i !== idx, |
| 16 | + $selectedConcertIds = $selectedConcertIds.filter( |
| 17 | + (i) => i !== id, |
17 | 18 | );
|
18 | 19 | } else {
|
19 |
| - if ($selectedConcertIndices.length === 1) { |
20 |
| - $selectedConcertIndices = []; |
| 20 | + if ($selectedConcertIds.length === 1) { |
| 21 | + $selectedConcertIds = []; |
21 | 22 | } else {
|
22 |
| - $selectedConcertIndices = [idx]; |
| 23 | + $selectedConcertIds = [id]; |
23 | 24 | }
|
24 | 25 | }
|
25 | 26 | } else {
|
26 | 27 | if (event.shiftKey) {
|
27 |
| - $selectedConcertIndices = [...$selectedConcertIndices, idx]; |
| 28 | + $selectedConcertIds = [...$selectedConcertIds, id]; |
28 | 29 | } else {
|
29 |
| - $selectedConcertIndices = [idx]; |
| 30 | + $selectedConcertIds = [id]; |
30 | 31 | }
|
31 | 32 | }
|
32 | 33 | }
|
33 | 34 | </script>
|
34 | 35 |
|
35 | 36 | <div class="concert-list">
|
36 |
| - {#each shownIndices as idx} |
37 |
| - {@const concert = allConcerts[idx]} |
| 37 | + {#each shownIds as id} |
| 38 | + {@const concert = notUndefined(allConcerts.find((c) => c.id === id))} |
38 | 39 | <button
|
39 | 40 | class="concert"
|
40 |
| - class:active={$selectedConcertIndices.includes(idx)} |
41 |
| - on:click={(event) => selectOrDeselect(event, idx)} |
| 41 | + class:active={$selectedConcertIds.includes(id)} |
| 42 | + on:click={(event) => selectOrDeselect(event, id)} |
42 | 43 | >
|
43 | 44 | <Tags {concert} />
|
44 | 45 | <h3>{concert.title}</h3>
|
|
68 | 69 | border: 2px solid #666;
|
69 | 70 | padding: 10px;
|
70 | 71 | border-radius: 5px;
|
71 |
| - width: calc(100% - 5px); /* Leave some space for scrollbar on some systems */ |
| 72 | + width: calc( |
| 73 | + 100% - 5px |
| 74 | + ); /* Leave some space for scrollbar on some systems */ |
72 | 75 |
|
73 | 76 | font-family: inherit;
|
74 | 77 | text-align: left;
|
|
0 commit comments