Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
e1dbbf8
bootstrap
thomasneirynck Feb 17, 2017
96d5ba7
enable WMS
thomasneirynck Feb 21, 2017
0900e9a
extract choropleth in separate class
thomasneirynck Feb 21, 2017
35dda8a
isolate geohash layer in separate module
thomasneirynck Feb 21, 2017
58f7263
add desaturation flag / more efficient refreshing of baselayer
thomasneirynck Feb 22, 2017
b053d96
add remaining map types
thomasneirynck Feb 22, 2017
386114a
add fit control
thomasneirynck Feb 24, 2017
0b0e7c0
add legend control
thomasneirynck Feb 27, 2017
8519ad5
add tooltip flag
thomasneirynck Feb 28, 2017
295bf51
some simplification
thomasneirynck Feb 28, 2017
2a14e1e
fix choropleth
thomasneirynck Feb 28, 2017
7813a9f
do not request manifest on route-change, instead call it when creatin…
thomasneirynck Feb 28, 2017
6a1eed1
fix typo
thomasneirynck Feb 28, 2017
578e01b
add rendercomplete
thomasneirynck Feb 28, 2017
bc81b16
initial review
thomasneirynck Feb 28, 2017
9083d5e
fix resizing
thomasneirynck Feb 28, 2017
e0b42f9
add tooltips
thomasneirynck Mar 1, 2017
5ea4d7e
add legend
thomasneirynck Mar 1, 2017
a32e33f
fix linting errors
thomasneirynck Mar 1, 2017
81c8fa6
add rendercomplete
thomasneirynck Mar 1, 2017
9987cd8
fix package json
thomasneirynck Mar 1, 2017
c89639f
make 0 the default
thomasneirynck Mar 3, 2017
7e5a77e
disable multi tile-map support
thomasneirynck Mar 3, 2017
19d6243
use the ResizeChecker
thomasneirynck Mar 3, 2017
76aff13
use yml for layer config
thomasneirynck Mar 5, 2017
0375354
use default config
thomasneirynck Mar 5, 2017
8ff0758
persist ui state
thomasneirynck Mar 5, 2017
759a360
add default controls
thomasneirynck Mar 5, 2017
8b6d7b3
use kui UX
thomasneirynck Mar 5, 2017
9b81cdc
use geocentroid as new default
thomasneirynck Mar 6, 2017
3016694
add support for states
thomasneirynck Mar 6, 2017
3008db8
fix config loading
thomasneirynck Mar 6, 2017
a7f24dd
extract classes in separate files
thomasneirynck Mar 17, 2017
88a97f8
do not hardcode map zoom level to calculate max zoom
thomasneirynck Mar 17, 2017
cfdb742
resolve style issues
thomasneirynck Mar 17, 2017
c3b87a3
fix rebase issues
thomasneirynck Mar 20, 2017
a7af00e
add default data files
thomasneirynck Mar 21, 2017
c057466
remove unused LOC
thomasneirynck Mar 21, 2017
e0f57fa
dedupe ui-state persistence
thomasneirynck Mar 21, 2017
31b429d
filter icons on bound
thomasneirynck Mar 23, 2017
9c4e843
remove listeners on layer removal;
thomasneirynck Mar 23, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/core_plugins/choropleth/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export default function (kibana) {

return new kibana.Plugin({
uiExports: {
visTypes: ['plugins/choropleth/choropleth_vis']
}
});

}
4 changes: 4 additions & 0 deletions src/core_plugins/choropleth/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "choropleth",
"version": "kibana"
}
7 changes: 7 additions & 0 deletions src/core_plugins/choropleth/public/choropleth.less
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.choropleth-vis {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
3 changes: 3 additions & 0 deletions src/core_plugins/choropleth/public/choropleth_controller.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div ng-controller="KbnChoroplethController" class="choropleth-vis">

</div>
141 changes: 141 additions & 0 deletions src/core_plugins/choropleth/public/choropleth_controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
import uiModules from 'ui/modules';
import 'plugins/kbn_vislib_vis_types/controls/vislib_basic_options';
import _ from 'lodash';
import AggConfigResult from 'ui/vis/agg_config_result';
import KibanaMap from 'ui/vis_maps/kibana_map';
import FilterBarFilterBarClickHandlerProvider from 'ui/filter_bar/filter_bar_click_handler';
import ChoroplethLayer from './choropleth_layer';
import colorramps from 'ui/vislib/components/color/colormaps';
import AggResponsePointSeriesTooltipFormatterProvider from './tooltip_formatter';
import { ResizeCheckerProvider } from 'ui/resize_checker';

const module = uiModules.get('kibana/choropleth', ['kibana']);
module.controller('KbnChoroplethController', function ($scope, $element, Private, getAppState, tilemapSettings, vectormapsConfig, config) {

const filterBarClickHandler = Private(FilterBarFilterBarClickHandlerProvider);
const tooltipFormatter = Private(AggResponsePointSeriesTooltipFormatterProvider);
const ResizeChecker = Private(ResizeCheckerProvider);

const resizeChecker = new ResizeChecker($element);
const containerNode = $element[0];

let kibanaMap = null;
resizeChecker.on('resize', () => {
if (kibanaMap) {
kibanaMap.resize();
}
});
let choroplethLayer = null;

async function makeKibanaMap() {

if (!tilemapSettings.isInitialized()) {
await tilemapSettings.loadSettings();
}

const minMaxZoom = tilemapSettings.getMinMaxZoom(false);
kibanaMap = new KibanaMap(containerNode, minMaxZoom);
const url = tilemapSettings.getUrl();
const options = tilemapSettings.getTMSOptions();
kibanaMap.setBaseLayer({ baseLayerType: 'tms', options: { url, ...options } });
kibanaMap.addLegendControl();
kibanaMap.addFitControl();
kibanaMap.persistUiStateForVisualization($scope.vis);
}

const kibanaMapReady = makeKibanaMap();
$scope.$watch('esResponse', async function (response) {

kibanaMapReady.then(() => {
const metricsAgg = _.first($scope.vis.aggs.bySchemaName.metric);
const termAggId = _.first(_.pluck($scope.vis.aggs.bySchemaName.segment, 'id'));
let results;
if (!response || !response.aggregations) {
results = [];
} else {
const buckets = response.aggregations[termAggId].buckets;
results = buckets.map((bucket) => {
return {
term: bucket.key,
value: getValue(metricsAgg, bucket)
};
});
}

if (!$scope.vis.params.selectedJoinField) {
$scope.vis.params.selectedJoinField = $scope.vis.params.selectedLayer.fields[0];
}
updateChoroplethLayer($scope.vis.params.selectedLayer.url);
choroplethLayer.setMetrics(results, metricsAgg);
if ($scope.vis.aggs.bySchemaName.segment && $scope.vis.aggs.bySchemaName.segment[0]) {
const fieldName = $scope.vis.aggs.bySchemaName.segment[0].params.field.name;
choroplethLayer.setTooltipFormatter(tooltipFormatter, metricsAgg, fieldName);
} else {
choroplethLayer.setTooltipFormatter(tooltipFormatter, metricsAgg, null);
}

kibanaMap.useUiStateFromVisualization($scope.vis);
kibanaMap.resize();
$element.trigger('renderComplete');
});
});

$scope.$watch('vis.params', (visParams) => {
kibanaMapReady.then(() => {
if (!visParams.selectedJoinField) {
visParams.selectedJoinField = visParams.selectedLayer.fields[0];
}

updateChoroplethLayer(visParams.selectedLayer.url);
choroplethLayer.setJoinField(visParams.selectedJoinField.name);
choroplethLayer.setColorRamp(colorramps[visParams.colorSchema]);

kibanaMap.setShowTooltip(visParams.addTooltip);
kibanaMap.setLegendPosition(visParams.legendPosition);
kibanaMap.useUiStateFromVisualization($scope.vis);
kibanaMap.resize();
$element.trigger('renderComplete');
});
});

function updateChoroplethLayer(url) {

if (choroplethLayer && choroplethLayer.equalsGeoJsonUrl(url)) {
return;
}
kibanaMap.removeLayer(choroplethLayer);

const previousMetrics = choroplethLayer ? choroplethLayer.getMetrics() : null;
const previousMetricsAgg = choroplethLayer ? choroplethLayer.getMetricsAgg() : null;
choroplethLayer = new ChoroplethLayer(url);
if (previousMetrics && previousMetricsAgg) {
choroplethLayer.setMetrics(previousMetrics, previousMetricsAgg);
}
choroplethLayer.on('select', function (event) {
const appState = getAppState();
const clickHandler = filterBarClickHandler(appState);
const aggs = $scope.vis.aggs.getResponseAggs();
const aggConfigResult = new AggConfigResult(aggs[0], false, event, event);
clickHandler({ point: { aggConfigResult: aggConfigResult } });
});
kibanaMap.addLayer(choroplethLayer);
}

});





function getValue(metricsAgg, bucket) {
let size = metricsAgg.getValue(bucket);
if (typeof size !== 'number' || isNaN(size)) {
try {
size = bucket[1].values[0].value;//lift out first value (e.g. median aggregations return as array)
} catch (e) {
size = 1;//punt
}
}
return size;
}

Loading