- the tooltip shows instantly when hovering a POI icon with the mouse cursor - the content is the same as for the popup, except for the action button (“delete”) as the button isn't reachable by the mouse (the tooltip disappears when the mouse cursor leaves the icon area) - (maybe we should add a hint to the tooltip, e.g. “Click icon for actions” (TBD)) - the tooltip is only attached to POI icons on devices without a touch interface, i. e. when `BR.Browser.touch` is `false` - the tooltip is removed when the icon is clicked, otherwise tooltip and popup would be visible at the same time - the tooltip is enabled again when the popup is closed
158 lines
4.7 KiB
JavaScript
158 lines
4.7 KiB
JavaScript
BR.PoiMarkers = L.Control.extend({
|
|
markersLayer: null,
|
|
circlego: null,
|
|
|
|
options: {
|
|
shortcut: {
|
|
draw: {
|
|
enable: 80, // char code for 'p'
|
|
disable: 27, // char code for 'ESC'
|
|
},
|
|
},
|
|
},
|
|
initialize: function (routing) {
|
|
this.routing = routing;
|
|
this.circlego = null;
|
|
},
|
|
|
|
onAdd: function (map) {
|
|
var self = this;
|
|
|
|
this.map = map;
|
|
this.markersLayer = L.layerGroup([]).addTo(map);
|
|
|
|
this.drawButton = L.easyButton({
|
|
states: [
|
|
{
|
|
stateName: 'activate-poi',
|
|
icon: 'fa-hand-o-right',
|
|
onClick: function () {
|
|
self.draw(true);
|
|
},
|
|
title: i18next.t('keyboard.generic-shortcut', { action: '$t(map.draw-poi-start)', key: 'P' }),
|
|
},
|
|
{
|
|
stateName: 'deactivate-poi',
|
|
icon: 'fa-hand-o-right active',
|
|
onClick: function () {
|
|
self.draw(false);
|
|
},
|
|
title: i18next.t('keyboard.generic-shortcut', {
|
|
action: '$t(map.draw-poi-stop)',
|
|
key: '$t(keyboard.escape)',
|
|
}),
|
|
},
|
|
],
|
|
}).addTo(map);
|
|
|
|
map.on('routing:draw-start', function () {
|
|
self.draw(false);
|
|
});
|
|
|
|
L.DomEvent.addListener(document, 'keydown', this._keydownListener, this);
|
|
|
|
var container = new L.DomUtil.create('div');
|
|
return container;
|
|
},
|
|
|
|
draw: function (enable) {
|
|
this.drawButton.state(enable ? 'deactivate-poi' : 'activate-poi');
|
|
if (enable) {
|
|
this.routing.draw(false);
|
|
if (this.circlego) this.circlego.draw(false);
|
|
this.map.on('click', this.onMapClick, this);
|
|
L.DomUtil.addClass(this.map.getContainer(), 'pois-draw-enabled');
|
|
} else {
|
|
this.map.off('click', this.onMapClick, this);
|
|
L.DomUtil.removeClass(this.map.getContainer(), 'pois-draw-enabled');
|
|
}
|
|
},
|
|
|
|
_keydownListener: function (e) {
|
|
if (!BR.Util.keyboardShortcutsAllowed(e)) {
|
|
return;
|
|
}
|
|
if (e.keyCode === this.options.shortcut.draw.disable) {
|
|
this.draw(false);
|
|
} else if (e.keyCode === this.options.shortcut.draw.enable) {
|
|
this.draw(true);
|
|
}
|
|
},
|
|
|
|
onMapClick: function (e) {
|
|
var self = this;
|
|
bootbox.prompt({
|
|
title: i18next.t('map.enter-poi-name'),
|
|
callback: function (result) {
|
|
if (result !== null) {
|
|
self.addMarker(e.latlng, result);
|
|
}
|
|
},
|
|
});
|
|
},
|
|
|
|
addMarker: function (latlng, name) {
|
|
var icon = L.VectorMarkers.icon({
|
|
icon: 'star',
|
|
markerColor: BR.conf.markerColors.poi,
|
|
});
|
|
|
|
var content = BR.Util.sanitizeHTMLContent(name);
|
|
var contentWithAction =
|
|
'<p>' +
|
|
content +
|
|
'</p>' +
|
|
'<p><button id="remove-poi-marker" class="btn btn-secondary"><i class="fa fa-trash"></i></button></p>';
|
|
|
|
var self = this;
|
|
var marker = L.marker(latlng, { icon: icon, draggable: true, name: name })
|
|
.bindPopup(contentWithAction)
|
|
.on('dragend', function () {
|
|
self.fire('update');
|
|
})
|
|
.on('popupopen', function () {
|
|
this.unbindTooltip();
|
|
$('#remove-poi-marker').on('click', function (e) {
|
|
self.markersLayer.removeLayer(marker);
|
|
e.preventDefault();
|
|
self.fire('update');
|
|
});
|
|
})
|
|
.on('popupclose', function () {
|
|
if (false === BR.Browser.touch) {
|
|
this.bindTooltip(content);
|
|
}
|
|
})
|
|
.addTo(this.markersLayer);
|
|
|
|
if (false === BR.Browser.touch) {
|
|
marker.bindTooltip(content);
|
|
}
|
|
},
|
|
|
|
clear: function () {
|
|
this.markersLayer.clearLayers();
|
|
},
|
|
|
|
setMarkers: function (latLngNames) {
|
|
this.clear();
|
|
|
|
if (!latLngNames) return;
|
|
|
|
for (var i = 0; i < latLngNames.length; i++) {
|
|
var r = latLngNames[i];
|
|
this.addMarker(r.latlng, r.name);
|
|
}
|
|
},
|
|
|
|
getMarkers: function () {
|
|
return this.markersLayer.getLayers().map(function (it) {
|
|
return {
|
|
latlng: it.getLatLng(),
|
|
name: it.options.name,
|
|
};
|
|
});
|
|
},
|
|
});
|
|
|
|
BR.PoiMarkers.include(L.Evented.prototype);
|