Skip to content

Commit 4c6f839

Browse files
authored
Merge pull request #16 from OpenWebconcept/feature/OWC-95
Feature/owc 95
2 parents b41582f + 241e2f3 commit 4c6f839

11 files changed

Lines changed: 223 additions & 85 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: 1 addition & 1 deletion
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=bf40ff132ebc066be4205d782460f249",
2+
"/blocks/owc-openkaarten/streetmap/client.js": "/blocks/owc-openkaarten/streetmap/client.js?id=b70bf331ca1a2402b53582b042146a37",
33
"/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
}

package-lock.json

Lines changed: 25 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/blocks/owc-openkaarten/streetmap/assets/scripts/utils/calculate-bounds.js

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,31 @@ export const calculateBounds = (datasets) => {
33
let maxLat = null;
44
let minLong = null;
55
let maxLong = null;
6-
datasets.forEach(({ features }) => {
7-
features.forEach(({ geometry }) => {
8-
const [lat, long] = geometry.coordinates.reverse(); // lat-long reversed
96

7+
const processCoordinates = (coords) => {
8+
// Handle a single coordinate pair
9+
if (!Array.isArray(coords[0])) {
10+
const [lat, long] = coords.reverse(); // lat-long reversed
1011
minLat = minLat === null ? lat : Math.min(minLat, lat);
1112
maxLat = maxLat === null ? lat : Math.max(maxLat, lat);
1213
minLong = minLong === null ? long : Math.min(minLong, long);
1314
maxLong = maxLong === null ? long : Math.max(maxLong, long);
15+
return;
16+
}
17+
18+
// Handle arrays of coordinates (Polygons)
19+
coords.forEach(coordSet => {
20+
if (Array.isArray(coordSet[0])) {
21+
coordSet.forEach(coord => processCoordinates(coord.slice()));
22+
} else {
23+
processCoordinates(coordSet.slice());
24+
}
25+
});
26+
};
27+
28+
datasets.forEach(({ features }) => {
29+
features.forEach(({ geometry }) => {
30+
processCoordinates(geometry.coordinates.slice());
1431
});
1532
});
1633

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

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup>
2-
import {defineProps, onMounted, ref} from 'vue';
2+
import {defineProps, onMounted, ref, nextTick} from 'vue';
33
import BaseAlert from './BaseAlert.vue';
44
import BaseLoader from './BaseLoader.vue';
55
import TheMap from './TheMap.vue';
@@ -58,9 +58,16 @@ const handleDatasetChange = (id, checked) => {
5858
}
5959
};
6060
61-
// Add a function to toggle the view
62-
const toggleView = () => {
61+
const containerRef = ref(null);
62+
63+
// Function to toggle the view and set focus
64+
const toggleViewAndFocus = () => {
6365
showListView.value = !showListView.value;
66+
nextTick(() => {
67+
if (containerRef.value) {
68+
containerRef.value.focus();
69+
}
70+
});
6471
};
6572
6673
/**
@@ -178,7 +185,11 @@ onMounted(() => {
178185
</script>
179186

180187
<template v-if="endpoint">
181-
<div class="owc-openkaarten-streetmap-container" ref="container">
188+
<div
189+
class="owc-openkaarten-streetmap-container"
190+
ref="containerRef"
191+
tabindex="-1"
192+
>
182193
<BaseAlert v-if="error" type="error" :message="error"/>
183194
<section
184195
class="owc-openkaarten-streetmap__results"
@@ -194,15 +205,15 @@ onMounted(() => {
194205
:selectedDatasets="selectedDatasets"
195206
:tileLayerUri="tileLayerUri"
196207
:primaryColor="primaryColor"
197-
@toggleView="toggleView"
208+
@toggleView="toggleViewAndFocus"
198209
@datasetChange="handleDatasetChange"
199210
/>
200211
<ListViewResults
201212
v-if="!loading && showListView"
202213
:datasets="datasets"
203214
:selectedDatasets="selectedDatasets"
204215
:primaryColor="primaryColor"
205-
@toggleView="toggleView"
216+
@toggleView="toggleViewAndFocus"
206217
@datasetChange="handleDatasetChange"
207218
/>
208219
</section>
@@ -215,6 +226,11 @@ onMounted(() => {
215226
max-width: 100%;
216227
}
217228
229+
.owc-openkaarten-streetmap-container:focus,
230+
.owc-openkaarten-streetmap__results:focus {
231+
outline: none !important;
232+
}
233+
218234
.owc-openkaarten-streetmap-container {
219235
margin-inline: auto;
220236
width: min(calc(100% - 32px), 1440px);

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

Lines changed: 102 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup>
2-
import { onMounted } from 'vue';
2+
import { onMounted, onUnmounted, ref, watch, nextTick } from 'vue';
33
import BaseFiltersCheckbox from './BaseFiltersCheckbox.vue';
44
import BaseTooltipCardClose from './BaseTooltipCardClose.vue';
55
@@ -35,30 +35,111 @@ const datasetChange = (id, checked) => {
3535
emit('datasetChange', id, checked);
3636
};
3737
38+
const filterContainer = ref(null);
39+
const closeButton = ref(null);
40+
let previousActiveElement = null;
41+
42+
const getFocusableElements = (element) => {
43+
return element.querySelectorAll(
44+
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
45+
);
46+
};
47+
48+
const handleTab = (e) => {
49+
if (!props.open || !filterContainer.value) return;
50+
51+
const focusableElements = getFocusableElements(filterContainer.value);
52+
const firstFocusable = focusableElements[0];
53+
const lastFocusable = focusableElements[focusableElements.length - 1];
54+
55+
if (e.shiftKey) {
56+
if (document.activeElement === firstFocusable) {
57+
e.preventDefault();
58+
lastFocusable.focus();
59+
}
60+
} else {
61+
if (document.activeElement === lastFocusable) {
62+
e.preventDefault();
63+
firstFocusable.focus();
64+
}
65+
}
66+
};
67+
3868
const handleKeyup = (e) => {
39-
if (props.open && e.key === 'Escape') {
40-
emit('closeFilters');
69+
if (!props.open) return;
70+
71+
if (e.key === 'Escape') {
72+
closeFiltersWithX();
73+
}
74+
};
75+
76+
const handleClickOutside = (e) => {
77+
if (!props.open) return;
78+
79+
if (filterContainer.value && !filterContainer.value.contains(e.target)) {
80+
closeFiltersWithX();
81+
}
82+
};
83+
84+
const closeFiltersWithX = () => {
85+
const filterButton = document.querySelector('.leaflet-control-filters');
86+
if (filterButton) {
87+
filterButton.focus();
88+
}
89+
emit('closeFilters');
90+
};
91+
92+
const closeFiltersWithConfirm = (event) => {
93+
event?.preventDefault();
94+
event?.stopPropagation();
95+
96+
const filterButton = document.querySelector('.leaflet-control-filters');
97+
if (filterButton) {
98+
filterButton.focus();
4199
}
100+
emit('closeFilters');
42101
};
43102
103+
watch(() => props.open, async (newValue) => {
104+
if (newValue) {
105+
previousActiveElement = document.activeElement;
106+
await nextTick();
107+
closeButton.value?.focus();
108+
}
109+
});
110+
44111
onMounted(() => {
112+
document.addEventListener('keydown', handleTab);
45113
document.addEventListener('keyup', handleKeyup);
114+
document.addEventListener('mousedown', handleClickOutside);
115+
});
116+
117+
onUnmounted(() => {
118+
document.removeEventListener('keydown', handleTab);
119+
document.removeEventListener('keyup', handleKeyup);
120+
document.removeEventListener('mousedown', handleClickOutside);
46121
});
47122
</script>
48123
49124
<template>
50125
<div
126+
ref="filterContainer"
51127
class="owc-openkaarten-streetmap__filters"
52128
:style="{ '--owc-filters-primary': primaryColor }"
129+
role="dialog"
130+
aria-modal="true"
131+
aria-labelledby="filters-title"
132+
aria-describedby="filters-description"
53133
>
54134
<div class="owc-openkaarten-streetmap__filters__header">
55-
<h5>{{ title }}</h5>
135+
<h5 id="filters-title">{{ title }}</h5>
56136
<BaseTooltipCardClose
137+
ref="closeButton"
57138
:primaryColor="primaryColor"
58-
@closeCard="$emit('closeFilters')"
139+
@closeCard="closeFiltersWithX"
59140
/>
60141
</div>
61-
<div class="owc-openkaarten-streetmap__filters__body">
142+
<div id="filters-description" class="owc-openkaarten-streetmap__filters__body">
62143
<ul class="owc-openkaarten-streetmap__filters__body__list">
63144
<li
64145
v-for="layer in datasets"
@@ -84,7 +165,8 @@ onMounted(() => {
84165
<div class="owc-openkaarten-streetmap__filters__footer">
85166
<button
86167
class="owc-openkaarten-streetmap__filters__footer__btn"
87-
@click="$emit('closeFilters')"
168+
@click.stop.prevent="closeFiltersWithConfirm"
169+
@keydown.enter.stop.prevent="closeFiltersWithConfirm"
88170
>
89171
{{ confirm }}
90172
</button>
@@ -105,7 +187,6 @@ onMounted(() => {
105187
--owc-filters-card-margin: 0;
106188
}
107189
108-
109190
display: flex;
110191
flex-direction: column;
111192
justify-content: space-between;
@@ -119,6 +200,9 @@ onMounted(() => {
119200
bottom: var(--owc-filters-card-margin);
120201
right: var(--owc-filters-card-margin);
121202
z-index: 9999;
203+
border: none;
204+
padding: 0;
205+
margin: 0;
122206
123207
&__header {
124208
display: flex;
@@ -183,9 +267,19 @@ onMounted(() => {
183267
font-style: normal;
184268
font-weight: 400;
185269
line-height: 150%; /* 27px */
270+
186271
&:hover {
187272
cursor: pointer;
188273
}
274+
275+
&:focus-visible {
276+
outline: 2px solid var(--owc-openkaarten-streetmap--primary-color);
277+
outline-offset: 2px;
278+
}
279+
280+
&:where(:hover, :focus-visible) {
281+
opacity: 0.8;
282+
}
189283
}
190284
}
191285
}

0 commit comments

Comments
 (0)