UI: Map widgets - improve markers dragging - prevent click actions and popup open while dragging marker.

This commit is contained in:
Igor Kulikov 2022-01-25 10:52:13 +02:00
parent d416103e74
commit 362ca32407
2 changed files with 38 additions and 7 deletions

View File

@ -41,6 +41,22 @@ export function createTooltip(target: L.Layer,
return popup;
}
export function disablePopup(target: L.Layer) {
if (target.isPopupOpen()) {
target.closePopup();
}
target.unbindPopup();
target.off('popupopen');
}
export function enablePopup(target: L.Layer, popup: L.Popup,
settings: MarkerSettings | PolylineSettings | PolygonSettings, datasource: Datasource) {
target.bindPopup(popup);
target.on('popupopen', () => {
bindPopupActions(popup, settings, datasource);
});
}
export function bindPopupActions(popup: L.Popup, settings: MarkerSettings | PolylineSettings | PolygonSettings,
datasource: Datasource) {
const actions = popup.getElement().getElementsByClassName('tb-custom-action');

View File

@ -23,7 +23,7 @@ import {
MarkerSettings,
UnitedMapSettings
} from './map-models';
import { bindPopupActions, createTooltip, } from './maps-utils';
import { bindPopupActions, createTooltip, disablePopup, enablePopup, } from './maps-utils';
import { aspectCache, fillPattern, parseWithTranslation, processPattern, safeExecute } from './common-maps-utils';
import tinycolor from 'tinycolor2';
import { isDefined, isDefinedAndNotNull } from '@core/utils';
@ -37,6 +37,7 @@ export class Marker {
tooltip: L.Popup;
data: FormattedData;
dataSources: FormattedData[];
isDragging = false;
constructor(private map: LeafletMap, private location: L.LatLng, public settings: UnitedMapSettings,
data?: FormattedData, dataSources?, onDragendListener?) {
@ -64,6 +65,7 @@ export class Marker {
}
if (this.settings.markerClick) {
if (!this.isDragging) {
this.leafletMarker.on('click', (event: LeafletMouseEvent) => {
for (const action in this.settings.markerClick) {
if (typeof (this.settings.markerClick[action]) === 'function') {
@ -72,9 +74,22 @@ export class Marker {
}
});
}
}
if (settings.draggableMarker && onDragendListener) {
this.leafletMarker.on('pm:dragend', (e) => onDragendListener(e, this.data));
this.leafletMarker.on('pm:dragend', (e) => {
onDragendListener(e, this.data);
this.isDragging = false;
if (settings.showTooltip && settings.showTooltipAction === 'click') {
enablePopup(this.leafletMarker, this.tooltip, settings, this.data.$datasource);
}
});
this.leafletMarker.on('pm:dragstart', (e) => {
this.isDragging = true;
if (settings.showTooltip && settings.showTooltipAction === 'click') {
disablePopup(this.leafletMarker);
}
});
}
}