@spalger/kibana
Version:
Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic
129 lines (111 loc) • 3.35 kB
JavaScript
define(function (require) {
return function TileMapFactory(Private) {
var d3 = require('d3');
var _ = require('lodash');
var $ = require('jquery');
var Chart = Private(require('ui/vislib/visualizations/_chart'));
var TileMapMap = Private(require('ui/vislib/visualizations/_map'));
/**
* Tile Map Visualization: renders maps
*
* @class TileMap
* @constructor
* @extends Chart
* @param handler {Object} Reference to the Handler Class Constructor
* @param chartEl {HTMLElement} HTML element to which the map will be appended
* @param chartData {Object} Elasticsearch query results for this map
*/
_.class(TileMap).inherits(Chart);
function TileMap(handler, chartEl, chartData) {
if (!(this instanceof TileMap)) {
return new TileMap(handler, chartEl, chartData);
}
TileMap.Super.apply(this, arguments);
// track the map objects
this.maps = [];
this._chartData = chartData || {};
_.assign(this, this._chartData);
this._appendGeoExtents();
}
/**
* Draws tile map, called on chart render
*
* @method draw
* @return {Function} - function to add a map to a selection
*/
TileMap.prototype.draw = function () {
var self = this;
// clean up old maps
self.destroy();
return function (selection) {
selection.each(function () {
self._appendMap(this);
});
};
};
/**
* Invalidate the size of the map, so that leaflet will resize to fit.
* then moves to center
*
* @method resizeArea
* @return {undefined}
*/
TileMap.prototype.resizeArea = function () {
this.maps.forEach(function (map) {
map.updateSize();
});
};
/**
* clean up the maps
*
* @method destroy
* @return {undefined}
*/
TileMap.prototype.destroy = function () {
this.maps = this.maps.filter(function (map) {
map.destroy();
});
};
/**
* Adds allmin and allmax properties to geoJson data
*
* @method _appendMap
* @param selection {Object} d3 selection
*/
TileMap.prototype._appendGeoExtents = function () {
// add allmin and allmax to geoJson
var geoMinMax = this.handler.data.getGeoExtents();
this.geoJson.properties.allmin = geoMinMax.min;
this.geoJson.properties.allmax = geoMinMax.max;
};
/**
* Renders map
*
* @method _appendMap
* @param selection {Object} d3 selection
*/
TileMap.prototype._appendMap = function (selection) {
var container = $(selection).addClass('tilemap');
var map = new TileMapMap(container, this._chartData, {
// center: this._attr.mapCenter,
// zoom: this._attr.mapZoom,
events: this.events,
markerType: this._attr.mapType,
tooltipFormatter: this.tooltipFormatter,
valueFormatter: this.valueFormatter,
attr: this._attr
});
// add title for splits
if (this.title) {
map.addTitle(this.title);
}
// add fit to bounds control
if (_.get(this.geoJson, 'features.length') > 0) {
map.addFitControl();
map.addBoundingControl();
}
this.maps.push(map);
};
return TileMap;
};
});