@progress/kendo-charts
Version:
Kendo UI platform-independent Charts library
382 lines (302 loc) • 10.8 kB
JavaScript
import {
Class,
addClass,
isArray,
getter,
deepExtend,
setDefaultOptions,
renderIcon,
on,
off,
} from '../../common';
import { Layer } from './layer';
import { Location } from '../location';
import {
proxy,
toHyphens,
toPixels,
convertToHtml
} from '../utils';
import TemplateService from '../../services/template-service';
var CLICK = "click";
var MOUSE_ENTER = "mouseenter";
var MOUSE_LEAVE = "mouseleave";
var extend = Object.assign;
var MARKER_CLASS_NAME = "k-marker";
var MARKER_CLASS = "." + MARKER_CLASS_NAME;
export var MarkerLayer = (function (Layer) {
function MarkerLayer(map, options) {
Layer.call(this, map, options);
this._markerClickHandler = proxy(this._markerClick, this);
on(this.element, CLICK, MARKER_CLASS, this._markerClickHandler);
this.items = [];
this._load(this._readData());
}
if ( Layer ) MarkerLayer.__proto__ = Layer;
MarkerLayer.prototype = Object.create( Layer && Layer.prototype );
MarkerLayer.prototype.constructor = MarkerLayer;
MarkerLayer.prototype.destroy = function destroy () {
Layer.prototype.destroy.call(this);
off(this.element, CLICK, this._markerClickHandler);
this.clear();
};
MarkerLayer.prototype.add = function add (args) {
var this$1 = this;
if (isArray(args)) {
for (var i = 0; i < args.length; i++) {
this$1._addOne(args[i]);
}
} else {
return this._addOne(args);
}
};
MarkerLayer.prototype.remove = function remove (marker) {
marker.destroy();
var index = (this.items || []).indexOf(marker);
if (index > -1) {
this.items.splice(index, 1);
}
};
MarkerLayer.prototype.clear = function clear () {
var this$1 = this;
for (var i = 0; i < this.items.length; i++) {
this$1.items[i].destroy();
}
this.items = [];
};
MarkerLayer.prototype.update = function update (marker) {
var location = marker.location();
if (location) {
marker.showAt(this.map.locationToView(location));
var args = {
marker: marker,
layer: this
};
this.map.trigger('markerActivate', args);
}
};
MarkerLayer.prototype._reset = function _reset () {
var this$1 = this;
Layer.prototype._reset.call(this);
var items = this.items;
for (var i = 0; i < items.length; i++) {
this$1.update(items[i]);
}
};
MarkerLayer.prototype.bind = function bind (options, dataItem) {
var marker = Marker.create(options, this.options);
marker.dataItem = dataItem;
var args = {
marker: marker,
layer: this
};
var cancelled = this.map.trigger('markerCreated', args);
if (!cancelled) {
this.add(marker);
return marker;
}
};
MarkerLayer.prototype._addOne = function _addOne (arg) {
var marker = Marker.create(arg, this.options);
marker.addTo(this);
return marker;
};
MarkerLayer.prototype._readData = function _readData () {
var data = this.options.data || [];
return data;
};
MarkerLayer.prototype._load = function _load (data) {
var this$1 = this;
this._data = data;
this.clear();
var getLocation = getter(this.options.locationField);
var getTitle = getter(this.options.titleField);
for (var i = 0; i < data.length; i++) {
var dataItem = data[i];
this$1.bind({
location: getLocation(dataItem),
title: getTitle(dataItem)
}, dataItem);
}
};
MarkerLayer.prototype._markerClick = function _markerClick (e) {
var marker = e.currentTarget._kendoNode;
var args = {
layer: this,
layerIndex: this._layerIndex(),
marker: marker,
markerIndex: (this.items || []).indexOf(marker),
originalEvent: e
};
this.map.trigger('markerClick', args);
};
MarkerLayer.prototype._markerMouseEnter = function _markerMouseEnter (e) {
var args = this._createMarkerEventArgs(e);
this.map.trigger("markerMouseEnter", args);
};
MarkerLayer.prototype._markerMouseLeave = function _markerMouseLeave (e) {
var args = this._createMarkerEventArgs(e);
this.map.trigger("markerMouseLeave", args);
};
MarkerLayer.prototype._createMarkerEventArgs = function _createMarkerEventArgs (e) {
var marker = e.marker;
var args = extend({}, {
layer: this,
layerIndex: this._layerIndex(),
marker: marker,
markerIndex: (this.items || []).indexOf(marker)
}, e);
return args;
};
return MarkerLayer;
}(Layer));
setDefaultOptions(MarkerLayer, {
zIndex: 1000,
autoBind: true,
locationField: 'location',
titleField: 'title',
template: ""
});
export var Marker = (function (Class) {
function Marker(options) {
Class.call(this);
this.options = options || {};
}
if ( Class ) Marker.__proto__ = Class;
Marker.prototype = Object.create( Class && Class.prototype );
Marker.prototype.constructor = Marker;
Marker.prototype.destroy = function destroy () {
this.layer = null;
this.unbindEvents();
this.hide();
};
Marker.prototype.addTo = function addTo (parent) {
this.layer = parent.markers || parent;
this.layer.items.push(this);
this.layer.update(this);
};
Marker.prototype.location = function location (value) {
if (value) {
this.options.location = Location.create(value).toArray();
if (this.layer) {
this.layer.update(this);
}
return this;
}
return Location.create(this.options.location);
};
Marker.prototype.showAt = function showAt (point) {
this.render();
this._anchor = { left: Math.round(point.x), top: Math.round(point.y) };
this.element.style.left = toPixels(this._anchor.left);
this.element.style.top = toPixels(this._anchor.top);
};
Marker.prototype.hide = function hide () {
if (this.element) {
this.element.remove();
this.element = null;
}
};
Marker.prototype.bindEvents = function bindEvents () {
if (!this.element) {
return;
}
this._mouseEnterHandler = proxy(this._mouseEnter, this);
on(this.element, MOUSE_ENTER, MARKER_CLASS, this._mouseEnterHandler);
this._mouseLeaveHandler = proxy(this._mouseLeave, this);
on(this.element, MOUSE_LEAVE, MARKER_CLASS, this._mouseLeaveHandler);
};
Marker.prototype.unbindEvents = function unbindEvents () {
if (!this.element) {
return;
}
off(this.element, MOUSE_ENTER, this._mouseEnterHandler);
off(this.element, MOUSE_LEAVE, this._mouseLeaveHandler);
};
Marker.prototype.render = function render () {
if (!this.element) {
var options = this.options;
var layer = this.layer;
var element = document.createElement('span');
addClass(element, MARKER_CLASS_NAME);
if (this.options.template) {
var templateFn = this._compileTemplate(this.options.template);
var templateHtml = templateFn(this.dataItem);
var templateElement = convertToHtml(templateHtml);
element.appendChild(templateElement);
} else if (options.svgIcon) {
renderIcon(element, { icon: options.svgIcon, iconClass: "k-icon-xxl", svgIcons: this.options.icons.svgIcons, type: "svg" });
} else {
var iconOptions = { icon: "map-marker", iconClass: "k-icon-xxl", svgIcons: this.options.icons.svgIcons, type: this.options.icons.type };
if (options.shape) {
if (options.shape === "pinTarget") {
iconOptions.icon = "map-marker-target";
renderIcon(element, iconOptions);
} else if (options.shape === "pin") {
renderIcon(element, iconOptions);
} else {
addClass(element, 'k-icon k-icon-xxl k-i-marker-' + toHyphens(options.shape || 'pin'));
}
} else {
renderIcon(element, iconOptions);
}
}
if (options.title) {
element.setAttribute("title", options.title);
}
var attributes = options.attributes || {};
Object.keys(attributes).forEach(function(key) {
element.setAttribute(key, attributes[key]);
});
element._kendoNode = this;
element.style.zIndex = options.zIndex;
this.element = element;
if (layer) {
layer.element.appendChild(this.element);
}
this.bindEvents();
}
};
Marker.prototype._mouseEnter = function _mouseEnter (e) {
var args = this._createEventArgs(e);
this.layer._markerMouseEnter(args);
this.layer.map._tooltip.show({
top: this._anchor.top - this.element.offsetHeight,
left: this._anchor.left
}, this._tooltipContext());
};
Marker.prototype._tooltipContext = function _tooltipContext () {
return {
type: 'marker',
layerIndex: this.layer._layerIndex(),
className: 'k-map-marker-tooltip',
dataItem: this.dataItem,
title: this.options.title,
location: this.location()
};
};
Marker.prototype._mouseLeave = function _mouseLeave (e) {
var args = this._createEventArgs(e);
this.layer._markerMouseLeave(args);
};
Marker.prototype._createEventArgs = function _createEventArgs (e) {
var args = {
marker: this,
originalEvent: e
};
return args;
};
Marker.prototype._compileTemplate = function _compileTemplate (template) {
return TemplateService.compile(template, {
paramName: "dataItem",
useWithBlock: false
});
};
Marker.create = function create (arg, defaults) {
if (arg instanceof Marker) {
return arg;
}
return new Marker(deepExtend({}, defaults, arg));
};
return Marker;
}(Class));