/** * Created by gavorhes on 11/3/2015. */ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var mapInteractionBase_1 = require("./mapInteractionBase"); var provide_1 = require("../util/provide"); var ol = require("custom-ol"); var $ = require("jquery"); var nm = provide_1.default('olHelpers'); var FeatureLayerProperties = (function () { /** * * @param feature the feature * @param layer - the layer in the popup * @param layerIndex - index of the layer * @param selectionLayer - the ol selection layer * @param [esriLayerName=undefined] - esri layer name */ function FeatureLayerProperties(feature, layer, layerIndex, selectionLayer, esriLayerName) { this.feature = feature; this.layer = layer; this.layerIndex = layerIndex; this.selectionLayer = selectionLayer; this.popupContent = ''; this.esriLayerName = typeof esriLayerName == 'string' ? esriLayerName : undefined; } Object.defineProperty(FeatureLayerProperties.prototype, "layerName", { get: function () { if (typeof this.esriLayerName == 'string') { return this.esriLayerName; } else { return this.layer.name; } }, enumerable: true, configurable: true }); return FeatureLayerProperties; }()); exports.FeatureLayerProperties = FeatureLayerProperties; /** * map popup class * @augments MapInteractionBase */ var MapPopupCls = (function (_super) { __extends(MapPopupCls, _super); /** * Definition for openlayers style function * @callback olStyleFunction * ¶m feature the openlayers vector feature * $param */ /** * map popup constructor */ function MapPopupCls() { var _this = _super.call(this, 'map popup') || this; _this._arrPopupLayerIds = []; _this._arrPopupLayers = []; // this._arrPopupOlLayers = []; _this._arrPopupContentFunction = []; _this._$popupContainer = undefined; _this._$popupContent = undefined; _this._$popupCloser = undefined; _this._popupOverlay = undefined; _this._selectionLayers = []; _this._selectionLayerLookup = {}; _this._mapClickFunctions = []; //let a = function($jqueryContent){console.log($jqueryContent)}; //this._popupChangedLookup = {'a': a}; _this._popupChangedFunctions = []; _this._esriMapServiceLayers = []; _this._popupOpen = false; _this._popupCoordinate = null; _this._passThroughLayerFeatureArray = []; _this._currentPopupIndex = -1; _this._popupContentLength = 0; return _this; } /** * map popup initialization * @param {ol.Map} theMap - the ol map */ MapPopupCls.prototype.init = function (theMap) { var _this = this; _super.prototype.init.call(this, theMap); var $map; var target = this.map.getTarget(); if (typeof target == 'string') { $map = $('#' + target); } else { $map = $(target); } $map.append('<div class="ol-popup">' + '<span class="ol-popup-closer">X</span>' + '<div class="popup-content"></div>' + '</div>'); this._$popupContainer = $map.find('.ol-popup'); this._$popupContent = $map.find('.popup-content'); this._$popupCloser = $map.find('.ol-popup-closer'); var _ease = function (n) { return ol.easing.inAndOut(n); }; this._popupOverlay = new ol.Overlay({ element: this._$popupContainer[0], autoPan: true, autoPanAnimation: { duration: 250, source: theMap.getView().getCenter(), easing: _ease } }); this._map.addOverlay(this._popupOverlay); this._$popupCloser.click(function (evt) { _this.closePopup(); }); // display popup on click this._map.on('singleclick', function (evt) { _this.closePopup(); _this._popupCoordinate = evt['coordinate']; // esri map service layers if (_this._esriMapServiceLayers.length > 0) { var queryParams = { geometry: evt['coordinate'].join(','), geometryType: 'esriGeometryPoint', layers: 'all', sr: _this._map.getView().getProjection().getCode().split(':')[1], mapExtent: _this._map.getView().calculateExtent(_this._map.getSize()).join(','), imageDisplay: _this._map.getSize().join(',') + ',96', returnGeometry: true, tolerance: 15, f: 'pjson' }; for (var _i = 0, _a = _this._esriMapServiceLayers; _i < _a.length; _i++) { var l = _a[_i]; l.getPopupInfo(queryParams); } } var layerFeatureObjectArray = _this._featuresAtPixel(evt['pixel']); _this._passThroughLayerFeatureArray = []; _this._currentPopupIndex = -1; for (var i = 0; i < layerFeatureObjectArray.length; i++) { var featObj = layerFeatureObjectArray[i]; var props = featObj.feature.getProperties(); var popupContentResponse = _this._arrPopupContentFunction[featObj.layerIndex](props, _this._$popupContent); //skip if return was false if (popupContentResponse === false) { //continue; } else if (typeof popupContentResponse == 'string') { featObj.popupContent = popupContentResponse; _this._passThroughLayerFeatureArray.push(featObj); } else { featObj.selectionLayer.getSource().addFeature(featObj.feature); } } _this._popupContentLength = _this._passThroughLayerFeatureArray.length; _this._currentPopupIndex = -1; var popupHtml = '<div class="ol-popup-nav">'; popupHtml += '<span class="previous-popup ol-popup-nav-arrow">◀</span>'; popupHtml += '<span class="next-popup ol-popup-nav-arrow">▶</span>'; popupHtml += "<span class=\"current-popup-item-number\" style=\"font-weight: bold;\"></span>"; popupHtml += "<span> of </span>"; popupHtml += "<span class=\"popup-content-length\" style=\"font-weight: bold;\">" + _this._popupContentLength + "</span>"; popupHtml += "<span> - </span>"; popupHtml += "<span class=\"current-popup-layer-name\"></span>"; popupHtml += '</div>'; popupHtml += '<div class="ol-popup-inner">'; popupHtml += '</div>'; _this._$popupContent.html(popupHtml); _this._$popupContent.find('.previous-popup').click(function () { if (_this._popupContentLength == 1) { return; } if (_this._currentPopupIndex == 0) { _this._currentPopupIndex = _this._popupContentLength - 1; } else { _this._currentPopupIndex--; } _this._triggerFeatSelect(); }); var nextPopup = _this._$popupContent.find('.next-popup'); nextPopup.click(function () { if (_this._popupContentLength == 1 && _this._currentPopupIndex > -1) { return; } if (_this._currentPopupIndex == _this._popupContentLength - 1) { _this._currentPopupIndex = 0; } else { _this._currentPopupIndex++; } _this._triggerFeatSelect(); }); if (_this._popupContentLength > 0) { nextPopup.trigger('click'); _this._popupOverlay.setPosition(_this._popupCoordinate); _this._$popupContent.scrollTop(0); _this._popupOpen = true; } }); //change mouse cursor when over marker this._map.on('pointermove', function (evt) { if (evt['dragging']) { return; } var pixel = _this.map.getEventPixel(evt['originalEvent']); var hit = false; _this.map.forEachLayerAtPixel(pixel, function (lyr) { if (hit) { return; } for (var _i = 0, _a = _this._arrPopupLayers; _i < _a.length; _i++) { var vLyr = _a[_i]; if (vLyr.olLayer == lyr) { hit = true; break; } } }); var mapElement = _this.map.getTargetElement(); mapElement.style.cursor = hit ? 'pointer' : ''; }); }; /** * helper to select features * @private */ MapPopupCls.prototype._triggerFeatSelect = function () { var $currentPopupItemNumber = this._$popupContent.find('.current-popup-item-number'); var $innerPopup = this._$popupContent.find('.ol-popup-inner'); var $layerNameSpan = this._$popupContent.find('.current-popup-layer-name'); this.clearSelection(); var lyrFeatObj = this._passThroughLayerFeatureArray[this._currentPopupIndex]; $currentPopupItemNumber.html((this._currentPopupIndex + 1).toFixed()); $layerNameSpan.html(lyrFeatObj.layerName); $innerPopup.html(lyrFeatObj.popupContent); lyrFeatObj.selectionLayer.getSource().addFeature(lyrFeatObj.feature); for (var _i = 0, _a = this._popupChangedFunctions; _i < _a.length; _i++) { var f = _a[_i]; f(this._$popupContent); } }; /** * * @param feature - the ol feature * @param {LayerEsriMapServer} lyr - the map server layer * @param {string} popupContent - popup content * @param {string} esriName - esri layer name */ MapPopupCls.prototype.addMapServicePopupContent = function (feature, lyr, popupContent, esriName) { var featLayerObject = new FeatureLayerProperties(feature, lyr, this._popupContentLength, this._selectionLayerLookup[lyr.id], esriName); featLayerObject.popupContent = popupContent; this._passThroughLayerFeatureArray.push(featLayerObject); this._popupContentLength++; $('.popup-content-length').html(this._popupContentLength.toFixed()); if (!this._popupOpen) { this._$popupContent.find('.next-popup').trigger('click'); this._popupOverlay.setPosition(this._popupCoordinate); this._$popupContent.scrollTop(0); this._popupOpen = true; } }; /** * * @param pixel - the ol pixel * @returns feature layer properties * @private */ MapPopupCls.prototype._featuresAtPixel = function (pixel) { var _this = this; var layerFeatureObjectArray = []; this.map.forEachFeatureAtPixel(pixel, function (feature, layer) { var hasLyr = false; var j; var lyr = null; for (j = 0; j < _this._arrPopupLayers.length; j++) { lyr = _this._arrPopupLayers[j]; if (lyr.olLayer === layer) { hasLyr = true; break; } } if (hasLyr) { layerFeatureObjectArray.push(new FeatureLayerProperties(feature, lyr, j, _this._selectionLayers[j])); } }); return layerFeatureObjectArray; }; MapPopupCls.prototype.closePopup = function () { this._checkInit(); this._popupOpen = false; this._popupOverlay.setPosition(undefined); this._$popupCloser[0].blur(); this.clearSelection(); this._$popupContent.html(''); return false; }; ; /** * * @param chgFunction - popup change function */ MapPopupCls.prototype.addPopupChangedFunction = function (chgFunction) { this._popupChangedFunctions.push(chgFunction); }; /** * * @param {LayerBase|*} lyr - the layer being acted on * @param {object} [selectionStyle={}] the selection style configuration * @param {string} [selectionStyle.color=rgba(255,170,0,0.5)] the selection color * @param {number} [selectionStyle.width=10] the selection width for linear features * @param {object|function} [selectionStyle.olStyle=undefined] an openlayers style object or function * @returns the new selection layer * @private */ MapPopupCls.prototype._addPopupLayer = function (lyr, selectionStyle) { this._checkInit(); selectionStyle = selectionStyle || {}; selectionStyle.color = selectionStyle.color || 'rgba(255,170,0,0.5)'; selectionStyle.width = selectionStyle.width || 10; var theStyle; if (selectionStyle.olStyle) { theStyle = selectionStyle.olStyle; } else { theStyle = new ol.style.Style({ stroke: new ol.style.Stroke({ color: selectionStyle.color, width: selectionStyle.width }), image: new ol.style.Circle({ radius: 7, fill: new ol.style.Fill({ color: selectionStyle.color }), stroke: new ol.style.Stroke({ color: selectionStyle.color, width: 1 }) }), fill: new ol.style.Fill({ color: selectionStyle.color }) }); } var selectionLayer = new ol.layer.Vector({ source: new ol.source.Vector(), style: theStyle }); selectionLayer.setZIndex(100); this._selectionLayers.push(selectionLayer); this._selectionLayerLookup[lyr.id] = selectionLayer; this.map.addLayer(selectionLayer); return selectionLayer; }; /** * Add popup to the map * @param {LayerBase|*} lyr The layer that the popup with act on * @param {popupCallback} popupContentFunction - popup content function that makes popup info * @param {object} [selectionStyle={}] the selection style configuration * @param {string} [selectionStyle.color=rgba(255,170,0,0.5)] the selection color * @param {number} [selectionStyle.width=10] the selection width for linear features * @param {object|function} [selectionStyle.olStyle=undefined] an openlayers style object or function * @returns {object} a reference to the ol selection layer */ MapPopupCls.prototype.addVectorPopup = function (lyr, popupContentFunction, selectionStyle) { var selectionLayer = this._addPopupLayer(lyr, selectionStyle); this._arrPopupLayerIds.push(lyr.id); this._arrPopupLayers.push(lyr); // this._arrPopupOlLayers.push(lyr.olLayer); this._arrPopupContentFunction.push(popupContentFunction); return selectionLayer; }; ; /** * * @param {LayerBase} lyr - layer */ MapPopupCls.prototype.removeVectorPopup = function (lyr) { var idx = this._arrPopupLayerIds.indexOf(lyr.id); if (idx > -1) { this._arrPopupLayerIds.splice(idx, 1); this._arrPopupLayers.splice(idx, 1); // this._arrPopupOlLayers.splice(idx, 1); this._arrPopupContentFunction.splice(idx, 1); this._selectionLayers.splice(idx, 1); delete this._selectionLayerLookup[lyr.id]; } }; /** * * @param {LayerEsriMapServer} lyr - map server layer * @param {object} [selectionStyle={}] the selection style configuration * @param {string} [selectionStyle.color=rgba(255,170,0,0.5)] the selection color * @param {number} [selectionStyle.width=10] the selection width for linear features * @param {object|function} [selectionStyle.olStyle=undefined] an openlayers style object or function * @returns {object} a reference to the ol selection layer */ MapPopupCls.prototype.addMapServicePopup = function (lyr, selectionStyle) { var selectionLayer = this._addPopupLayer(lyr, selectionStyle); this._esriMapServiceLayers.push(lyr); return selectionLayer; }; MapPopupCls.prototype.clearSelection = function () { this._checkInit(); for (var i = 0; i < this._selectionLayers.length; i++) { this._selectionLayers[i].getSource().clear(); } for (var _i = 0, _a = this._mapClickFunctions; _i < _a.length; _i++) { var f = _a[_i]; f(); } }; ; /** * Add a function to be called when the map is clicked but before any popups are implemented * @param {function} func - the map click function */ MapPopupCls.prototype.addMapClickFunction = function (func) { this._mapClickFunctions.push(func); }; return MapPopupCls; }(mapInteractionBase_1.default)); exports.MapPopupCls = MapPopupCls; nm.MapPopupCls = MapPopupCls; exports.default = MapPopupCls; //# sourceMappingURL=mapPopupCls.js.map