Added place count to filters

This commit is contained in:
Alexis
2026-03-27 22:43:08 +01:00
parent 782162d410
commit 8b88b2bebb
2 changed files with 52 additions and 18 deletions

View File

@@ -5,23 +5,18 @@ import { storeToRefs } from 'pinia';
import { CheckboxIndicator, CheckboxRoot } from 'reka-ui' import { CheckboxIndicator, CheckboxRoot } from 'reka-ui'
const { filterCovered, filterUncovered, filterKorrigo } = storeToRefs(useMap()) const { filterCovered, filterUncovered, filterKorrigo } = storeToRefs(useMap())
defineProps<{
nbUncovered?: number
nbCovered?: number
nbKorrigo?: number
}>()
</script> </script>
<template> <template>
<aside class="absolute top-5 left-5 z-10 p-2 bg-slate-50 text-slate-950 text-xs rounded-xs"> <aside class="absolute top-5 left-5 z-10 p-2 bg-slate-50 text-slate-950 text-xs rounded-xs">
<form> <form>
<div class="grid gap-1.5"> <div class="grid gap-1.5">
<label class="flex flex-row gap-1.5 items-center [&>.checkbox]:hover:bg-foreground text-sm cursor-pointer">
<CheckboxRoot v-model="filterCovered"
class="hover:bg-stone-50 flex size-4 appearance-none items-center justify-center rounded-xs bg-foreground shadow-sm border focus-within:ring-1 cursor-pointer">
<CheckboxIndicator class="bg-foreground size-full flex items-center justify-center">
<PhCheck :size="10" />
</CheckboxIndicator>
</CheckboxRoot>
<span class="select-none">Abrités</span>
</label>
<label class="flex flex-row gap-1.5 items-center [&>.checkbox]:hover:bg-foreground text-sm cursor-pointer"> <label class="flex flex-row gap-1.5 items-center [&>.checkbox]:hover:bg-foreground text-sm cursor-pointer">
<CheckboxRoot v-model="filterUncovered" <CheckboxRoot v-model="filterUncovered"
class="hover:bg-stone-50 flex size-4 appearance-none items-center justify-center rounded-xs bg-foreground shadow-sm border focus-within:ring-1 cursor-pointer"> class="hover:bg-stone-50 flex size-4 appearance-none items-center justify-center rounded-xs bg-foreground shadow-sm border focus-within:ring-1 cursor-pointer">
@@ -30,7 +25,30 @@ const { filterCovered, filterUncovered, filterKorrigo } = storeToRefs(useMap())
</CheckboxIndicator> </CheckboxIndicator>
</CheckboxRoot> </CheckboxRoot>
<span class="select-none">Non-abrités</span> <span class="select-none">
Non-abrités
<small v-if="nbUncovered">
({{ nbUncovered }})
</small>
</span>
</label>
<label class="flex flex-row gap-1.5 items-center [&>.checkbox]:hover:bg-foreground text-sm cursor-pointer">
<CheckboxRoot v-model="filterCovered"
class="hover:bg-stone-50 flex size-4 appearance-none items-center justify-center rounded-xs bg-foreground shadow-sm border focus-within:ring-1 cursor-pointer">
<CheckboxIndicator class="bg-foreground size-full flex items-center justify-center">
<PhCheck :size="10" />
</CheckboxIndicator>
</CheckboxRoot>
<span class="select-none">
Abrités
<small v-if="nbCovered">
({{ nbCovered }})
</small>
</span>
</label> </label>
<label class="flex flex-row gap-1.5 items-center [&>.checkbox]:hover:bg-foreground text-sm cursor-pointer"> <label class="flex flex-row gap-1.5 items-center [&>.checkbox]:hover:bg-foreground text-sm cursor-pointer">
@@ -41,7 +59,13 @@ const { filterCovered, filterUncovered, filterKorrigo } = storeToRefs(useMap())
</CheckboxIndicator> </CheckboxIndicator>
</CheckboxRoot> </CheckboxRoot>
<span class="select-none">Abonnement Korrigo</span> <span class="select-none">
Abonnement Korrigo
<small v-if="nbKorrigo">
({{ nbKorrigo }})
</small>
</span>
</label> </label>
</div> </div>
</form> </form>

View File

@@ -40,26 +40,36 @@ const { state } = useQuery({
}) })
// Groups different parking spot by types // Groups different parking spot by types
const nonCoveredParkings = computed(() =>
state.value.data?.filter(p => p.type === SpotType.Uncovered) ?? []
)
const nonCoveredParkingsSpots = computed(() => {
return nonCoveredParkings.value.reduce((acc, val) => acc + val.nb_total_place, 0)
})
const coveredTypes = new Set([SpotType.Covered, SpotType.Boxed]) const coveredTypes = new Set([SpotType.Covered, SpotType.Boxed])
const coveredParkings = computed(() => const coveredParkings = computed(() =>
state.value.data?.filter(p => coveredTypes.has(p.type as SpotType)) ?? [] state.value.data?.filter(p => coveredTypes.has(p.type as SpotType)) ?? []
) )
const coveredParkingsSpots = computed(() => {
const nonCoveredParkings = computed(() => return coveredParkings.value.reduce((acc, val) => acc + val.nb_total_place, 0)
state.value.data?.filter(p => p.type === SpotType.Uncovered) ?? [] })
)
const premiumParkings = computed(() => const premiumParkings = computed(() =>
state.value.data?.filter(p => p.condition_acces === SpotAccess.Korrigo) ?? [] state.value.data?.filter(p => p.condition_acces === SpotAccess.Korrigo) ?? []
) )
const premiumParkingsSpots = computed(() => {
return premiumParkings.value.reduce((acc, val) => acc + val.nb_total_place, 0)
})
const { zoom, minZoom, center, maxClusterRadius, disableClusteringAtZoom } = useMap() const { zoom, minZoom, center, maxClusterRadius, disableClusteringAtZoom } = useMap()
const { filterUncovered, filterCovered, filterKorrigo } = storeToRefs(useMap()) const { filterUncovered, filterCovered, filterKorrigo } = storeToRefs(useMap())
</script> </script>
<template> <template>
<BikeFilters /> <BikeFilters :nb-uncovered="nonCoveredParkingsSpots" :nb-covered="coveredParkingsSpots"
:nb-korrigo="premiumParkingsSpots" />
<main class="relative z-0 h-screen w-screen grid place-items-center"> <main class="relative z-0 h-screen w-screen grid place-items-center">
<div v-if="state.status === 'pending'">Loading...</div> <div v-if="state.status === 'pending'">Loading...</div>