Skip to content

Commit 95ed857

Browse files
committed
fix: filter also on map
1 parent 1b1c66a commit 95ed857

5 files changed

Lines changed: 33 additions & 11 deletions

File tree

src/lib/components/Map.svelte

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
let minimumFilterValue = 1895;
2020
let maximumFilterValue = new Date().getFullYear();
2121
22+
let selectedVenueTypes: { label: string; value: string }[] = [];
2223
export let data: FeatureCollection | null;
2324
2425
onMount(() => {
@@ -138,13 +139,28 @@
138139
}
139140
});
140141
141-
const updateFilter = (min: number, max: number) => {
142+
const updateFilter = (
143+
min: number,
144+
max: number,
145+
selectedVenueTypes?: { label: string; value: string }[]
146+
) => {
142147
if (!$map?.style) return;
143-
$map?.setFilter('venues', [
148+
149+
let filter = [
144150
'any',
145151
['all', ['>=', ['get', 'startYear'], min], ['<=', ['get', 'startYear'], max]],
146152
['all', ['>=', ['get', 'endYear'], min], ['<=', ['get', 'endYear'], max]]
147-
]);
153+
];
154+
155+
if (selectedVenueTypes?.length) {
156+
const typeFilter = [
157+
'any',
158+
...selectedVenueTypes.map((type) => ['in', type.value, ['get', 'type']])
159+
];
160+
filter = ['all', filter, typeFilter];
161+
}
162+
163+
$map?.setFilter('venues', filter);
148164
};
149165
150166
const updateVisibleFeatures = () => {
@@ -155,7 +171,7 @@
155171
};
156172
157173
$: {
158-
updateFilter(minimumFilterValue, maximumFilterValue);
174+
updateFilter(minimumFilterValue, maximumFilterValue, selectedVenueTypes);
159175
updateVisibleFeatures();
160176
}
161177
@@ -208,7 +224,7 @@
208224

209225
<!-- TypeFilter-->
210226
<div class="absolute top-0 right-0 z-10 mr-4">
211-
<TypeFilter />
227+
<TypeFilter bind:selectedVenueTypes />
212228
</div>
213229

214230
<!-- Map -->

src/lib/components/TypeFilter.svelte

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@
44
import { type Option } from 'svelte-multiselect';
55
import { type Venue } from '$lib/types';
66
7-
let selected: { label: string; value: string }[] = $state([]);
7+
let { selectedVenueTypes = $bindable(), ...props } = $props();
88
99
$effect(() => {
1010
$filteredVisibleFeatures = $visibleFeatures.filter((feature) => {
1111
const venue: Venue = JSON.parse(feature.properties.venue);
1212
return (
13-
selected.length === 0 ||
14-
selected.some((option) => venue.additionalType.some((type) => type['@id'] === option.value))
13+
selectedVenueTypes.length === 0 ||
14+
selectedVenueTypes.some((option) =>
15+
venue.additionalType.some((type) => type['@id'] === option.value)
16+
)
1517
);
1618
});
1719
});
@@ -22,6 +24,6 @@
2224
<h2 class="card-title text-xs sm:text-sm md:text-lg">Filter</h2>
2325
<p class="text-xs sm:text-sm md:text-base">Filter by venue type</p>
2426

25-
<MultiSelect bind:selected options={$venueTypes as Option[]} />
27+
<MultiSelect bind:selected={selectedVenueTypes} options={$venueTypes as Option[]} />
2628
</div>
2729
</div>

src/lib/components/VenuePreviewList.svelte

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
</script>
55

66
<ul class="bg-base-100 grid grid-cols-1 gap-2 sm:grid-cols-2 lg:grid-cols-1">
7-
{#each $filteredVisibleFeatures as feature (feature.id)}
7+
<code>{JSON.stringify($filteredVisibleFeatures, null, 2)}</code>
8+
9+
{#each $filteredVisibleFeatures as feature, index (index)}
810
<VenuePreview venue={JSON.parse(feature.properties.venue)} id={feature.id ?? ''} />
911
{/each}
1012
</ul>

src/lib/stores.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ export const filteredVisibleFeatures = writable<maplibregl.MapGeoJSONFeature[]>(
1111

1212
export const map = writable<maplibregl.Map | null>(null);
1313

14-
export const venueTypes = writable<{ label: string; value: string }[]>([]);
14+
export const venueTypes = writable<{ label: string; value: string }[]>([]);

src/lib/utils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const convertToGeoJson = (data: Venue[]) => {
1818
type: 'FeatureCollection',
1919
features: data.map((venue) => {
2020
const i = data.indexOf(venue);
21+
const type = venue.additionalType.map((type) => type['@id']);
2122
const startYear = venue.location.startDate
2223
? new Date(venue.location.startDate).getFullYear()
2324
: null;
@@ -33,6 +34,7 @@ const convertToGeoJson = (data: Venue[]) => {
3334
},
3435
properties: {
3536
name: venue.name,
37+
type: type,
3638
startYear: startYear,
3739
endYear: endYear,
3840
venue: venue // Full venue data (as string)

0 commit comments

Comments
 (0)