Skip to content

Commit 3b84b0f

Browse files
committed
Refactor to make concert filtering cleaner
1 parent f2db0ef commit 3b84b0f

File tree

3 files changed

+39
-38
lines changed

3 files changed

+39
-38
lines changed

src/App.svelte

+14-7
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,24 @@
33
import Filters from "src/lib/Filters.svelte";
44
import Overview from "src/lib/Overview.svelte";
55
import Details from "src/lib/Details.svelte";
6-
7-
import { type FiltersType } from "src/lib/filters";
86
import { type Concert } from "src/lib/bindings/Concert";
9-
let selectedConcert: Concert | null = null;
7+
import { type FiltersType, satisfies } from "src/lib/filters";
8+
9+
// Initialise list of concerts
10+
import rawConcerts from "src/assets/concerts.json";
11+
const concerts = rawConcerts as Concert[];
1012
11-
let filters: Filters = {
13+
// Filter concerts
14+
let filters: FiltersType = {
1215
searchTerm: "",
1316
wigmoreU35: false,
1417
};
18+
let concertsToShow: Concert[];
19+
$: {
20+
concertsToShow = concerts.filter((c) => satisfies(c, filters));
21+
}
1522
16-
let searchTerm: string = "";
23+
let selectedConcert: Concert | null = null;
1724
</script>
1825

1926
<body>
@@ -23,7 +30,7 @@
2330
<Filters bind:filters />
2431
</div>
2532
<div class="bottom">
26-
<Overview bind:filters bind:selectedConcert />
33+
<Overview concerts={concertsToShow} bind:selectedConcert />
2734
<Details bind:selectedConcert />
2835
</div>
2936
</main>
@@ -62,7 +69,7 @@
6269
grid-template-columns: 1fr 1fr;
6370
gap: 30px;
6471
width: 100%;
65-
min-height: 0; /* So confusing that this is required */
72+
min-height: 0; /* So confusing that this is required */
6673
max-height: 100%;
6774
}
6875
</style>

src/lib/Overview.svelte

+2-31
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,14 @@
11
<script lang="ts">
22
import { type Concert } from "src/lib/bindings/Concert";
33
import Tags from "src/lib/Tags.svelte";
4-
import { type FiltersType } from "src/lib/filters";
54
import { formatDate, getPriceString } from "src/utils";
65
6+
export let concerts: Concert[];
77
export let selectedConcert: Concert | null;
8-
export let filters: FiltersType;
9-
10-
// Initialise list of concerts
11-
import rawConcerts from "src/assets/concerts.json";
12-
const concerts = rawConcerts as Concert[];
13-
let concertsToShow: Concert[] = [];
14-
15-
function satisfiesFilters(concert: Concert, filters: FiltersType): boolean {
16-
// Check search filter
17-
let ciSearchTerm = filters.searchTerm.toLowerCase();
18-
let searchPass =
19-
filters.searchTerm === "" ||
20-
concert.title.toLowerCase().includes(ciSearchTerm) ||
21-
(concert.subtitle !== null &&
22-
concert.subtitle.toLowerCase().includes(ciSearchTerm)) ||
23-
concert.venue.toLowerCase().includes(ciSearchTerm) ||
24-
concert.performers.some((p) =>
25-
p.name.toLowerCase().includes(ciSearchTerm),
26-
);
27-
28-
// Check U35 filter
29-
let u35Pass = filters.wigmoreU35 ? concert.is_wigmore_u35 : true;
30-
31-
return searchPass && u35Pass;
32-
}
33-
34-
$: {
35-
concertsToShow = concerts.filter((c) => satisfiesFilters(c, filters));
36-
}
378
</script>
389

3910
<div class="overview">
40-
{#each concertsToShow as concert}
11+
{#each concerts as concert}
4112
<button
4213
class="concert"
4314
class:active={selectedConcert === concert}

src/lib/filters.ts

+23
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,27 @@
1+
import { type Concert } from "src/lib/bindings/Concert";
2+
13
export type FiltersType = {
24
searchTerm: string;
35
wigmoreU35: boolean;
46
};
7+
8+
// Check if a concert satisfies the filters
9+
export function satisfies(concert: Concert, filters: FiltersType): boolean {
10+
// Check search filter
11+
let ciSearchTerm = filters.searchTerm.toLowerCase();
12+
let searchPass =
13+
filters.searchTerm === "" ||
14+
concert.title.toLowerCase().includes(ciSearchTerm) ||
15+
(concert.subtitle !== null &&
16+
concert.subtitle.toLowerCase().includes(ciSearchTerm)) ||
17+
concert.venue.toLowerCase().includes(ciSearchTerm) ||
18+
concert.performers.some((p) =>
19+
p.name.toLowerCase().includes(ciSearchTerm),
20+
);
21+
22+
// Check U35 filter
23+
let u35Pass = filters.wigmoreU35 ? concert.is_wigmore_u35 : true;
24+
25+
return searchPass && u35Pass;
26+
}
27+

0 commit comments

Comments
 (0)