import {VlMapLayerAction} from '/src/vl-map-layer-action.js';
import {VlMapVectorLayer} from '/src/vl-map-vector-layer.js';
import {VlCompositeVectorLayer} from '/node_modules/vl-mapactions/dist/vl-mapactions.js';
/**
* VlMapDrawAction
* @class
* @classdesc De abstracte kaart teken actie component.
*
* @extends VlMapLayerAction
*
* @property {string} [data-vl-snapping] - Attribuut wordt gebruikt om aan te geven dat er bij het tekenen snapping mag gebeuren, hetzij op de laag waarop getekend wordt (indien geen vl-map-wfs-layer(s) als child elementen), hetzij op de meegegeven vl-map-wfs-layers.
* @property {number} [data-vl-snapping-pixel-tolerance=10] - Attribuut om aan te geven binnen de hoeveel pixel van een feature er gesnapped mag worden.
*
* @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-map/releases/latest|Release notes}
* @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-map/issues|Issues}
* @see {@link https://webcomponenten.omgeving.vlaanderen.be/demo/vl-map-draw-actions.html|Demo}
*/
export class VlMapDrawAction extends VlMapLayerAction {
/**
* Zet de functie die wordt uitgevoerd na het uitvoeren van de teken actie
*
* @param {Function} callback functie met volgende argumenten:
* - {ol.Feature} de getekende feature
* - {Function} reject callback zonder argument waarbij de feature terug wordt verwijderd
*/
onDraw(callback) {
this.__callback = callback;
}
get __drawOptions() {
if (this.dataset.vlSnapping !== undefined) {
if (this.__snappingLayers.length == 0) {
return {snapping: true};
} else {
return {
snapping: {
layer: this.__createSnappingLayer(),
pixelTolerance: this.dataset.vlSnappingPixelTolerance || 10,
node: false,
vertex: false,
},
};
}
} else {
return {};
}
}
__createSnappingLayer() {
const snappingLayer = new VlCompositeVectorLayer(this.__snappingLayers.map((layer) => layer._layer), {});
const firstVectorLayer = this.__snappingLayers[0];
snappingLayer.setStyle(firstVectorLayer.style);
firstVectorLayer.addEventListener(VlMapVectorLayer.EVENTS.styleChanged, (event) => {
snappingLayer.setStyle(event.target.style);
});
return snappingLayer;
}
get __snappingLayers() {
return Array.from(this.querySelectorAll('vl-map-wfs-layer'));
}
}