diff --git a/webapp/pages/map.vue b/webapp/pages/map.vue index 08f14cffa..2160911e0 100644 --- a/webapp/pages/map.vue +++ b/webapp/pages/map.vue @@ -90,6 +90,8 @@ export default { isGeoJSON: false, isSourceAndLayerAdded: false, isFlyToCenter: false, + popup: null, + popupIsVisible: false, }, } }, @@ -153,13 +155,6 @@ export default { onMapLoad({ map }) { this.map = map - map.on('style.load', (value) => { - // Triggered when `setStyle` is called. - this.markers.isImagesLoaded = false - this.markers.isSourceAndLayerAdded = false - this.loadMarkesIconsAndAddMarkers() - }) - // // documentation of correct version: https://github.com/mapbox/mapbox-gl-language/tree/v0.10.0 // // Add RTL support if you want to support Arabic // // Wolle: does not work yet @@ -180,6 +175,13 @@ export default { // set the default atmosphere style // this.map.setFog({}) // the package is probably to old, because of Vue2: https://docs.mapbox.com/mapbox-gl-js/example/globe/ + this.map.on('style.load', (value) => { + // Triggered when `setStyle` is called. + this.markers.isImagesLoaded = false + this.markers.isSourceAndLayerAdded = false + this.loadMarkesIconsAndAddMarkers() + }) + // add search field for locations this.map.addControl( new MapboxGeocoder({ @@ -188,6 +190,64 @@ export default { }), ) + // example: https://docs.mapbox.com/mapbox-gl-js/example/popup-on-hover/ + // create a popup, but don't add it to the map yet + this.markers.popup = new mapboxgl.Popup({ + closeButton: false, + closeOnClick: true, + }) + + this.map.on('mouseenter', 'markers', (e) => { + if (e.features[0].properties.type !== 'the-user') { + // close old popup first + if (this.markers.popupIsVisible) { + this.markers.popup.remove() + this.markers.popupIsVisible = false + } + + // Change the cursor style as a UI indicator. + this.map.getCanvas().style.cursor = 'pointer' + + // Copy coordinates array. + const coordinates = e.features[0].geometry.coordinates.slice() + // const description = ` + //
+ //
+ // ${e.features[0].properties.type === 'user' ? 'Benutzer' : 'Gruppe'}: ${e.features[0].properties.name} + //
+ //
+ // ` + const description = e.features[0].properties.name + + // Ensure that if the map is zoomed out such that multiple + // copies of the feature are visible, the popup appears + // over the copy being pointed to. + while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) { + coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360 + } + + // Populate the popup and set its coordinates + // based on the feature found. + this.markers.popup.setLngLat(coordinates).setHTML(description).addTo(this.map) + + this.markers.popupIsVisible = true + } + }) + + // this.map.on('mouseleave', 'markers', () => { + // this.map.getCanvas().style.cursor = '' + // this.markers.popup.remove() + // this.markers.popupIsVisible = false + // }) + + // Wolle: this.map.on('click', (e) => { + // // close old popup first + // if (this.markers.popupIsVisible) { + // this.markers.popup.remove() + // this.markers.popupIsVisible = false + // } + // }) + // load markers this.loadMarkesIconsAndAddMarkers() }, @@ -222,22 +282,6 @@ export default { this.users && this.groups ) { - // add marker for "currentUser" - if (this.currentUserCoordinates) { - this.markers.geoJSON.push({ - type: 'Feature', - properties: { - type: 'the-user', - iconName: 'marker-orange', - iconRotate: 45.0, - title: this.currentUser.name, - }, - geometry: { - type: 'Point', - coordinates: this.currentUserCoordinates, - }, - }) - } // add markers for "users" this.users.forEach((user) => { if (user.id !== this.currentUser.id && user.location) { @@ -247,7 +291,7 @@ export default { type: 'user', iconName: 'marker-blue', iconRotate: 0.0, - title: user.name, + name: user.name, }, geometry: { type: 'Point', @@ -265,7 +309,7 @@ export default { type: 'group', iconName: 'marker-green', iconRotate: 0.0, - title: group.name, + name: group.name, }, geometry: { type: 'Point', @@ -274,6 +318,22 @@ export default { }) } }) + // add marker for "currentUser" + if (this.currentUserCoordinates) { + this.markers.geoJSON.push({ + type: 'Feature', + properties: { + type: 'the-user', + iconName: 'marker-orange', + iconRotate: 45.0, + name: this.currentUser.name, + }, + geometry: { + type: 'Point', + coordinates: this.currentUserCoordinates, + }, + }) + } this.markers.isGeoJSON = true } @@ -296,11 +356,11 @@ export default { 'icon-allow-overlap': true, 'icon-size': 1.0, 'icon-rotate': ['get', 'iconRotate'], // get the "icon-rotate" from the source's "iconRotate" property - 'text-field': ['get', 'title'], // get the "text-field" from the source's "title" property - 'text-font': ['Open Sans Semibold', 'Arial Unicode MS Bold'], - 'text-offset': [0, 0], - 'text-anchor': 'top', - 'text-allow-overlap': true, + // 'text-field': ['get', 'name'], // get the "text-field" from the source's "name" property + // 'text-font': ['Open Sans Semibold', 'Arial Unicode MS Bold'], + // 'text-offset': [0, 0], + // 'text-anchor': 'top', + // 'text-allow-overlap': true, }, })