openlayers-8.x-4.x-dev/modules/openlayers_geofield/src/Plugin/Control/Geofield/js/geofieldcontrol.js

modules/openlayers_geofield/src/Plugin/Control/Geofield/js/geofieldcontrol.js
/**
 * OpenLayers Geofield Draw Control.
 * @constructor
 * @extends {ol.control.Control}
 * @param {Object} opt_options Control options
 */
class GeofieldDraw extends ol.control.Control {

  /**
   * @param {Object} [opt_options] Control options.
   */
  constructor(opt_options) {
    var options = opt_options || {};
    const className = options.className || 'ol-geofield';
    
    var element = document.createElement('div');
    
    super({
      element: element,
      target: options.target,
    });

    this.options = options;

    var this_ = this;

    var handleDrawClick_ = function(e) {
      this_.handleDrawClick_(e);
    };
    var handleActionsClick_ = function(e) {
      this_.handleActionsClick_(e);
    };
    var handleOptionsClick_ = function(e) {
      this_.handleOptionsClick_(e);
    };

    var draw = options.draw || {};
    var actions = options.actions || {};
    options = options.options || {};

    var drawElements = new ol.Collection();
    var actionsElements = new ol.Collection();
    var optionsElements = new ol.Collection();

    if (draw.Point) {
      var pointLabel = options.pointLabel || '\u25CF';
      var pointTipLabel = options.pointTipLabel || Drupal.t('Draw a point');
      var pointElement = document.createElement('button');
      pointElement.className = className + '-point';
      pointElement.type = 'button';
      pointElement.draw = 'Point';
      pointElement.title = pointTipLabel;
      pointElement.innerHTML = pointLabel;
      pointElement.addEventListener('click', handleDrawClick_, false);
      drawElements.push(pointElement);
    }

    if (draw.MultiPoint) {
      var multipointLabel = options.multipointLabel || '\u25CF';
      var multipointTipLabel = options.multipointTipLabel || Drupal.t('Draw a multipoint');
      var multipointElement = document.createElement('button');
      multipointElement.className = className + '-multipoint';
      multipointElement.type = 'button';
      multipointElement.draw = 'MultiPoint';
      multipointElement.title = multipointTipLabel;
      multipointElement.innerHTML = multipointLabel;
      multipointElement.addEventListener('click', handleDrawClick_, false);
      drawElements.push(multipointElement);
    }

    if (draw.LineString) {
      var linestringLabel = options.pointLabel || '\u2500';
      var linestringTipLabel = options.pointTipLabel || Drupal.t('Draw a linestring, hold [shift] for free hand.');
      var linestringElement = document.createElement('button');
      linestringElement.className = className + '-linestring';
      linestringElement.type = 'button';
      linestringElement.draw = 'LineString';
      linestringElement.title = linestringTipLabel;
      linestringElement.innerHTML = linestringLabel;
      linestringElement.addEventListener('click', handleDrawClick_, false);
      drawElements.push(linestringElement);
    }

    if (draw.MultiLineString) {
      var multilinestringLabel = options.pointLabel || '\u2500';
      var multilinestringTipLabel = options.pointTipLabel || Drupal.t('Draw a multilinestring, hold [shift] for free hand.');
      var multilinestringElement = document.createElement('button');
      multilinestringElement.className = className + '-multilinestring';
      multilinestringElement.type = 'button';
      multilinestringElement.draw = 'MultiLineString';
      multilinestringElement.title = multilinestringTipLabel;
      multilinestringElement.innerHTML = multilinestringLabel;
      multilinestringElement.addEventListener('click', handleDrawClick_, false);
      drawElements.push(multilinestringElement);
    }

    if (draw.Triangle) {
      var triangleLabel = options.triangleLabel || '\u25B3';
      var triangleTipLabel = options.triangleTipLabel || Drupal.t('Draw a triangle');
      var triangleElement = document.createElement('button');
      triangleElement.className = className + '-triangle';
      triangleElement.type = 'button';
      triangleElement.draw = 'Triangle';
      triangleElement.title = triangleTipLabel;
      triangleElement.innerHTML = triangleLabel;
      triangleElement.addEventListener('click', handleDrawClick_, false);
      drawElements.push(triangleElement);
    }

    if (draw.Square) {
      var squareLabel = options.squareLabel || '\u25FB';
      var squareTipLabel = options.squareTipLabel || Drupal.t('Draw a square');
      var squareElement = document.createElement('button');
      squareElement.className = className + '-square';
      squareElement.type = 'button';
      squareElement.draw = 'Square';
      squareElement.title = squareTipLabel;
      squareElement.innerHTML = squareLabel;
      squareElement.addEventListener('click', handleDrawClick_, false);
      drawElements.push(squareElement);
    }

    if (draw.Box) {
      var boxLabel = options.boxLabel || '\u25AF';
      var boxTipLabel = options.boxTipLabel || Drupal.t('Draw a box');
      var boxElement = document.createElement('button');
      boxElement.className = className + '-box';
      boxElement.type = 'button';
      boxElement.draw = 'Box';
      boxElement.title = boxTipLabel;
      boxElement.innerHTML = boxLabel;
      boxElement.addEventListener('click', handleDrawClick_, false);
      drawElements.push(boxElement);
    }

    if (draw.Circle) {
      var circleLabel = options.circleLabel || '\u25EF';
      var circleTipLabel = options.circleTipLabel || Drupal.t('Draw a circle');
      var circleElement = document.createElement('button');
      circleElement.className = className + '-circle';
      circleElement.type = 'button';
      circleElement.draw = 'Circle';
      circleElement.title = circleTipLabel;
      circleElement.innerHTML = circleLabel;
      circleElement.addEventListener('click', handleDrawClick_, false);
      drawElements.push(circleElement);
    }

    if (draw.Polygon) {
      var polygonLabel = options.polygonLabel || '\u2B1F';
      var polygonTipLabel = options.polygonTipLabel || Drupal.t('Draw a polygon');
      var polygonElement = document.createElement('button');
      polygonElement.className = className + '-polygon';
      polygonElement.type = 'button';
      polygonElement.draw = 'Polygon';
      polygonElement.title = polygonTipLabel;
      polygonElement.innerHTML = polygonLabel;
      polygonElement.addEventListener('click', handleDrawClick_, false);
      drawElements.push(polygonElement);
    }

    if (draw.MultiPolygon) {
      var multipolygonLabel = options.multipolygonLabel || '\u2B1F';
      var multipolygonTipLabel = options.multipolygonTipLabel || Drupal.t('Draw a multipolygon');
      var multipolygonElement = document.createElement('button');
      multipolygonElement.className = className + '-multipolygon';
      multipolygonElement.type = 'button';
      multipolygonElement.draw = 'MultiPolygon';
      multipolygonElement.title = multipolygonTipLabel;
      multipolygonElement.innerHTML = multipolygonLabel;
      multipolygonElement.addEventListener('click', handleDrawClick_, false);
      drawElements.push(multipolygonElement);
    }

    if (actions.Edit) {
      var editLabel = options.editLabel || '\u270D';
      var editTipLabel = options.editTipLabel || Drupal.t('Edit features');
      var editElement = document.createElement('button');
      editElement.className = className + '-edit';
      editElement.type = 'button';
      editElement.action = 'Edit';
      editElement.title = editTipLabel;
      editElement.innerHTML = editLabel;
      editElement.addEventListener('click', handleActionsClick_, false);
      actionsElements.push(editElement);
    }

    if (actions.Move) {
      var moveLabel = options.moveLabel || '\u27A4';
      var moveTipLabel = options.moveTipLabel || Drupal.t('Move features');
      var moveElement = document.createElement('button');
      moveElement.className = className + '-move';
      moveElement.type = 'button';
      moveElement.action = 'Move';
      moveElement.title = moveTipLabel;
      moveElement.innerHTML = moveLabel;
      moveElement.addEventListener('click', handleActionsClick_, false);
      actionsElements.push(moveElement);
    }

    if (actions.Clear) {
      var clearLabel = options.clearLabel || 'X';
      var clearTipLabel = options.clearTipLabel || Drupal.t('Clear features');
      var clearElement = document.createElement('button');
      clearElement.className = className + '-clear';
      clearElement.type = 'button';
      clearElement.action = 'Clear';
      clearElement.title = clearTipLabel;
      clearElement.innerHTML = clearLabel;
      clearElement.addEventListener('click', handleActionsClick_, false);
      actionsElements.push(clearElement);
    }

    if (options.Snap) {
      var snapLabel = options.snapLabel || '\u25CE';
      var snapTipLabel = options.snapTipLabel || Drupal.t('Snap to features');
      var snapElement = document.createElement('button');
      snapElement.className = className + '-snap';
      snapElement.type = 'button';
      snapElement.option = 'Snap';
      snapElement.title = snapTipLabel;
      snapElement.innerHTML = snapLabel;
      snapElement.addEventListener('click', handleOptionsClick_, false);
      optionsElements.push(snapElement);
    }

    var cssClasses = className + ' ' + 'ol-control';

    var drawElement = document.createElement('div');
    drawElement.className = 'draw ol-control-group';
    drawElements.forEach(function(element) {
      drawElement.appendChild(element);
    });

    var actionsElement = document.createElement('div');
    actionsElement.className = 'actions ol-control-group';
    actionsElements.forEach(function(element) {
      actionsElement.appendChild(element);
    });

    var optionsElement = document.createElement('div');
    optionsElement.className = 'options ol-control-group';
    optionsElements.forEach(function(element) {
      optionsElement.appendChild(element);
    });

    var controlsElement = document.createElement('div');
    controlsElement.className = 'ol-geofield-controls';
    controlsElement.appendChild(drawElement);
    controlsElement.appendChild(actionsElement);
    controlsElement.appendChild(optionsElement);

    element.className = cssClasses;
    element.appendChild(controlsElement);
  };

  handleDrawClick_(event) {
    var options = this.options;

    // Disable actions buttons.
    var divs = this.element.getElementsByClassName('actions')[0];
    [].map.call(divs.children, function(element) {
      element.classList.remove('enable');
    });
    delete options.actions;

    // Disable other draw buttons.
    divs = this.element.getElementsByClassName('draw')[0];
    [].map.call(divs.children, function(element) {
      element.classList.remove('enable');
    });
    event.target.classList.toggle('enable');

    if (event.target.classList.contains('enable')) {
      options.draw = event.target.draw;
    } else {
      options.draw = false;
    }

    this.options = options;
    this.element.dispatchEvent(new CustomEvent('change', {'detail': this }));
  };

  handleActionsClick_(event) {
    var options = this.options;

    // Disable draw buttons.
    var divs = this.element.getElementsByClassName('draw')[0];
    [].map.call(divs.children, function(element) {
      element.classList.remove('enable');
    });
    options.draw = false;

    // Disable other action buttons.
    divs = this.element.getElementsByClassName('actions')[0];
    [].map.call(divs.children, function(element) {
      if (event.target !== element) {
        element.classList.remove('enable');
      }
    });
    event.target.classList.toggle('enable');

    if (event.target.classList.contains('enable')) {
      options.actions = options.actions || {};
      options.actions[event.target.action] = true;
    } else {
      options.actions[event.target.action] = false;
    }

    this.options = options;
    this.element.dispatchEvent(new CustomEvent('change', {'detail': this }));
  };

  handleOptionsClick_(event) {
    var options = this.options;
    event.target.classList.toggle('enable');

    if (event.target.classList.contains('enable')) {
      options.options = options.options || {};
      options.options[event.target.option] = true;
    } else {
      options.options[event.target.option] = false;
      event.target.blur();
    }

    this.options = options;
    this.element.dispatchEvent(new CustomEvent('change', {'detail': this }));
  };

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc