diff --git a/dist/partials/editor.html b/dist/partials/editor.html index 2140e0b..b275407 100644 --- a/dist/partials/editor.html +++ b/dist/partials/editor.html @@ -39,6 +39,9 @@
Map Visual Options
+
+ +
Map Data Options
diff --git a/dist/worldmap.js b/dist/worldmap.js index 1210fe7..d58e749 100644 --- a/dist/worldmap.js +++ b/dist/worldmap.js @@ -58,7 +58,7 @@ System.register(['lodash', './libs/leaflet'], function (_export, _context) { var mapCenter = window.L.latLng(parseFloat(this.ctrl.panel.mapCenterLatitude), parseFloat(this.ctrl.panel.mapCenterLongitude)); this.map = window.L.map(this.mapContainer, { worldCopyJump: true, center: mapCenter }).fitWorld().zoomIn(parseInt(this.ctrl.panel.initialZoom, 10)); this.map.panTo(mapCenter); - this.map.scrollWheelZoom.disable(); + this.setMouseWheelZoom(); var selectedTileServer = tileServers[this.ctrl.tileServer]; window.L.tileLayer(selectedTileServer.url, { @@ -244,6 +244,15 @@ System.register(['lodash', './libs/leaflet'], function (_export, _context) { this.legend.removeFrom(this.map); this.legend = null; } + }, { + key: 'setMouseWheelZoom', + value: function setMouseWheelZoom() { + if (!this.ctrl.panel.mouseWheelZoom) { + this.map.scrollWheelZoom.disable(); + } else { + this.map.scrollWheelZoom.enable(); + } + } }, { key: 'addCircles', value: function addCircles(circles) { diff --git a/dist/worldmap.js.map b/dist/worldmap.js.map index 7a78bd4..64d7d4e 100644 --- a/dist/worldmap.js.map +++ b/dist/worldmap.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/worldmap.js"],"names":["_","L","tileServers","url","attribution","subdomains","WorldMap","ctrl","mapContainer","circles","createMap","mapCenter","window","latLng","parseFloat","panel","mapCenterLatitude","mapCenterLongitude","map","worldCopyJump","center","fitWorld","zoomIn","parseInt","initialZoom","panTo","scrollWheelZoom","disable","selectedTileServer","tileServer","tileLayer","maxZoom","reuseTiles","detectRetina","addTo","legend","control","position","onAdd","_div","DomUtil","create","update","thresholds","data","legendHtml","colors","index","length","innerHTML","locations","sort","dataPoints","isEqual","filter","o","hideEmpty","isNil","value","hideZero","circlesLayer","clearLayers","removeCircles","filterEmptyAndZeroValues","needToRedrawCircles","clearCircles","createCircles","updateCircles","forEach","dataPoint","locationName","push","createCircle","addCircles","circle","find","cir","options","location","key","setRadius","calcCircleSize","setStyle","color","getColor","fillColor","fillOpacity","unbindPopup","createPopup","valueRounded","circleMarker","locationLatitude","locationLongitude","radius","dataPointValue","circleMinSize","circleMaxSize","valueRange","dataFactor","lowestValue","circleSizeRange","unit","unitSingular","unitPlural","label","trim","bindPopup","point","stickyLabels","on","onMouseOver","evt","layer","target","bringToFront","openPopup","onMouseOut","closePopup","first","invalidateSize","mapCenterMoved","removeFrom","layerGroup","removeLayer","zoomFactor","setZoom","removeLegend","remove"],"mappings":"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","file":"worldmap.js","sourcesContent":["import _ from 'lodash';\n/* eslint-disable id-length, no-unused-vars */\nimport L from './libs/leaflet';\n/* eslint-disable id-length, no-unused-vars */\n\nconst tileServers = {\n 'CartoDB Positron': { url: 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png', attribution: '© OpenStreetMap © CartoDB', subdomains: 'abcd'},\n 'CartoDB Dark': {url: 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png', attribution: '© OpenStreetMap © CartoDB', subdomains: 'abcd'}\n};\n\nexport default class WorldMap {\n constructor(ctrl, mapContainer) {\n this.ctrl = ctrl;\n this.mapContainer = mapContainer;\n this.circles = [];\n\n return this.createMap();\n }\n\n createMap() {\n const mapCenter = window.L.latLng(parseFloat(this.ctrl.panel.mapCenterLatitude), parseFloat(this.ctrl.panel.mapCenterLongitude));\n this.map = window.L.map(this.mapContainer, {worldCopyJump: true, center: mapCenter})\n .fitWorld()\n .zoomIn(parseInt(this.ctrl.panel.initialZoom, 10));\n this.map.panTo(mapCenter);\n this.map.scrollWheelZoom.disable();\n\n const selectedTileServer = tileServers[this.ctrl.tileServer];\n window.L.tileLayer(selectedTileServer.url, {\n maxZoom: 18,\n subdomains: selectedTileServer.subdomains,\n reuseTiles: true,\n detectRetina: true,\n attribution: selectedTileServer.attribution\n }).addTo(this.map);\n }\n\n createLegend() {\n this.legend = window.L.control({position: 'bottomleft'});\n this.legend.onAdd = () => {\n this.legend._div = window.L.DomUtil.create('div', 'info legend');\n this.legend.update();\n return this.legend._div;\n };\n\n this.legend.update = () => {\n const thresholds = this.ctrl.data.thresholds;\n let legendHtml = '';\n legendHtml += '
' +\n '< ' + thresholds[0] + '
';\n for (let index = 0; index < thresholds.length; index += 1) {\n legendHtml +=\n '
' +\n thresholds[index] + (thresholds[index + 1] ? '–' + thresholds[index + 1] + '
' : '+');\n }\n this.legend._div.innerHTML = legendHtml;\n };\n this.legend.addTo(this.map);\n }\n\n needToRedrawCircles(data) {\n if (this.circles.length === 0 && data.length > 0) return true;\n\n if (this.circles.length !== data.length) return true;\n const locations = _.map(_.map(this.circles, 'options'), 'location').sort();\n const dataPoints = _.map(data, 'key').sort();\n return !_.isEqual(locations, dataPoints);\n }\n\n filterEmptyAndZeroValues(data) {\n return _.filter(data, (o) => { return !(this.ctrl.panel.hideEmpty && _.isNil(o.value)) && !(this.ctrl.panel.hideZero && o.value === 0); });\n }\n\n clearCircles() {\n if (this.circlesLayer) {\n this.circlesLayer.clearLayers();\n this.removeCircles(this.circlesLayer);\n this.circles = [];\n }\n }\n\n drawCircles() {\n const data = this.filterEmptyAndZeroValues(this.ctrl.data);\n if (this.needToRedrawCircles(data)) {\n this.clearCircles();\n this.createCircles(data);\n } else {\n this.updateCircles(data);\n }\n }\n\n createCircles(data) {\n const circles = [];\n data.forEach((dataPoint) => {\n if (!dataPoint.locationName) return;\n circles.push(this.createCircle(dataPoint));\n });\n this.circlesLayer = this.addCircles(circles);\n this.circles = circles;\n }\n\n updateCircles(data) {\n data.forEach((dataPoint) => {\n if (!dataPoint.locationName) return;\n\n const circle = _.find(this.circles, (cir) => { return cir.options.location === dataPoint.key; });\n\n if (circle) {\n circle.setRadius(this.calcCircleSize(dataPoint.value || 0));\n circle.setStyle({\n color: this.getColor(dataPoint.value),\n fillColor: this.getColor(dataPoint.value),\n fillOpacity: 0.5,\n location: dataPoint.key,\n });\n circle.unbindPopup();\n this.createPopup(circle, dataPoint.locationName, dataPoint.valueRounded);\n }\n });\n }\n\n createCircle(dataPoint) {\n const circle = window.L.circleMarker([dataPoint.locationLatitude, dataPoint.locationLongitude], {\n radius: this.calcCircleSize(dataPoint.value || 0),\n color: this.getColor(dataPoint.value),\n fillColor: this.getColor(dataPoint.value),\n fillOpacity: 0.5,\n location: dataPoint.key\n });\n\n this.createPopup(circle, dataPoint.locationName, dataPoint.valueRounded);\n return circle;\n }\n\n calcCircleSize(dataPointValue) {\n const circleMinSize = parseInt(this.ctrl.panel.circleMinSize, 10) || 2;\n const circleMaxSize = parseInt(this.ctrl.panel.circleMaxSize, 10) || 30;\n\n if (this.ctrl.data.valueRange === 0) {\n return circleMaxSize;\n }\n\n const dataFactor = (dataPointValue - this.ctrl.data.lowestValue) / this.ctrl.data.valueRange;\n const circleSizeRange = circleMaxSize - circleMinSize;\n\n return (circleSizeRange * dataFactor) + circleMinSize;\n }\n\n createPopup(circle, locationName, value) {\n const unit = value && value === 1 ? this.ctrl.panel.unitSingular : this.ctrl.panel.unitPlural;\n const label = (locationName + ': ' + value + ' ' + (unit || '')).trim();\n circle.bindPopup(label, {'offset': window.L.point(0, -2), 'className': 'worldmap-popup', 'closeButton': this.ctrl.panel.stickyLabels});\n\n circle.on('mouseover', function onMouseOver(evt) {\n const layer = evt.target;\n layer.bringToFront();\n this.openPopup();\n });\n\n if (!this.ctrl.panel.stickyLabels) {\n circle.on('mouseout', function onMouseOut() {\n circle.closePopup();\n });\n }\n }\n\n getColor(value) {\n for (let index = this.ctrl.data.thresholds.length; index > 0; index -= 1) {\n if (value >= this.ctrl.data.thresholds[index - 1]) {\n return this.ctrl.panel.colors[index];\n }\n }\n return _.first(this.ctrl.panel.colors);\n }\n\n resize() {\n this.map.invalidateSize();\n }\n\n panToMapCenter() {\n this.map.panTo([parseFloat(this.ctrl.panel.mapCenterLatitude), parseFloat(this.ctrl.panel.mapCenterLongitude)]);\n this.ctrl.mapCenterMoved = false;\n }\n\n removeLegend() {\n this.legend.removeFrom(this.map);\n this.legend = null;\n }\n\n addCircles(circles) {\n return window.L.layerGroup(circles).addTo(this.map);\n }\n\n removeCircles() {\n this.map.removeLayer(this.circlesLayer);\n }\n\n setZoom(zoomFactor) {\n this.map.setZoom(parseInt(zoomFactor, 10));\n }\n\n remove() {\n this.circles = [];\n if (this.circlesLayer) this.removeCircles();\n if (this.legend) this.removeLegend();\n this.map.remove();\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/worldmap.js"],"names":["_","L","tileServers","url","attribution","subdomains","WorldMap","ctrl","mapContainer","circles","createMap","mapCenter","window","latLng","parseFloat","panel","mapCenterLatitude","mapCenterLongitude","map","worldCopyJump","center","fitWorld","zoomIn","parseInt","initialZoom","panTo","setMouseWheelZoom","selectedTileServer","tileServer","tileLayer","maxZoom","reuseTiles","detectRetina","addTo","legend","control","position","onAdd","_div","DomUtil","create","update","thresholds","data","legendHtml","colors","index","length","innerHTML","locations","sort","dataPoints","isEqual","filter","o","hideEmpty","isNil","value","hideZero","circlesLayer","clearLayers","removeCircles","filterEmptyAndZeroValues","needToRedrawCircles","clearCircles","createCircles","updateCircles","forEach","dataPoint","locationName","push","createCircle","addCircles","circle","find","cir","options","location","key","setRadius","calcCircleSize","setStyle","color","getColor","fillColor","fillOpacity","unbindPopup","createPopup","valueRounded","circleMarker","locationLatitude","locationLongitude","radius","dataPointValue","circleMinSize","circleMaxSize","valueRange","dataFactor","lowestValue","circleSizeRange","unit","unitSingular","unitPlural","label","trim","bindPopup","point","stickyLabels","on","onMouseOver","evt","layer","target","bringToFront","openPopup","onMouseOut","closePopup","first","invalidateSize","mapCenterMoved","removeFrom","mouseWheelZoom","scrollWheelZoom","disable","enable","layerGroup","removeLayer","zoomFactor","setZoom","removeLegend","remove"],"mappings":";;;;;;;;;;;;;;;AAAOA,O;;AAEAC,O;;;;;;;;;;;;;;;;;;;;;AAGDC,iB,GAAc;AAClB,4BAAoB,EAAEC,KAAK,8EAAP,EAAuFC,aAAa,wIAApG,EAA8OC,YAAY,MAA1P,EADF;AAElB,wBAAgB,EAACF,KAAK,6EAAN,EAAqFC,aAAa,wIAAlG,EAA4OC,YAAY,MAAxP;AAFE,O;;AAKCC,c;AACnB,0BAAYC,IAAZ,EAAkBC,YAAlB,EAAgC;AAAA;;AAC9B,eAAKD,IAAL,GAAYA,IAAZ;AACA,eAAKC,YAAL,GAAoBA,YAApB;AACA,eAAKC,OAAL,GAAe,EAAf;;AAEA,iBAAO,KAAKC,SAAL,EAAP;AACD;;;;sCAEW;AACV,gBAAMC,YAAYC,OAAOX,CAAP,CAASY,MAAT,CAAgBC,WAAW,KAAKP,IAAL,CAAUQ,KAAV,CAAgBC,iBAA3B,CAAhB,EAA+DF,WAAW,KAAKP,IAAL,CAAUQ,KAAV,CAAgBE,kBAA3B,CAA/D,CAAlB;AACA,iBAAKC,GAAL,GAAWN,OAAOX,CAAP,CAASiB,GAAT,CAAa,KAAKV,YAAlB,EAAgC,EAACW,eAAe,IAAhB,EAAsBC,QAAQT,SAA9B,EAAhC,EACRU,QADQ,GAERC,MAFQ,CAEDC,SAAS,KAAKhB,IAAL,CAAUQ,KAAV,CAAgBS,WAAzB,EAAsC,EAAtC,CAFC,CAAX;AAGA,iBAAKN,GAAL,CAASO,KAAT,CAAed,SAAf;AACA,iBAAKe,iBAAL;;AAEA,gBAAMC,qBAAqBzB,YAAY,KAAKK,IAAL,CAAUqB,UAAtB,CAA3B;AACAhB,mBAAOX,CAAP,CAAS4B,SAAT,CAAmBF,mBAAmBxB,GAAtC,EAA2C;AACzC2B,uBAAS,EADgC;AAEzCzB,0BAAYsB,mBAAmBtB,UAFU;AAGzC0B,0BAAY,IAH6B;AAIzCC,4BAAc,IAJ2B;AAKzC5B,2BAAauB,mBAAmBvB;AALS,aAA3C,EAMG6B,KANH,CAMS,KAAKf,GANd;AAOD;;;yCAEc;AAAA;;AACb,iBAAKgB,MAAL,GAActB,OAAOX,CAAP,CAASkC,OAAT,CAAiB,EAACC,UAAU,YAAX,EAAjB,CAAd;AACA,iBAAKF,MAAL,CAAYG,KAAZ,GAAoB,YAAM;AACxB,oBAAKH,MAAL,CAAYI,IAAZ,GAAmB1B,OAAOX,CAAP,CAASsC,OAAT,CAAiBC,MAAjB,CAAwB,KAAxB,EAA+B,aAA/B,CAAnB;AACA,oBAAKN,MAAL,CAAYO,MAAZ;AACA,qBAAO,MAAKP,MAAL,CAAYI,IAAnB;AACD,aAJD;;AAMA,iBAAKJ,MAAL,CAAYO,MAAZ,GAAqB,YAAM;AACzB,kBAAMC,aAAa,MAAKnC,IAAL,CAAUoC,IAAV,CAAeD,UAAlC;AACA,kBAAIE,aAAa,EAAjB;AACAA,4BAAc,mDAAmD,MAAKrC,IAAL,CAAUQ,KAAV,CAAgB8B,MAAhB,CAAuB,CAAvB,CAAnD,GAA+E,SAA/E,GACV,OADU,GACAH,WAAW,CAAX,CADA,GACgB,QAD9B;AAEA,mBAAK,IAAII,QAAQ,CAAjB,EAAoBA,QAAQJ,WAAWK,MAAvC,EAA+CD,SAAS,CAAxD,EAA2D;AACzDF,8BACE,mDAAmD,MAAKrC,IAAL,CAAUQ,KAAV,CAAgB8B,MAAhB,CAAuBC,QAAQ,CAA/B,CAAnD,GAAuF,SAAvF,GACAJ,WAAWI,KAAX,CADA,IACqBJ,WAAWI,QAAQ,CAAnB,IAAwB,YAAYJ,WAAWI,QAAQ,CAAnB,CAAZ,GAAoC,QAA5D,GAAuE,GAD5F,CADF;AAGD;AACD,oBAAKZ,MAAL,CAAYI,IAAZ,CAAiBU,SAAjB,GAA6BJ,UAA7B;AACD,aAXD;AAYA,iBAAKV,MAAL,CAAYD,KAAZ,CAAkB,KAAKf,GAAvB;AACD;;;8CAEmByB,I,EAAM;AACxB,gBAAI,KAAKlC,OAAL,CAAasC,MAAb,KAAwB,CAAxB,IAA6BJ,KAAKI,MAAL,GAAc,CAA/C,EAAkD,OAAO,IAAP;;AAElD,gBAAI,KAAKtC,OAAL,CAAasC,MAAb,KAAwBJ,KAAKI,MAAjC,EAAyC,OAAO,IAAP;AACzC,gBAAME,YAAYjD,EAAEkB,GAAF,CAAMlB,EAAEkB,GAAF,CAAM,KAAKT,OAAX,EAAoB,SAApB,CAAN,EAAsC,UAAtC,EAAkDyC,IAAlD,EAAlB;AACA,gBAAMC,aAAanD,EAAEkB,GAAF,CAAMyB,IAAN,EAAY,KAAZ,EAAmBO,IAAnB,EAAnB;AACA,mBAAO,CAAClD,EAAEoD,OAAF,CAAUH,SAAV,EAAqBE,UAArB,CAAR;AACD;;;mDAEwBR,I,EAAM;AAAA;;AAC7B,mBAAO3C,EAAEqD,MAAF,CAASV,IAAT,EAAe,UAACW,CAAD,EAAO;AAAE,qBAAO,EAAE,OAAK/C,IAAL,CAAUQ,KAAV,CAAgBwC,SAAhB,IAA6BvD,EAAEwD,KAAF,CAAQF,EAAEG,KAAV,CAA/B,KAAoD,EAAE,OAAKlD,IAAL,CAAUQ,KAAV,CAAgB2C,QAAhB,IAA4BJ,EAAEG,KAAF,KAAY,CAA1C,CAA3D;AAA0G,aAAlI,CAAP;AACD;;;yCAEc;AACb,gBAAI,KAAKE,YAAT,EAAuB;AACrB,mBAAKA,YAAL,CAAkBC,WAAlB;AACA,mBAAKC,aAAL,CAAmB,KAAKF,YAAxB;AACA,mBAAKlD,OAAL,GAAe,EAAf;AACD;AACF;;;wCAEa;AACZ,gBAAMkC,OAAO,KAAKmB,wBAAL,CAA8B,KAAKvD,IAAL,CAAUoC,IAAxC,CAAb;AACA,gBAAI,KAAKoB,mBAAL,CAAyBpB,IAAzB,CAAJ,EAAoC;AAClC,mBAAKqB,YAAL;AACA,mBAAKC,aAAL,CAAmBtB,IAAnB;AACD,aAHD,MAGO;AACL,mBAAKuB,aAAL,CAAmBvB,IAAnB;AACD;AACF;;;wCAEaA,I,EAAM;AAAA;;AAClB,gBAAMlC,UAAU,EAAhB;AACAkC,iBAAKwB,OAAL,CAAa,UAACC,SAAD,EAAe;AAC1B,kBAAI,CAACA,UAAUC,YAAf,EAA6B;AAC7B5D,sBAAQ6D,IAAR,CAAa,OAAKC,YAAL,CAAkBH,SAAlB,CAAb;AACD,aAHD;AAIA,iBAAKT,YAAL,GAAoB,KAAKa,UAAL,CAAgB/D,OAAhB,CAApB;AACA,iBAAKA,OAAL,GAAeA,OAAf;AACD;;;wCAEakC,I,EAAM;AAAA;;AAClBA,iBAAKwB,OAAL,CAAa,UAACC,SAAD,EAAe;AAC1B,kBAAI,CAACA,UAAUC,YAAf,EAA6B;;AAE7B,kBAAMI,SAASzE,EAAE0E,IAAF,CAAO,OAAKjE,OAAZ,EAAqB,UAACkE,GAAD,EAAS;AAAE,uBAAOA,IAAIC,OAAJ,CAAYC,QAAZ,KAAyBT,UAAUU,GAA1C;AAAgD,eAAhF,CAAf;;AAEA,kBAAIL,MAAJ,EAAY;AACVA,uBAAOM,SAAP,CAAiB,OAAKC,cAAL,CAAoBZ,UAAUX,KAAV,IAAmB,CAAvC,CAAjB;AACAgB,uBAAOQ,QAAP,CAAgB;AACdC,yBAAO,OAAKC,QAAL,CAAcf,UAAUX,KAAxB,CADO;AAEd2B,6BAAW,OAAKD,QAAL,CAAcf,UAAUX,KAAxB,CAFG;AAGd4B,+BAAa,GAHC;AAIdR,4BAAUT,UAAUU;AAJN,iBAAhB;AAMAL,uBAAOa,WAAP;AACA,uBAAKC,WAAL,CAAiBd,MAAjB,EAAyBL,UAAUC,YAAnC,EAAiDD,UAAUoB,YAA3D;AACD;AACF,aAhBD;AAiBD;;;uCAEYpB,S,EAAW;AACtB,gBAAMK,SAAS7D,OAAOX,CAAP,CAASwF,YAAT,CAAsB,CAACrB,UAAUsB,gBAAX,EAA6BtB,UAAUuB,iBAAvC,CAAtB,EAAiF;AAC9FC,sBAAQ,KAAKZ,cAAL,CAAoBZ,UAAUX,KAAV,IAAmB,CAAvC,CADsF;AAE9FyB,qBAAO,KAAKC,QAAL,CAAcf,UAAUX,KAAxB,CAFuF;AAG9F2B,yBAAW,KAAKD,QAAL,CAAcf,UAAUX,KAAxB,CAHmF;AAI9F4B,2BAAa,GAJiF;AAK9FR,wBAAUT,UAAUU;AAL0E,aAAjF,CAAf;;AAQA,iBAAKS,WAAL,CAAiBd,MAAjB,EAAyBL,UAAUC,YAAnC,EAAiDD,UAAUoB,YAA3D;AACA,mBAAOf,MAAP;AACD;;;yCAEcoB,c,EAAgB;AAC7B,gBAAMC,gBAAgBvE,SAAS,KAAKhB,IAAL,CAAUQ,KAAV,CAAgB+E,aAAzB,EAAwC,EAAxC,KAA+C,CAArE;AACA,gBAAMC,gBAAgBxE,SAAS,KAAKhB,IAAL,CAAUQ,KAAV,CAAgBgF,aAAzB,EAAwC,EAAxC,KAA+C,EAArE;;AAEA,gBAAI,KAAKxF,IAAL,CAAUoC,IAAV,CAAeqD,UAAf,KAA8B,CAAlC,EAAqC;AACnC,qBAAOD,aAAP;AACD;;AAED,gBAAME,aAAa,CAACJ,iBAAiB,KAAKtF,IAAL,CAAUoC,IAAV,CAAeuD,WAAjC,IAAgD,KAAK3F,IAAL,CAAUoC,IAAV,CAAeqD,UAAlF;AACA,gBAAMG,kBAAkBJ,gBAAgBD,aAAxC;;AAEA,mBAAQK,kBAAkBF,UAAnB,GAAiCH,aAAxC;AACD;;;sCAEWrB,M,EAAQJ,Y,EAAcZ,K,EAAO;AACvC,gBAAM2C,OAAO3C,SAASA,UAAU,CAAnB,GAAuB,KAAKlD,IAAL,CAAUQ,KAAV,CAAgBsF,YAAvC,GAAsD,KAAK9F,IAAL,CAAUQ,KAAV,CAAgBuF,UAAnF;AACA,gBAAMC,QAAQ,CAAClC,eAAe,IAAf,GAAsBZ,KAAtB,GAA8B,GAA9B,IAAqC2C,QAAQ,EAA7C,CAAD,EAAmDI,IAAnD,EAAd;AACA/B,mBAAOgC,SAAP,CAAiBF,KAAjB,EAAwB,EAAC,UAAU3F,OAAOX,CAAP,CAASyG,KAAT,CAAe,CAAf,EAAkB,CAAC,CAAnB,CAAX,EAAkC,aAAa,gBAA/C,EAAiE,eAAe,KAAKnG,IAAL,CAAUQ,KAAV,CAAgB4F,YAAhG,EAAxB;;AAEAlC,mBAAOmC,EAAP,CAAU,WAAV,EAAuB,SAASC,WAAT,CAAqBC,GAArB,EAA0B;AAC/C,kBAAMC,QAAQD,IAAIE,MAAlB;AACAD,oBAAME,YAAN;AACA,mBAAKC,SAAL;AACD,aAJD;;AAMA,gBAAI,CAAC,KAAK3G,IAAL,CAAUQ,KAAV,CAAgB4F,YAArB,EAAmC;AACjClC,qBAAOmC,EAAP,CAAU,UAAV,EAAsB,SAASO,UAAT,GAAsB;AAC1C1C,uBAAO2C,UAAP;AACD,eAFD;AAGD;AACF;;;mCAEQ3D,K,EAAO;AACd,iBAAK,IAAIX,QAAQ,KAAKvC,IAAL,CAAUoC,IAAV,CAAeD,UAAf,CAA0BK,MAA3C,EAAmDD,QAAQ,CAA3D,EAA8DA,SAAS,CAAvE,EAA0E;AACxE,kBAAIW,SAAS,KAAKlD,IAAL,CAAUoC,IAAV,CAAeD,UAAf,CAA0BI,QAAQ,CAAlC,CAAb,EAAmD;AACjD,uBAAO,KAAKvC,IAAL,CAAUQ,KAAV,CAAgB8B,MAAhB,CAAuBC,KAAvB,CAAP;AACD;AACF;AACD,mBAAO9C,EAAEqH,KAAF,CAAQ,KAAK9G,IAAL,CAAUQ,KAAV,CAAgB8B,MAAxB,CAAP;AACD;;;mCAEQ;AACP,iBAAK3B,GAAL,CAASoG,cAAT;AACD;;;2CAEgB;AACf,iBAAKpG,GAAL,CAASO,KAAT,CAAe,CAACX,WAAW,KAAKP,IAAL,CAAUQ,KAAV,CAAgBC,iBAA3B,CAAD,EAAgDF,WAAW,KAAKP,IAAL,CAAUQ,KAAV,CAAgBE,kBAA3B,CAAhD,CAAf;AACA,iBAAKV,IAAL,CAAUgH,cAAV,GAA2B,KAA3B;AACD;;;yCAEc;AACb,iBAAKrF,MAAL,CAAYsF,UAAZ,CAAuB,KAAKtG,GAA5B;AACA,iBAAKgB,MAAL,GAAc,IAAd;AACD;;;8CAEmB;AAClB,gBAAI,CAAC,KAAK3B,IAAL,CAAUQ,KAAV,CAAgB0G,cAArB,EAAqC;AACnC,mBAAKvG,GAAL,CAASwG,eAAT,CAAyBC,OAAzB;AACD,aAFD,MAEO;AACL,mBAAKzG,GAAL,CAASwG,eAAT,CAAyBE,MAAzB;AACD;AACF;;;qCAEUnH,O,EAAS;AAClB,mBAAOG,OAAOX,CAAP,CAAS4H,UAAT,CAAoBpH,OAApB,EAA6BwB,KAA7B,CAAmC,KAAKf,GAAxC,CAAP;AACD;;;0CAEe;AACd,iBAAKA,GAAL,CAAS4G,WAAT,CAAqB,KAAKnE,YAA1B;AACD;;;kCAEOoE,U,EAAY;AAClB,iBAAK7G,GAAL,CAAS8G,OAAT,CAAiBzG,SAASwG,UAAT,EAAqB,EAArB,CAAjB;AACD;;;mCAEQ;AACP,iBAAKtH,OAAL,GAAe,EAAf;AACA,gBAAI,KAAKkD,YAAT,EAAuB,KAAKE,aAAL;AACvB,gBAAI,KAAK3B,MAAT,EAAiB,KAAK+F,YAAL;AACjB,iBAAK/G,GAAL,CAASgH,MAAT;AACD;;;;;;yBA5MkB5H,Q","file":"worldmap.js","sourcesContent":["import _ from 'lodash';\n/* eslint-disable id-length, no-unused-vars */\nimport L from './libs/leaflet';\n/* eslint-disable id-length, no-unused-vars */\n\nconst tileServers = {\n 'CartoDB Positron': { url: 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png', attribution: '© OpenStreetMap © CartoDB', subdomains: 'abcd'},\n 'CartoDB Dark': {url: 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png', attribution: '© OpenStreetMap © CartoDB', subdomains: 'abcd'}\n};\n\nexport default class WorldMap {\n constructor(ctrl, mapContainer) {\n this.ctrl = ctrl;\n this.mapContainer = mapContainer;\n this.circles = [];\n\n return this.createMap();\n }\n\n createMap() {\n const mapCenter = window.L.latLng(parseFloat(this.ctrl.panel.mapCenterLatitude), parseFloat(this.ctrl.panel.mapCenterLongitude));\n this.map = window.L.map(this.mapContainer, {worldCopyJump: true, center: mapCenter})\n .fitWorld()\n .zoomIn(parseInt(this.ctrl.panel.initialZoom, 10));\n this.map.panTo(mapCenter);\n this.setMouseWheelZoom();\n\n const selectedTileServer = tileServers[this.ctrl.tileServer];\n window.L.tileLayer(selectedTileServer.url, {\n maxZoom: 18,\n subdomains: selectedTileServer.subdomains,\n reuseTiles: true,\n detectRetina: true,\n attribution: selectedTileServer.attribution\n }).addTo(this.map);\n }\n\n createLegend() {\n this.legend = window.L.control({position: 'bottomleft'});\n this.legend.onAdd = () => {\n this.legend._div = window.L.DomUtil.create('div', 'info legend');\n this.legend.update();\n return this.legend._div;\n };\n\n this.legend.update = () => {\n const thresholds = this.ctrl.data.thresholds;\n let legendHtml = '';\n legendHtml += '
' +\n '< ' + thresholds[0] + '
';\n for (let index = 0; index < thresholds.length; index += 1) {\n legendHtml +=\n '
' +\n thresholds[index] + (thresholds[index + 1] ? '–' + thresholds[index + 1] + '
' : '+');\n }\n this.legend._div.innerHTML = legendHtml;\n };\n this.legend.addTo(this.map);\n }\n\n needToRedrawCircles(data) {\n if (this.circles.length === 0 && data.length > 0) return true;\n\n if (this.circles.length !== data.length) return true;\n const locations = _.map(_.map(this.circles, 'options'), 'location').sort();\n const dataPoints = _.map(data, 'key').sort();\n return !_.isEqual(locations, dataPoints);\n }\n\n filterEmptyAndZeroValues(data) {\n return _.filter(data, (o) => { return !(this.ctrl.panel.hideEmpty && _.isNil(o.value)) && !(this.ctrl.panel.hideZero && o.value === 0); });\n }\n\n clearCircles() {\n if (this.circlesLayer) {\n this.circlesLayer.clearLayers();\n this.removeCircles(this.circlesLayer);\n this.circles = [];\n }\n }\n\n drawCircles() {\n const data = this.filterEmptyAndZeroValues(this.ctrl.data);\n if (this.needToRedrawCircles(data)) {\n this.clearCircles();\n this.createCircles(data);\n } else {\n this.updateCircles(data);\n }\n }\n\n createCircles(data) {\n const circles = [];\n data.forEach((dataPoint) => {\n if (!dataPoint.locationName) return;\n circles.push(this.createCircle(dataPoint));\n });\n this.circlesLayer = this.addCircles(circles);\n this.circles = circles;\n }\n\n updateCircles(data) {\n data.forEach((dataPoint) => {\n if (!dataPoint.locationName) return;\n\n const circle = _.find(this.circles, (cir) => { return cir.options.location === dataPoint.key; });\n\n if (circle) {\n circle.setRadius(this.calcCircleSize(dataPoint.value || 0));\n circle.setStyle({\n color: this.getColor(dataPoint.value),\n fillColor: this.getColor(dataPoint.value),\n fillOpacity: 0.5,\n location: dataPoint.key,\n });\n circle.unbindPopup();\n this.createPopup(circle, dataPoint.locationName, dataPoint.valueRounded);\n }\n });\n }\n\n createCircle(dataPoint) {\n const circle = window.L.circleMarker([dataPoint.locationLatitude, dataPoint.locationLongitude], {\n radius: this.calcCircleSize(dataPoint.value || 0),\n color: this.getColor(dataPoint.value),\n fillColor: this.getColor(dataPoint.value),\n fillOpacity: 0.5,\n location: dataPoint.key\n });\n\n this.createPopup(circle, dataPoint.locationName, dataPoint.valueRounded);\n return circle;\n }\n\n calcCircleSize(dataPointValue) {\n const circleMinSize = parseInt(this.ctrl.panel.circleMinSize, 10) || 2;\n const circleMaxSize = parseInt(this.ctrl.panel.circleMaxSize, 10) || 30;\n\n if (this.ctrl.data.valueRange === 0) {\n return circleMaxSize;\n }\n\n const dataFactor = (dataPointValue - this.ctrl.data.lowestValue) / this.ctrl.data.valueRange;\n const circleSizeRange = circleMaxSize - circleMinSize;\n\n return (circleSizeRange * dataFactor) + circleMinSize;\n }\n\n createPopup(circle, locationName, value) {\n const unit = value && value === 1 ? this.ctrl.panel.unitSingular : this.ctrl.panel.unitPlural;\n const label = (locationName + ': ' + value + ' ' + (unit || '')).trim();\n circle.bindPopup(label, {'offset': window.L.point(0, -2), 'className': 'worldmap-popup', 'closeButton': this.ctrl.panel.stickyLabels});\n\n circle.on('mouseover', function onMouseOver(evt) {\n const layer = evt.target;\n layer.bringToFront();\n this.openPopup();\n });\n\n if (!this.ctrl.panel.stickyLabels) {\n circle.on('mouseout', function onMouseOut() {\n circle.closePopup();\n });\n }\n }\n\n getColor(value) {\n for (let index = this.ctrl.data.thresholds.length; index > 0; index -= 1) {\n if (value >= this.ctrl.data.thresholds[index - 1]) {\n return this.ctrl.panel.colors[index];\n }\n }\n return _.first(this.ctrl.panel.colors);\n }\n\n resize() {\n this.map.invalidateSize();\n }\n\n panToMapCenter() {\n this.map.panTo([parseFloat(this.ctrl.panel.mapCenterLatitude), parseFloat(this.ctrl.panel.mapCenterLongitude)]);\n this.ctrl.mapCenterMoved = false;\n }\n\n removeLegend() {\n this.legend.removeFrom(this.map);\n this.legend = null;\n }\n\n setMouseWheelZoom() {\n if (!this.ctrl.panel.mouseWheelZoom) {\n this.map.scrollWheelZoom.disable();\n } else {\n this.map.scrollWheelZoom.enable();\n }\n }\n\n addCircles(circles) {\n return window.L.layerGroup(circles).addTo(this.map);\n }\n\n removeCircles() {\n this.map.removeLayer(this.circlesLayer);\n }\n\n setZoom(zoomFactor) {\n this.map.setZoom(parseInt(zoomFactor, 10));\n }\n\n remove() {\n this.circles = [];\n if (this.circlesLayer) this.removeCircles();\n if (this.legend) this.removeLegend();\n this.map.remove();\n }\n}\n"]} \ No newline at end of file diff --git a/dist/worldmap_ctrl.js b/dist/worldmap_ctrl.js index 7aed5cb..041611d 100644 --- a/dist/worldmap_ctrl.js +++ b/dist/worldmap_ctrl.js @@ -83,6 +83,7 @@ System.register(['app/plugins/sdk', 'app/core/time_series2', 'app/core/utils/kbn unitSingle: '', unitPlural: '', showLegend: true, + mouseWheelZoom: true, esMetric: 'Count', decimals: 0, hideEmpty: false, @@ -269,6 +270,12 @@ System.register(['app/plugins/sdk', 'app/core/time_series2', 'app/core/utils/kbn } this.render(); } + }, { + key: 'toggleMouseWheelZoom', + value: function toggleMouseWheelZoom() { + this.map.setMouseWheelZoom(); + this.render(); + } }, { key: 'toggleStickyLabels', value: function toggleStickyLabels() { diff --git a/dist/worldmap_ctrl.js.map b/dist/worldmap_ctrl.js.map index 7a5102a..7da40f7 100644 --- a/dist/worldmap_ctrl.js.map +++ b/dist/worldmap_ctrl.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/worldmap_ctrl.js"],"names":["MetricsPanelCtrl","TimeSeries","kbn","_","mapRenderer","DataFormatter","panelDefaults","maxDataPoints","mapCenter","mapCenterLatitude","mapCenterLongitude","initialZoom","valueName","circleMinSize","circleMaxSize","locationData","thresholds","colors","unitSingle","unitPlural","showLegend","esMetric","decimals","hideEmpty","hideZero","stickyLabels","mapCenters","WorldmapCtrl","$scope","$injector","contextSrv","setMapProvider","defaults","panel","dataFormatter","events","on","onInitEditMode","bind","onDataReceived","onPanelTeardown","onDataSnapshotLoad","loadLocationDataFromFile","tileServer","user","lightTheme","setMapSaturationClass","saturationClass","reload","map","snapshotLocationData","locations","jsonpUrl","jsonpCallback","window","$","ajax","type","url","contentType","dataType","success","res","render","jsonUrl","getJSON","then","reloadLocations","refresh","remove","addEditorTab","dataList","dashboard","snapshot","data","setGeohashValues","tableData","tableHandler","setTableValues","series","setJsonValues","seriesHandler","setValues","updateThresholdData","length","centerOnLastGeoHash","last","locationLatitude","locationLongitude","setNewMapCenter","snapshotData","seriesData","datapoints","alias","target","flotpairs","getFlotPairs","nullPointMode","mapCenterMoved","setZoom","removeLegend","clearCircles","legend","update","split","strValue","Number","trim","size","pop","newColor","push","scope","elem","attrs","ctrl","templateUrl"],"mappings":"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","file":"worldmap_ctrl.js","sourcesContent":["/* eslint import/no-extraneous-dependencies: 0 */\nimport {MetricsPanelCtrl} from 'app/plugins/sdk';\nimport TimeSeries from 'app/core/time_series2';\nimport kbn from 'app/core/utils/kbn';\n\nimport _ from 'lodash';\nimport mapRenderer from './map_renderer';\nimport DataFormatter from './data_formatter';\nimport './css/worldmap-panel.css!';\n\nconst panelDefaults = {\n maxDataPoints: 1,\n mapCenter: '(0°, 0°)',\n mapCenterLatitude: 0,\n mapCenterLongitude: 0,\n initialZoom: 1,\n valueName: 'total',\n circleMinSize: 2,\n circleMaxSize: 30,\n locationData: 'countries',\n thresholds: '0,10',\n colors: ['rgba(245, 54, 54, 0.9)', 'rgba(237, 129, 40, 0.89)', 'rgba(50, 172, 45, 0.97)'],\n unitSingle: '',\n unitPlural: '',\n showLegend: true,\n esMetric: 'Count',\n decimals: 0,\n hideEmpty: false,\n hideZero: false,\n stickyLabels: false\n};\n\nconst mapCenters = {\n '(0°, 0°)': {mapCenterLatitude: 0, mapCenterLongitude: 0},\n 'North America': {mapCenterLatitude: 40, mapCenterLongitude: -100},\n 'Europe': {mapCenterLatitude: 46, mapCenterLongitude: 14},\n 'West Asia': {mapCenterLatitude: 26, mapCenterLongitude: 53},\n 'SE Asia': {mapCenterLatitude: 10, mapCenterLongitude: 106},\n 'Last GeoHash': {mapCenterLatitude: 0, mapCenterLongitude: 0}\n};\n\nexport default class WorldmapCtrl extends MetricsPanelCtrl {\n constructor($scope, $injector, contextSrv) {\n super($scope, $injector);\n\n this.setMapProvider(contextSrv);\n _.defaults(this.panel, panelDefaults);\n\n this.dataFormatter = new DataFormatter(this, kbn);\n\n this.events.on('init-edit-mode', this.onInitEditMode.bind(this));\n this.events.on('data-received', this.onDataReceived.bind(this));\n this.events.on('panel-teardown', this.onPanelTeardown.bind(this));\n this.events.on('data-snapshot-load', this.onDataSnapshotLoad.bind(this));\n\n this.loadLocationDataFromFile();\n }\n\n setMapProvider(contextSrv) {\n this.tileServer = contextSrv.user.lightTheme ? 'CartoDB Positron' : 'CartoDB Dark';\n this.setMapSaturationClass();\n }\n\n setMapSaturationClass() {\n if (this.tileServer === 'CartoDB Dark') {\n this.saturationClass = 'map-darken';\n } else {\n this.saturationClass = '';\n }\n }\n\n loadLocationDataFromFile(reload) {\n if (this.map && !reload) return;\n\n if (this.panel.snapshotLocationData) {\n this.locations = this.panel.snapshotLocationData;\n return;\n }\n\n if (this.panel.locationData === 'jsonp endpoint') {\n if (!this.panel.jsonpUrl || !this.panel.jsonpCallback) return;\n\n window.$.ajax({\n type: 'GET',\n url: this.panel.jsonpUrl + '?callback=?',\n contentType: 'application/json',\n jsonpCallback: this.panel.jsonpCallback,\n dataType: 'jsonp',\n success: (res) => {\n this.locations = res;\n this.render();\n }\n });\n } else if (this.panel.locationData === 'json endpoint') {\n if (!this.panel.jsonUrl) return;\n\n window.$.getJSON(this.panel.jsonUrl).then((res) => {\n this.locations = res;\n this.render();\n });\n } else if (this.panel.locationData === 'table') {\n // .. Do nothing\n } else if (this.panel.locationData !== 'geohash' && this.panel.locationData !== 'json result') {\n window.$.getJSON('public/plugins/grafana-worldmap-panel/data/' + this.panel.locationData + '.json')\n .then(this.reloadLocations.bind(this));\n }\n }\n\n reloadLocations(res) {\n this.locations = res;\n this.refresh();\n }\n\n onPanelTeardown() {\n if (this.map) this.map.remove();\n }\n\n onInitEditMode() {\n this.addEditorTab('Worldmap', 'public/plugins/grafana-worldmap-panel/partials/editor.html', 2);\n }\n\n onDataReceived(dataList) {\n if (!dataList) return;\n\n if (this.dashboard.snapshot && this.locations) {\n this.panel.snapshotLocationData = this.locations;\n }\n\n const data = [];\n\n if (this.panel.locationData === 'geohash') {\n this.dataFormatter.setGeohashValues(dataList, data);\n } else if (this.panel.locationData === 'table') {\n const tableData = dataList.map(DataFormatter.tableHandler.bind(this));\n this.dataFormatter.setTableValues(tableData, data);\n } else if (this.panel.locationData === 'json result') {\n this.series = dataList;\n this.dataFormatter.setJsonValues(data);\n } else {\n this.series = dataList.map(this.seriesHandler.bind(this));\n this.dataFormatter.setValues(data);\n }\n this.data = data;\n\n this.updateThresholdData();\n\n if (this.data.length && this.panel.mapCenter === 'Last GeoHash') {\n this.centerOnLastGeoHash();\n } else {\n this.render();\n }\n }\n\n centerOnLastGeoHash() {\n mapCenters[this.panel.mapCenter].mapCenterLatitude = _.last(this.data).locationLatitude;\n mapCenters[this.panel.mapCenter].mapCenterLongitude = _.last(this.data).locationLongitude;\n this.setNewMapCenter();\n }\n\n onDataSnapshotLoad(snapshotData) {\n this.onDataReceived(snapshotData);\n }\n\n seriesHandler(seriesData) {\n const series = new TimeSeries({\n datapoints: seriesData.datapoints,\n alias: seriesData.target,\n });\n\n series.flotpairs = series.getFlotPairs(this.panel.nullPointMode);\n return series;\n }\n\n setNewMapCenter() {\n if (this.panel.mapCenter !== 'custom') {\n this.panel.mapCenterLatitude = mapCenters[this.panel.mapCenter].mapCenterLatitude;\n this.panel.mapCenterLongitude = mapCenters[this.panel.mapCenter].mapCenterLongitude;\n }\n this.mapCenterMoved = true;\n this.render();\n }\n\n setZoom() {\n this.map.setZoom(this.panel.initialZoom || 1);\n }\n\n toggleLegend() {\n if (!this.panel.showLegend) {\n this.map.removeLegend();\n }\n this.render();\n }\n\n toggleStickyLabels() {\n this.map.clearCircles();\n this.render();\n }\n\n changeThresholds() {\n this.updateThresholdData();\n this.map.legend.update();\n this.render();\n }\n\n updateThresholdData() {\n this.data.thresholds = this.panel.thresholds.split(',').map((strValue) => {\n return Number(strValue.trim());\n });\n while (_.size(this.panel.colors) > _.size(this.data.thresholds) + 1) {\n // too many colors. remove the last one.\n this.panel.colors.pop();\n }\n while (_.size(this.panel.colors) < _.size(this.data.thresholds) + 1) {\n // not enough colors. add one.\n const newColor = 'rgba(50, 172, 45, 0.97)';\n this.panel.colors.push(newColor);\n }\n }\n\n changeLocationData() {\n this.loadLocationDataFromFile(true);\n\n if (this.panel.locationData === 'geohash') {\n this.render();\n }\n }\n\n/* eslint class-methods-use-this: 0 */\n link(scope, elem, attrs, ctrl) {\n mapRenderer(scope, elem, attrs, ctrl);\n }\n}\n\nWorldmapCtrl.templateUrl = 'module.html';\n"]} \ No newline at end of file +{"version":3,"sources":["../src/worldmap_ctrl.js"],"names":["MetricsPanelCtrl","TimeSeries","kbn","_","mapRenderer","DataFormatter","panelDefaults","maxDataPoints","mapCenter","mapCenterLatitude","mapCenterLongitude","initialZoom","valueName","circleMinSize","circleMaxSize","locationData","thresholds","colors","unitSingle","unitPlural","showLegend","mouseWheelZoom","esMetric","decimals","hideEmpty","hideZero","stickyLabels","mapCenters","WorldmapCtrl","$scope","$injector","contextSrv","setMapProvider","defaults","panel","dataFormatter","events","on","onInitEditMode","bind","onDataReceived","onPanelTeardown","onDataSnapshotLoad","loadLocationDataFromFile","tileServer","user","lightTheme","setMapSaturationClass","saturationClass","reload","map","snapshotLocationData","locations","jsonpUrl","jsonpCallback","window","$","ajax","type","url","contentType","dataType","success","res","render","jsonUrl","getJSON","then","reloadLocations","refresh","remove","addEditorTab","dataList","dashboard","snapshot","data","setGeohashValues","tableData","tableHandler","setTableValues","series","setJsonValues","seriesHandler","setValues","updateThresholdData","length","centerOnLastGeoHash","last","locationLatitude","locationLongitude","setNewMapCenter","snapshotData","seriesData","datapoints","alias","target","flotpairs","getFlotPairs","nullPointMode","mapCenterMoved","setZoom","removeLegend","setMouseWheelZoom","clearCircles","legend","update","split","strValue","Number","trim","size","pop","newColor","push","scope","elem","attrs","ctrl","templateUrl"],"mappings":"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","file":"worldmap_ctrl.js","sourcesContent":["/* eslint import/no-extraneous-dependencies: 0 */\nimport {MetricsPanelCtrl} from 'app/plugins/sdk';\nimport TimeSeries from 'app/core/time_series2';\nimport kbn from 'app/core/utils/kbn';\n\nimport _ from 'lodash';\nimport mapRenderer from './map_renderer';\nimport DataFormatter from './data_formatter';\nimport './css/worldmap-panel.css!';\n\nconst panelDefaults = {\n maxDataPoints: 1,\n mapCenter: '(0°, 0°)',\n mapCenterLatitude: 0,\n mapCenterLongitude: 0,\n initialZoom: 1,\n valueName: 'total',\n circleMinSize: 2,\n circleMaxSize: 30,\n locationData: 'countries',\n thresholds: '0,10',\n colors: ['rgba(245, 54, 54, 0.9)', 'rgba(237, 129, 40, 0.89)', 'rgba(50, 172, 45, 0.97)'],\n unitSingle: '',\n unitPlural: '',\n showLegend: true,\n mouseWheelZoom: true,\n esMetric: 'Count',\n decimals: 0,\n hideEmpty: false,\n hideZero: false,\n stickyLabels: false\n};\n\nconst mapCenters = {\n '(0°, 0°)': {mapCenterLatitude: 0, mapCenterLongitude: 0},\n 'North America': {mapCenterLatitude: 40, mapCenterLongitude: -100},\n 'Europe': {mapCenterLatitude: 46, mapCenterLongitude: 14},\n 'West Asia': {mapCenterLatitude: 26, mapCenterLongitude: 53},\n 'SE Asia': {mapCenterLatitude: 10, mapCenterLongitude: 106},\n 'Last GeoHash': {mapCenterLatitude: 0, mapCenterLongitude: 0}\n};\n\nexport default class WorldmapCtrl extends MetricsPanelCtrl {\n constructor($scope, $injector, contextSrv) {\n super($scope, $injector);\n\n this.setMapProvider(contextSrv);\n _.defaults(this.panel, panelDefaults);\n\n this.dataFormatter = new DataFormatter(this, kbn);\n\n this.events.on('init-edit-mode', this.onInitEditMode.bind(this));\n this.events.on('data-received', this.onDataReceived.bind(this));\n this.events.on('panel-teardown', this.onPanelTeardown.bind(this));\n this.events.on('data-snapshot-load', this.onDataSnapshotLoad.bind(this));\n\n this.loadLocationDataFromFile();\n }\n\n setMapProvider(contextSrv) {\n this.tileServer = contextSrv.user.lightTheme ? 'CartoDB Positron' : 'CartoDB Dark';\n this.setMapSaturationClass();\n }\n\n setMapSaturationClass() {\n if (this.tileServer === 'CartoDB Dark') {\n this.saturationClass = 'map-darken';\n } else {\n this.saturationClass = '';\n }\n }\n\n loadLocationDataFromFile(reload) {\n if (this.map && !reload) return;\n\n if (this.panel.snapshotLocationData) {\n this.locations = this.panel.snapshotLocationData;\n return;\n }\n\n if (this.panel.locationData === 'jsonp endpoint') {\n if (!this.panel.jsonpUrl || !this.panel.jsonpCallback) return;\n\n window.$.ajax({\n type: 'GET',\n url: this.panel.jsonpUrl + '?callback=?',\n contentType: 'application/json',\n jsonpCallback: this.panel.jsonpCallback,\n dataType: 'jsonp',\n success: (res) => {\n this.locations = res;\n this.render();\n }\n });\n } else if (this.panel.locationData === 'json endpoint') {\n if (!this.panel.jsonUrl) return;\n\n window.$.getJSON(this.panel.jsonUrl).then((res) => {\n this.locations = res;\n this.render();\n });\n } else if (this.panel.locationData === 'table') {\n // .. Do nothing\n } else if (this.panel.locationData !== 'geohash' && this.panel.locationData !== 'json result') {\n window.$.getJSON('public/plugins/grafana-worldmap-panel/data/' + this.panel.locationData + '.json')\n .then(this.reloadLocations.bind(this));\n }\n }\n\n reloadLocations(res) {\n this.locations = res;\n this.refresh();\n }\n\n onPanelTeardown() {\n if (this.map) this.map.remove();\n }\n\n onInitEditMode() {\n this.addEditorTab('Worldmap', 'public/plugins/grafana-worldmap-panel/partials/editor.html', 2);\n }\n\n onDataReceived(dataList) {\n if (!dataList) return;\n\n if (this.dashboard.snapshot && this.locations) {\n this.panel.snapshotLocationData = this.locations;\n }\n\n const data = [];\n\n if (this.panel.locationData === 'geohash') {\n this.dataFormatter.setGeohashValues(dataList, data);\n } else if (this.panel.locationData === 'table') {\n const tableData = dataList.map(DataFormatter.tableHandler.bind(this));\n this.dataFormatter.setTableValues(tableData, data);\n } else if (this.panel.locationData === 'json result') {\n this.series = dataList;\n this.dataFormatter.setJsonValues(data);\n } else {\n this.series = dataList.map(this.seriesHandler.bind(this));\n this.dataFormatter.setValues(data);\n }\n this.data = data;\n\n this.updateThresholdData();\n\n if (this.data.length && this.panel.mapCenter === 'Last GeoHash') {\n this.centerOnLastGeoHash();\n } else {\n this.render();\n }\n }\n\n centerOnLastGeoHash() {\n mapCenters[this.panel.mapCenter].mapCenterLatitude = _.last(this.data).locationLatitude;\n mapCenters[this.panel.mapCenter].mapCenterLongitude = _.last(this.data).locationLongitude;\n this.setNewMapCenter();\n }\n\n onDataSnapshotLoad(snapshotData) {\n this.onDataReceived(snapshotData);\n }\n\n seriesHandler(seriesData) {\n const series = new TimeSeries({\n datapoints: seriesData.datapoints,\n alias: seriesData.target,\n });\n\n series.flotpairs = series.getFlotPairs(this.panel.nullPointMode);\n return series;\n }\n\n setNewMapCenter() {\n if (this.panel.mapCenter !== 'custom') {\n this.panel.mapCenterLatitude = mapCenters[this.panel.mapCenter].mapCenterLatitude;\n this.panel.mapCenterLongitude = mapCenters[this.panel.mapCenter].mapCenterLongitude;\n }\n this.mapCenterMoved = true;\n this.render();\n }\n\n setZoom() {\n this.map.setZoom(this.panel.initialZoom || 1);\n }\n\n toggleLegend() {\n if (!this.panel.showLegend) {\n this.map.removeLegend();\n }\n this.render();\n }\n\n toggleMouseWheelZoom() {\n this.map.setMouseWheelZoom();\n this.render();\n }\n\n toggleStickyLabels() {\n this.map.clearCircles();\n this.render();\n }\n\n changeThresholds() {\n this.updateThresholdData();\n this.map.legend.update();\n this.render();\n }\n\n updateThresholdData() {\n this.data.thresholds = this.panel.thresholds.split(',').map((strValue) => {\n return Number(strValue.trim());\n });\n while (_.size(this.panel.colors) > _.size(this.data.thresholds) + 1) {\n // too many colors. remove the last one.\n this.panel.colors.pop();\n }\n while (_.size(this.panel.colors) < _.size(this.data.thresholds) + 1) {\n // not enough colors. add one.\n const newColor = 'rgba(50, 172, 45, 0.97)';\n this.panel.colors.push(newColor);\n }\n }\n\n changeLocationData() {\n this.loadLocationDataFromFile(true);\n\n if (this.panel.locationData === 'geohash') {\n this.render();\n }\n }\n\n/* eslint class-methods-use-this: 0 */\n link(scope, elem, attrs, ctrl) {\n mapRenderer(scope, elem, attrs, ctrl);\n }\n}\n\nWorldmapCtrl.templateUrl = 'module.html';\n"]} \ No newline at end of file diff --git a/src/partials/editor.html b/src/partials/editor.html index 2140e0b..b275407 100644 --- a/src/partials/editor.html +++ b/src/partials/editor.html @@ -39,6 +39,9 @@
Map Visual Options
+
+ +
Map Data Options
diff --git a/src/worldmap.js b/src/worldmap.js index a4611a2..dee259f 100644 --- a/src/worldmap.js +++ b/src/worldmap.js @@ -23,7 +23,7 @@ export default class WorldMap { .fitWorld() .zoomIn(parseInt(this.ctrl.panel.initialZoom, 10)); this.map.panTo(mapCenter); - this.map.scrollWheelZoom.disable(); + this.setMouseWheelZoom(); const selectedTileServer = tileServers[this.ctrl.tileServer]; window.L.tileLayer(selectedTileServer.url, { @@ -187,6 +187,14 @@ export default class WorldMap { this.legend = null; } + setMouseWheelZoom() { + if (!this.ctrl.panel.mouseWheelZoom) { + this.map.scrollWheelZoom.disable(); + } else { + this.map.scrollWheelZoom.enable(); + } + } + addCircles(circles) { return window.L.layerGroup(circles).addTo(this.map); } diff --git a/src/worldmap_ctrl.js b/src/worldmap_ctrl.js index c62b3a1..f204514 100644 --- a/src/worldmap_ctrl.js +++ b/src/worldmap_ctrl.js @@ -23,6 +23,7 @@ const panelDefaults = { unitSingle: '', unitPlural: '', showLegend: true, + mouseWheelZoom: true, esMetric: 'Count', decimals: 0, hideEmpty: false, @@ -191,6 +192,11 @@ export default class WorldmapCtrl extends MetricsPanelCtrl { this.render(); } + toggleMouseWheelZoom() { + this.map.setMouseWheelZoom(); + this.render(); + } + toggleStickyLabels() { this.map.clearCircles(); this.render();