Skip to content

Commit 84ed7a1

Browse files
committed
Filters on list view, renamed filter components, added load more button with keyboard focus for list results. OWC-95
1 parent d397a9d commit 84ed7a1

8 files changed

Lines changed: 213 additions & 49 deletions

File tree

build/blocks/owc-openkaarten/streetmap/client.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build/blocks/owc-openkaarten/streetmap/client.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build/mix-manifest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"/blocks/owc-openkaarten/streetmap/client.js": "/blocks/owc-openkaarten/streetmap/client.js?id=d71a5f1e0878dc31192e22e93b9b40f1",
3-
"/blocks/owc-openkaarten/streetmap/style.css": "/blocks/owc-openkaarten/streetmap/style.css?id=031a35b0877942f8d8adeaff25000917",
2+
"/blocks/owc-openkaarten/streetmap/client.js": "/blocks/owc-openkaarten/streetmap/client.js?id=960c31f78d44969d4819c6bf4a1127d5",
3+
"/blocks/owc-openkaarten/streetmap/style.css": "/blocks/owc-openkaarten/streetmap/style.css?id=0c70cc29722d11466724176fc03cdd58",
44
"/blocks/owc-openkaarten/streetmap/editor.css": "/blocks/owc-openkaarten/streetmap/editor.css?id=f4316f0723fb86e3b028a9b448b1f3ae"
55
}

src/blocks/owc-openkaarten/streetmap/assets/scripts/vue/App.vue

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,27 @@ const primaryColor = ref('#328725');
3737
3838
const showListView = ref(false);
3939
40+
// Move selectedDatasets to App.vue
41+
const selectedDatasets = ref([]);
42+
43+
// Initialize selectedDatasets when datasets are loaded
44+
const initializeSelectedDatasets = () => {
45+
selectedDatasets.value = datasets.value.map(d => d.id);
46+
};
47+
48+
// Add datasetChange handler
49+
const handleDatasetChange = (id, checked) => {
50+
if (!id) return null;
51+
52+
if (checked) {
53+
const dataLayers = selectedDatasets.value;
54+
dataLayers.push(id);
55+
selectedDatasets.value = dataLayers;
56+
} else {
57+
selectedDatasets.value = selectedDatasets.value.filter((i) => i !== id);
58+
}
59+
};
60+
4061
// Add a function to toggle the view
4162
const toggleView = () => {
4263
showListView.value = !showListView.value;
@@ -108,6 +129,7 @@ async function getLocations() {
108129
109130
if (data && data.type === "DatasetCollection" && Array.isArray(data.datasets)) {
110131
datasets.value = data.datasets;
132+
initializeSelectedDatasets(); // Initialize after datasets are loaded
111133
} else {
112134
console.error("Unexpected response format or 'datasets' is not an array.");
113135
datasets.value = ([]); // Fallback to empty array if structure is unexpected.
@@ -169,16 +191,19 @@ onMounted(() => {
169191
v-if="!loading && !showListView"
170192
title="map"
171193
:datasets="datasets"
194+
:selectedDatasets="selectedDatasets"
172195
:tileLayerUri="tileLayerUri"
173196
:primaryColor="primaryColor"
174-
@toggleView="toggleView"
175-
/>
176-
<ListViewResults
177-
v-if="!loading && showListView"
178-
:datasets="datasets"
179-
:selectedDatasets="datasets.map(d => d.id)"
180-
:primaryColor="primaryColor"
181-
@toggleView="toggleView"
197+
@toggleView="toggleView"
198+
@datasetChange="handleDatasetChange"
199+
/>
200+
<ListViewResults
201+
v-if="!loading && showListView"
202+
:datasets="datasets"
203+
:selectedDatasets="selectedDatasets"
204+
:primaryColor="primaryColor"
205+
@toggleView="toggleView"
206+
@datasetChange="handleDatasetChange"
182207
/>
183208
</section>
184209
</div>

src/blocks/owc-openkaarten/streetmap/assets/scripts/vue/BaseMapFilters.vue renamed to src/blocks/owc-openkaarten/streetmap/assets/scripts/vue/BaseFilters.vue

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script setup>
22
import { onMounted } from 'vue';
3-
import BaseMapFiltersCheckbox from './BaseMapFiltersCheckbox.vue';
3+
import BaseFiltersCheckbox from './BaseFiltersCheckbox.vue';
44
import BaseTooltipCardClose from './BaseTooltipCardClose.vue';
55
66
const props = defineProps({
@@ -49,7 +49,7 @@ onMounted(() => {
4949
<template>
5050
<div
5151
class="owc-openkaarten-streetmap__filters"
52-
:style="{ '--filters-primary-color': primaryColor }"
52+
:style="{ '--owc-filters-primary': primaryColor }"
5353
>
5454
<div class="owc-openkaarten-streetmap__filters__header">
5555
<h5>{{ title }}</h5>
@@ -65,7 +65,7 @@ onMounted(() => {
6565
:key="layer.id"
6666
class="owc-openkaarten-streetmap__filters__body__list-item"
6767
>
68-
<BaseMapFiltersCheckbox
68+
<BaseFiltersCheckbox
6969
:title="layer.title"
7070
:id="layer.id"
7171
:color="primaryColor"
@@ -96,7 +96,6 @@ onMounted(() => {
9696
.owc-openkaarten-streetmap__filters {
9797
--owc-filters-card-padding: 12px;
9898
--owc-filters-card-margin: 10px;
99-
--owc-filters-primary: var(--owc-openkaarten-streetmap--primary-color);
10099
--owc-filters-secondary: var(--Grey-4, #7a7a7a);
101100
--owc-filters-title-color: var(--Primary-300, #001d5f);
102101
--owc-filters-checkbox-label-color: var(--Grey-4, #4b4b4b);
@@ -113,6 +112,7 @@ onMounted(() => {
113112
width: 448px;
114113
max-width: calc(100% - calc(var(--owc-filters-card-margin) * 2));
115114
height: auto;
115+
max-height: 661px;
116116
background: #fff;
117117
position: absolute;
118118
top: var(--owc-filters-card-margin);
@@ -189,4 +189,4 @@ onMounted(() => {
189189
}
190190
}
191191
}
192-
</style>
192+
</style>

src/blocks/owc-openkaarten/streetmap/assets/scripts/vue/BaseMapFiltersCheckbox.vue renamed to src/blocks/owc-openkaarten/streetmap/assets/scripts/vue/BaseFiltersCheckbox.vue

File renamed without changes.

src/blocks/owc-openkaarten/streetmap/assets/scripts/vue/ListView.vue

Lines changed: 161 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<script setup>
2-
import { computed, ref } from 'vue';
2+
import { computed, ref, nextTick } from 'vue';
33
import BaseListCard from './BaseListCard.vue';
44
import { makeFilterButtonHTML } from '../utils/make-filter-button-html';
55
import { makeMapButtonHTML } from '../utils/make-map-button-html';
6+
import BaseFilters from './BaseFilters.vue';
67
78
const props = defineProps({
89
datasets: {
@@ -29,7 +30,7 @@ const filteredLocations = computed(() => {
2930
})));
3031
});
3132
32-
const emits = defineEmits(['toggleView']);
33+
const emits = defineEmits(['toggleView', 'datasetChange']);
3334
3435
const showFilters = ref(false);
3536
@@ -44,36 +45,116 @@ const toggleView = () => {
4445
const filterButtonHTML = computed(() => makeFilterButtonHTML('Filter', props.primaryColor));
4546
const mapButtonHTML = computed(() => makeMapButtonHTML('Kaart', props.primaryColor));
4647
47-
// @TODO: Implement the actual filtering logic here
48-
// ...
48+
const handleDatasetChange = (id, checked) => {
49+
emits('datasetChange', id, checked);
50+
};
51+
52+
const closeFilters = () => {
53+
showFilters.value = false;
54+
};
55+
56+
const ITEMS_PER_PAGE = 12;
57+
const displayLimit = ref(ITEMS_PER_PAGE);
58+
const listItemRefs = ref([]);
59+
60+
const paginatedLocations = computed(() => {
61+
return filteredLocations.value.slice(0, displayLimit.value);
62+
});
63+
64+
const hasMoreItems = computed(() => {
65+
return displayLimit.value < filteredLocations.value.length;
66+
});
67+
68+
const loadMore = () => {
69+
const newLimit = displayLimit.value + ITEMS_PER_PAGE;
70+
displayLimit.value = Math.min(newLimit, filteredLocations.value.length);
71+
72+
nextTick(() => {
73+
const newItemIndex = displayLimit.value - ITEMS_PER_PAGE;
74+
const newItemRef = listItemRefs.value[newItemIndex];
75+
if (newItemRef) {
76+
newItemRef.focus();
77+
}
78+
});
79+
};
4980
</script>
5081

5182
<template>
52-
<div class="list-view">
83+
<div
84+
class="list-view"
85+
:style="{
86+
'--owc-filters-primary': primaryColor,
87+
'--owc-openkaarten-streetmap--primary-color': primaryColor,
88+
'--owc-filters-secondary': '#d2d2d2'
89+
}"
90+
>
5391
<div class="list-view__controls">
5492
<button @click="toggleView" class="list-view__map-button" v-html="mapButtonHTML"></button>
5593
<button @click="toggleFilters" class="list-view__filters-button" v-html="filterButtonHTML"></button>
5694
</div>
57-
<div v-for="location in filteredLocations" :key="`${location.datasetId}-${location.properties.id}`" class="list-view__item">
58-
<BaseListCard
59-
:title="location.properties.title || location.datasetTitle"
60-
:address="location.properties.address || 'Zorg | Beatrixlaan 32 C, 3273 AB Westmaas'"
61-
:description="location.properties.description || 'Huisartsenpraktijk Westmaas B.V. ligt in het gelijknamige dorp in de regio Hoeksche Waard. Westmaas telt circa 2.065 inwoners en levert huisartsenzorg aan 2.380 patiënten.'"
62-
:image="location.properties.image || 'https://images.unsplash.com/photo-1494526585095-c41746248156?q=80&w=1740&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'"
95+
96+
<!-- Add fade transition for overlay -->
97+
<Transition name="fade">
98+
<div
99+
v-if="showFilters"
100+
class="owc-openkaarten-streetmap__overlay"
101+
></div>
102+
</Transition>
103+
104+
<!-- Add slide transition for filters -->
105+
<Transition name="slide">
106+
<BaseFilters
107+
v-if="showFilters"
108+
:open="showFilters"
109+
:datasets="datasets.filter((set) => set.features.length)"
110+
:selectedDatasets="selectedDatasets"
63111
:primaryColor="primaryColor"
112+
@closeFilters="closeFilters"
113+
@datasetChange="handleDatasetChange"
114+
/>
115+
</Transition>
116+
117+
<div class="list-view__results">
118+
<div
119+
v-for="(location, index) in paginatedLocations"
120+
:key="`${location.datasetId}-${location.properties.id}`"
121+
class="list-view__item"
122+
:ref="el => { listItemRefs[index] = el }"
123+
tabindex="0"
64124
>
65-
<template #footer>
66-
</template>
67-
</BaseListCard>
125+
<BaseListCard
126+
:title="location.properties.title || location.datasetTitle"
127+
:address="location.properties.address || 'Zorg | Beatrixlaan 32 C, 3273 AB Westmaas'"
128+
:description="location.properties.description || 'Huisartsenpraktijk Westmaas B.V. ligt in het gelijknamige dorp in de regio Hoeksche Waard. Westmaas telt circa 2.065 inwoners en levert huisartsenzorg aan 2.380 patiënten.'"
129+
:image="location.properties.image || 'https://images.unsplash.com/photo-1494526585095-c41746248156?q=80&w=1740&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'"
130+
:primaryColor="primaryColor"
131+
>
132+
<template #footer>
133+
</template>
134+
</BaseListCard>
135+
</div>
136+
137+
<!-- Add Load More button -->
138+
<button
139+
v-if="hasMoreItems"
140+
@click="loadMore"
141+
class="list-view__load-more"
142+
:style="{ '--button-color': primaryColor }"
143+
>
144+
Toon meer resultaten ({{ paginatedLocations.length }} van {{ filteredLocations.length }})
145+
</button>
68146
</div>
69147
</div>
70148
</template>
71149

72-
<style lang="scss" scoped>
150+
<style lang="scss">
73151
.list-view {
74152
display: flex;
75153
flex-direction: column;
76154
gap: 1rem;
155+
min-block-size: 660px;
156+
position: relative;
157+
overflow: hidden;
77158
78159
&__controls {
79160
display: flex;
@@ -93,13 +174,12 @@ const mapButtonHTML = computed(() => makeMapButtonHTML('Kaart', props.primaryCol
93174
min-height: 50px;
94175
padding: 10px 24px;
95176
96-
// @TODO: styles are not being applied, why?
97177
span {
98178
color: #328725;
99179
font-size: 20px;
100180
font-style: normal;
101181
font-weight: 500;
102-
line-height: 130%;
182+
line-height: 130%;
103183
}
104184
105185
&:hover {
@@ -113,10 +193,74 @@ const mapButtonHTML = computed(() => makeMapButtonHTML('Kaart', props.primaryCol
113193
}
114194
}
115195
196+
&__results {
197+
display: flex;
198+
flex-direction: column;
199+
gap: 1rem;
200+
}
201+
116202
&__item {
117203
display: flex;
118204
flex-direction: column;
119205
gap: 1rem;
206+
207+
&:focus {
208+
outline: 2px solid var(--owc-openkaarten-streetmap--primary-color);
209+
outline-offset: 4px;
210+
}
211+
}
212+
213+
&__load-more {
214+
margin-top: 1rem;
215+
padding: 1rem 2rem;
216+
background-color: white;
217+
border: 2px solid var(--button-color);
218+
color: var(--button-color);
219+
border-radius: 4px;
220+
font-weight: 500;
221+
cursor: pointer;
222+
transition: background-color 0.2s ease;
223+
224+
&:hover {
225+
background-color: rgb(244, 244, 244);
226+
}
227+
228+
&:focus-visible {
229+
outline: 2px solid var(--button-color);
230+
outline-offset: 2px;
231+
}
120232
}
121233
}
234+
235+
.fade-enter-active,
236+
.fade-leave-active {
237+
transition: opacity 0.5s ease-in-out;
238+
}
239+
240+
.fade-enter-from,
241+
.fade-leave-to {
242+
opacity: 0;
243+
}
244+
245+
.slide-enter-active,
246+
.slide-leave-active {
247+
transform: translateX(0);
248+
transition: transform 0.5s ease-in-out;
249+
}
250+
251+
.slide-enter-from,
252+
.slide-leave-to {
253+
transform: translateX(120%);
254+
}
255+
256+
.owc-openkaarten-streetmap__overlay {
257+
background-color: var(--owc-map-overlay, rgba(0, 0, 0, 0.25));
258+
position: absolute;
259+
content: '';
260+
top: 0;
261+
left: 0;
262+
width: 100%;
263+
height: 100%;
264+
z-index: 999;
265+
}
122266
</style>

0 commit comments

Comments
 (0)