Source: interactions/draw.js

let ol = require('openlayers');
let DrawResult = require('./drawResult');

class Draw {
   constructor(params) {
      let interaction = new ol.interaction.Draw(params);
      this.interaction = interaction;
      this.layerId = params.layerId;
      this.id = params.layerId;
      this.fields = params.fields;
      this.type = "draw";
      this.events={};

      this.initEvents(params);
   }

   initEvents(params) {
      let self = this;
      let layerId = self.layerId;
      let template = params.template;
      let source = params.dataSource;

      // закончено рисование на слое
      self.interaction.on("drawend", (data) => {

         let actionResult = new DrawResult({
            feature: data.feature,
            target: data.target,
            layerId: layerId
         });

         if (source) {
            let feature = data.feature;
            if (self.fields) {
               let fields = Object.assign({}, self.fields.getObject());
               delete fields["geometry"];
               delete fields["geom"];

               for (let key in fields) {
                  feature.set(fields[key].name, undefined);
               }
            }
            if (template) {
               for (let key in template) {
                  feature.set(key, template[key]);
               }
            }
            feature.set("__SAVED__", false);
            source.addFeature(feature);
         }

         if (params.func) params.func(actionResult);
      })
   }

    /**
     * Подписка на события
     * @param eventName
     * @param listener
     */
    on(eventName, listener) {
        let self = this;
        let eventStore = self.events;
        eventStore[eventName] = listener;
    }

    /**
     * Выключение подписки на событие
     * @param eventName
     */
    off(eventName) {
        let self = this;
        let eventStore = self.events;
        if (eventStore[eventName]) delete eventStore[eventName];
    }

    /**
     * Инициация события с контекстом
     * @param eventName
     * @param context
     */
    emit(eventName, context) {
        let self = this;
        let eventStore = self.events;
        let listener = eventStore[eventName];
        if (listener && typeof listener === "function") {
            listener(context);
        }
    }
}

module.exports = Draw;