Commit 7f53d531639967a18bbe6a1d298eb0e8d95cd9b4
Committed by
GitHub
1 parent
76300e40
[3.0] Fixed polygon functionality (#2747)
* Add default setting and title for group * Fix polygon: updateColor, functions tooltip and color polygon, update coordinate polygon * Improvement code * Refactoring code
Showing
4 changed files
with
47 additions
and
37 deletions
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | /// limitations under the License. | 14 | /// limitations under the License. |
15 | /// | 15 | /// |
16 | 16 | ||
17 | -import L, { LatLngBounds, LatLngTuple, markerClusterGroup, MarkerClusterGroupOptions, FeatureGroup, LayerGroup } from 'leaflet'; | 17 | +import L, { FeatureGroup, LatLngBounds, LatLngTuple, markerClusterGroup, MarkerClusterGroupOptions } from 'leaflet'; |
18 | 18 | ||
19 | import 'leaflet-providers'; | 19 | import 'leaflet-providers'; |
20 | import 'leaflet.markercluster/dist/leaflet.markercluster'; | 20 | import 'leaflet.markercluster/dist/leaflet.markercluster'; |
@@ -32,8 +32,7 @@ import { BehaviorSubject, Observable } from 'rxjs'; | @@ -32,8 +32,7 @@ import { BehaviorSubject, Observable } from 'rxjs'; | ||
32 | import { filter } from 'rxjs/operators'; | 32 | import { filter } from 'rxjs/operators'; |
33 | import { Polyline } from './polyline'; | 33 | import { Polyline } from './polyline'; |
34 | import { Polygon } from './polygon'; | 34 | import { Polygon } from './polygon'; |
35 | -import { DatasourceData } from '@app/shared/models/widget.models'; | ||
36 | -import { safeExecute, createTooltip } from '@home/components/widget/lib/maps/maps-utils'; | 35 | +import { createTooltip, safeExecute } from '@home/components/widget/lib/maps/maps-utils'; |
37 | 36 | ||
38 | export default abstract class LeafletMap { | 37 | export default abstract class LeafletMap { |
39 | 38 | ||
@@ -379,13 +378,13 @@ export default abstract class LeafletMap { | @@ -379,13 +378,13 @@ export default abstract class LeafletMap { | ||
379 | 378 | ||
380 | // Polygon | 379 | // Polygon |
381 | 380 | ||
382 | - updatePolygons(polyData: DatasourceData[]) { | ||
383 | - polyData.forEach((data: DatasourceData) => { | ||
384 | - if (data.data.length && data.dataKey.name === this.options.polygonKeyName) { | ||
385 | - if (typeof (data?.data[0][1]) === 'string') { | ||
386 | - data.data = JSON.parse(data.data[0][1]) as LatLngTuple[]; | 381 | + updatePolygons(polyData: FormattedData[]) { |
382 | + polyData.forEach((data: FormattedData) => { | ||
383 | + if (data.hasOwnProperty(this.options.polygonKeyName)) { | ||
384 | + if (typeof (data[this.options.polygonKeyName]) === 'string') { | ||
385 | + data[this.options.polygonKeyName] = JSON.parse(data[this.options.polygonKeyName]) as LatLngTuple[]; | ||
387 | } | 386 | } |
388 | - if (this.polygons.get(data.datasource.entityName)) { | 387 | + if (this.polygons.get(data.$datasource.entityName)) { |
389 | this.updatePolygon(data, polyData, this.options); | 388 | this.updatePolygon(data, polyData, this.options); |
390 | } | 389 | } |
391 | else { | 390 | else { |
@@ -395,16 +394,16 @@ export default abstract class LeafletMap { | @@ -395,16 +394,16 @@ export default abstract class LeafletMap { | ||
395 | }); | 394 | }); |
396 | } | 395 | } |
397 | 396 | ||
398 | - createPolygon(polyData: DatasourceData, dataSources: DatasourceData[], settings: PolygonSettings) { | 397 | + createPolygon(polyData: FormattedData, dataSources: FormattedData[], settings: PolygonSettings) { |
399 | this.ready$.subscribe(() => { | 398 | this.ready$.subscribe(() => { |
400 | const polygon = new Polygon(this.map, polyData, dataSources, settings); | 399 | const polygon = new Polygon(this.map, polyData, dataSources, settings); |
401 | const bounds = polygon.leafletPoly.getBounds(); | 400 | const bounds = polygon.leafletPoly.getBounds(); |
402 | this.fitBounds(bounds); | 401 | this.fitBounds(bounds); |
403 | - this.polygons.set(polyData.datasource.entityName, polygon); | 402 | + this.polygons.set(polyData.$datasource.entityName, polygon); |
404 | }); | 403 | }); |
405 | } | 404 | } |
406 | 405 | ||
407 | - updatePolygon(polyData: DatasourceData, dataSources: DatasourceData[], settings: PolygonSettings) { | 406 | + updatePolygon(polyData: FormattedData, dataSources: FormattedData[], settings: PolygonSettings) { |
408 | this.ready$.subscribe(() => { | 407 | this.ready$.subscribe(() => { |
409 | const poly = this.polygons.get(polyData.datasource.entityName); | 408 | const poly = this.polygons.get(polyData.datasource.entityName); |
410 | poly.updatePolygon(polyData.data, dataSources, settings); | 409 | poly.updatePolygon(polyData.data, dataSources, settings); |
@@ -217,6 +217,7 @@ export class MapWidgetController implements MapWidgetInterface { | @@ -217,6 +217,7 @@ export class MapWidgetController implements MapWidgetInterface { | ||
217 | tooltipFunction: parseFunction(settings.tooltipFunction, functionParams), | 217 | tooltipFunction: parseFunction(settings.tooltipFunction, functionParams), |
218 | colorFunction: parseFunction(settings.colorFunction, functionParams), | 218 | colorFunction: parseFunction(settings.colorFunction, functionParams), |
219 | polygonColorFunction: parseFunction(settings.polygonColorFunction, functionParams), | 219 | polygonColorFunction: parseFunction(settings.polygonColorFunction, functionParams), |
220 | + polygonTooltipFunction: parseFunction(settings.polygonTooltipFunction, functionParams), | ||
220 | markerImageFunction: parseFunction(settings.markerImageFunction, ['data', 'images', 'dsData', 'dsIndex']), | 221 | markerImageFunction: parseFunction(settings.markerImageFunction, ['data', 'images', 'dsData', 'dsIndex']), |
221 | labelColor: this.ctx.widgetConfig.color, | 222 | labelColor: this.ctx.widgetConfig.color, |
222 | polygonKeyName: settings.polKeyName ? settings.polKeyName : settings.polygonKeyName, | 223 | polygonKeyName: settings.polKeyName ? settings.polKeyName : settings.polygonKeyName, |
@@ -236,7 +237,7 @@ export class MapWidgetController implements MapWidgetInterface { | @@ -236,7 +237,7 @@ export class MapWidgetController implements MapWidgetInterface { | ||
236 | if (this.drawRoutes) | 237 | if (this.drawRoutes) |
237 | this.map.updatePolylines(parseArray(this.data)); | 238 | this.map.updatePolylines(parseArray(this.data)); |
238 | if (this.settings.showPolygon) { | 239 | if (this.settings.showPolygon) { |
239 | - this.map.updatePolygons(this.data); | 240 | + this.map.updatePolygons(parseData(this.data)); |
240 | } | 241 | } |
241 | if (this.settings.draggableMarker) { | 242 | if (this.settings.draggableMarker) { |
242 | this.map.setDataSources(parseData(this.data)); | 243 | this.map.setDataSources(parseData(this.data)); |
@@ -16,8 +16,7 @@ | @@ -16,8 +16,7 @@ | ||
16 | 16 | ||
17 | import L, { LatLngExpression, LatLngTuple, LeafletMouseEvent } from 'leaflet'; | 17 | import L, { LatLngExpression, LatLngTuple, LeafletMouseEvent } from 'leaflet'; |
18 | import { createTooltip, parseWithTranslation, safeExecute } from './maps-utils'; | 18 | import { createTooltip, parseWithTranslation, safeExecute } from './maps-utils'; |
19 | -import { PolygonSettings } from './map-models'; | ||
20 | -import { DatasourceData } from '@app/shared/models/widget.models'; | 19 | +import { FormattedData, PolygonSettings } from './map-models'; |
21 | 20 | ||
22 | export class Polygon { | 21 | export class Polygon { |
23 | 22 | ||
@@ -26,19 +25,22 @@ export class Polygon { | @@ -26,19 +25,22 @@ export class Polygon { | ||
26 | data; | 25 | data; |
27 | dataSources; | 26 | dataSources; |
28 | 27 | ||
29 | - constructor(public map, polyData: DatasourceData, dataSources, private settings: PolygonSettings) { | ||
30 | - this.leafletPoly = L.polygon(polyData.data, { | ||
31 | - fill: true, | ||
32 | - fillColor: settings.polygonColor, | ||
33 | - color: settings.polygonStrokeColor, | ||
34 | - weight: settings.polygonStrokeWeight, | ||
35 | - fillOpacity: settings.polygonOpacity, | ||
36 | - opacity: settings.polygonStrokeOpacity | ||
37 | - }).addTo(this.map); | 28 | + constructor(public map, polyData: FormattedData, dataSources, private settings: PolygonSettings) { |
38 | this.dataSources = dataSources; | 29 | this.dataSources = dataSources; |
39 | this.data = polyData; | 30 | this.data = polyData; |
31 | + const polygonColor = this.getPolygonColor(settings); | ||
32 | + | ||
33 | + this.leafletPoly = L.polygon(polyData[this.settings.polygonKeyName], { | ||
34 | + fill: true, | ||
35 | + fillColor: polygonColor, | ||
36 | + color: settings.polygonStrokeColor, | ||
37 | + weight: settings.polygonStrokeWeight, | ||
38 | + fillOpacity: settings.polygonOpacity, | ||
39 | + opacity: settings.polygonStrokeOpacity | ||
40 | + }).addTo(this.map); | ||
41 | + | ||
40 | if (settings.showPolygonTooltip) { | 42 | if (settings.showPolygonTooltip) { |
41 | - this.tooltip = createTooltip(this.leafletPoly, settings, polyData.datasource); | 43 | + this.tooltip = createTooltip(this.leafletPoly, settings, polyData.$datasource); |
42 | this.updateTooltip(polyData); | 44 | this.updateTooltip(polyData); |
43 | } | 45 | } |
44 | if (settings.polygonClick) { | 46 | if (settings.polygonClick) { |
@@ -52,17 +54,17 @@ export class Polygon { | @@ -52,17 +54,17 @@ export class Polygon { | ||
52 | } | 54 | } |
53 | } | 55 | } |
54 | 56 | ||
55 | - updateTooltip(data: DatasourceData) { | 57 | + updateTooltip(data: FormattedData) { |
56 | const pattern = this.settings.usePolygonTooltipFunction ? | 58 | const pattern = this.settings.usePolygonTooltipFunction ? |
57 | safeExecute(this.settings.polygonTooltipFunction, [this.data, this.dataSources, this.data.dsIndex]) : | 59 | safeExecute(this.settings.polygonTooltipFunction, [this.data, this.dataSources, this.data.dsIndex]) : |
58 | this.settings.polygonTooltipPattern; | 60 | this.settings.polygonTooltipPattern; |
59 | this.tooltip.setContent(parseWithTranslation.parseTemplate(pattern, data, true)); | 61 | this.tooltip.setContent(parseWithTranslation.parseTemplate(pattern, data, true)); |
60 | } | 62 | } |
61 | 63 | ||
62 | - updatePolygon(data: LatLngTuple[], dataSources: DatasourceData[], settings: PolygonSettings) { | 64 | + updatePolygon(data: LatLngTuple[], dataSources: FormattedData[], settings: PolygonSettings) { |
63 | this.data = data; | 65 | this.data = data; |
64 | this.dataSources = dataSources; | 66 | this.dataSources = dataSources; |
65 | - this.leafletPoly.setLatLngs(data); | 67 | + this.leafletPoly.setLatLngs(data[this.settings.polygonKeyName]); |
66 | if (settings.showPolygonTooltip) | 68 | if (settings.showPolygonTooltip) |
67 | this.updateTooltip(this.data); | 69 | this.updateTooltip(this.data); |
68 | this.updatePolygonColor(settings); | 70 | this.updatePolygonColor(settings); |
@@ -73,11 +75,10 @@ export class Polygon { | @@ -73,11 +75,10 @@ export class Polygon { | ||
73 | } | 75 | } |
74 | 76 | ||
75 | updatePolygonColor(settings: PolygonSettings) { | 77 | updatePolygonColor(settings: PolygonSettings) { |
76 | - const color = settings.usePolygonColorFunction ? | ||
77 | - safeExecute(settings.polygonColorFunction, [this.data, this.dataSources, this.data.dsIndex]) : settings.polygonColor; | 78 | + const polygonColor = this.getPolygonColor(settings); |
78 | const style: L.PathOptions = { | 79 | const style: L.PathOptions = { |
79 | fill: true, | 80 | fill: true, |
80 | - fillColor: color, | 81 | + fillColor: polygonColor, |
81 | color: settings.polygonStrokeColor, | 82 | color: settings.polygonStrokeColor, |
82 | weight: settings.polygonStrokeWeight, | 83 | weight: settings.polygonStrokeWeight, |
83 | fillOpacity: settings.polygonOpacity, | 84 | fillOpacity: settings.polygonOpacity, |
@@ -94,4 +95,12 @@ export class Polygon { | @@ -94,4 +95,12 @@ export class Polygon { | ||
94 | this.leafletPoly.setLatLngs(latLngs); | 95 | this.leafletPoly.setLatLngs(latLngs); |
95 | this.leafletPoly.redraw(); | 96 | this.leafletPoly.redraw(); |
96 | } | 97 | } |
98 | + | ||
99 | + private getPolygonColor(settings: PolygonSettings): string | null { | ||
100 | + if (settings.usePolygonColorFunction) { | ||
101 | + return safeExecute(settings.polygonColorFunction, [this.data, this.dataSources, this.data.dsIndex]); | ||
102 | + } else { | ||
103 | + return settings.polygonColor; | ||
104 | + } | ||
105 | + } | ||
97 | } | 106 | } |
@@ -22,7 +22,8 @@ export const googleMapSettingsSchema = | @@ -22,7 +22,8 @@ export const googleMapSettingsSchema = | ||
22 | properties: { | 22 | properties: { |
23 | gmApiKey: { | 23 | gmApiKey: { |
24 | title: 'Google Maps API Key', | 24 | title: 'Google Maps API Key', |
25 | - type: 'string' | 25 | + type: 'string', |
26 | + default: 'AIzaSyDoEx2kaGz3PxwbI9T7ccTSg5xjdw8Nw8Q' | ||
26 | }, | 27 | }, |
27 | gmDefaultMapType: { | 28 | gmDefaultMapType: { |
28 | title: 'Default map type', | 29 | title: 'Default map type', |
@@ -30,8 +31,7 @@ export const googleMapSettingsSchema = | @@ -30,8 +31,7 @@ export const googleMapSettingsSchema = | ||
30 | default: 'roadmap' | 31 | default: 'roadmap' |
31 | } | 32 | } |
32 | }, | 33 | }, |
33 | - required: [ | ||
34 | - ] | 34 | + required: [] |
35 | }, | 35 | }, |
36 | form: [ | 36 | form: [ |
37 | 'gmApiKey', | 37 | 'gmApiKey', |
@@ -69,7 +69,8 @@ export const tencentMapSettingsSchema = | @@ -69,7 +69,8 @@ export const tencentMapSettingsSchema = | ||
69 | properties: { | 69 | properties: { |
70 | tmApiKey: { | 70 | tmApiKey: { |
71 | title: 'Tencent Maps API Key', | 71 | title: 'Tencent Maps API Key', |
72 | - type: 'string' | 72 | + type: 'string', |
73 | + default: '84d6d83e0e51e481e50454ccbe8986b' | ||
73 | }, | 74 | }, |
74 | tmDefaultMapType: { | 75 | tmDefaultMapType: { |
75 | title: 'Default map type', | 76 | title: 'Default map type', |
@@ -77,8 +78,7 @@ export const tencentMapSettingsSchema = | @@ -77,8 +78,7 @@ export const tencentMapSettingsSchema = | ||
77 | default: 'roadmap' | 78 | default: 'roadmap' |
78 | } | 79 | } |
79 | }, | 80 | }, |
80 | - required: [ | ||
81 | - ] | 81 | + required: [] |
82 | }, | 82 | }, |
83 | form: [ | 83 | form: [ |
84 | 'tmApiKey', | 84 | 'tmApiKey', |
@@ -117,6 +117,7 @@ export const hereMapSettingsSchema = | @@ -117,6 +117,7 @@ export const hereMapSettingsSchema = | ||
117 | }, | 117 | }, |
118 | credentials: { | 118 | credentials: { |
119 | type: 'object', | 119 | type: 'object', |
120 | + title: 'Credentials', | ||
120 | properties: { | 121 | properties: { |
121 | app_id: { | 122 | app_id: { |
122 | title: 'HERE app id', | 123 | title: 'HERE app id', |