Map rectangles support
This commit is contained in:
parent
7072713f12
commit
66d6b8d687
@ -69,6 +69,8 @@ export default abstract class LeafletMap {
|
||||
loading = false;
|
||||
replaceInfoLabelMarker: Array<ReplaceInfo> = [];
|
||||
markerLabelText: string;
|
||||
polygonLabelText: string;
|
||||
replaceInfoLabelPolygon: Array<ReplaceInfo> = [];
|
||||
replaceInfoTooltipMarker: Array<ReplaceInfo> = [];
|
||||
markerTooltipText: string;
|
||||
drawRoutes: boolean;
|
||||
@ -248,8 +250,16 @@ export default abstract class LeafletMap {
|
||||
this.saveLocation(this.selectedEntity, this.convertToCustomFormat(e.layer.getLatLng())).subscribe(() => {
|
||||
});
|
||||
} else if (e.shape === 'tbRectangle' || e.shape === 'tbPolygon') {
|
||||
// @ts-ignore
|
||||
this.saveLocation(this.selectedEntity, this.convertPolygonToCustomFormat(e.layer.getLatLngs()[0])).subscribe(() => {
|
||||
let coordinates;
|
||||
if (e.shape === 'tbRectangle') {
|
||||
// @ts-ignore
|
||||
const bounds: L.LatLngBounds = e.layer.getBounds();
|
||||
coordinates = [bounds.getNorthWest(), bounds.getSouthEast()];
|
||||
} else {
|
||||
// @ts-ignore
|
||||
coordinates = e.layer.getLatLngs()[0];
|
||||
}
|
||||
this.saveLocation(this.selectedEntity, this.convertPolygonToCustomFormat(coordinates)).subscribe(() => {
|
||||
});
|
||||
}
|
||||
// @ts-ignore
|
||||
@ -281,7 +291,7 @@ export default abstract class LeafletMap {
|
||||
result = iterator.next();
|
||||
}
|
||||
this.saveLocation(result.value.data, this.convertToCustomFormat(null)).subscribe(() => {});
|
||||
} else if (e.shape === 'Polygon') {
|
||||
} else if (e.shape === 'Polygon' || e.shape === 'Rectangle') {
|
||||
const iterator = this.polygons.values();
|
||||
let result = iterator.next();
|
||||
while (!result.done && e.layer !== result.value.leafletPoly) {
|
||||
@ -333,6 +343,7 @@ export default abstract class LeafletMap {
|
||||
this.map.scrollWheelZoom.disable();
|
||||
}
|
||||
if (this.options.draggableMarker || this.editPolygons) {
|
||||
map.pm.setGlobalOptions({ snappable: false } as L.PM.GlobalOptions);
|
||||
this.addEditControl();
|
||||
} else {
|
||||
this.map.pm.disableDraw();
|
||||
@ -764,6 +775,14 @@ export default abstract class LeafletMap {
|
||||
if (coordinates.length === 1) {
|
||||
coordinates = coordinates[0];
|
||||
}
|
||||
if (e.shape === 'Rectangle') {
|
||||
// @ts-ignore
|
||||
const bounds: L.LatLngBounds = e.layer.getBounds();
|
||||
const boundsArray = [bounds.getNorthWest(), bounds.getNorthEast(), bounds.getSouthWest(), bounds.getSouthEast()];
|
||||
if (coordinates.every(point => boundsArray.find(boundPoint => boundPoint.equals(point)) !== undefined)) {
|
||||
coordinates = [bounds.getNorthWest(), bounds.getSouthEast()];
|
||||
}
|
||||
}
|
||||
this.saveLocation(data, this.convertPolygonToCustomFormat(coordinates)).subscribe(() => {});
|
||||
}
|
||||
|
||||
|
||||
@ -131,6 +131,11 @@ export type PolygonSettings = {
|
||||
polygonStrokeWeight: number;
|
||||
polygonStrokeColor: string;
|
||||
polygonColor: string;
|
||||
showPolygonLabel?: boolean;
|
||||
polygonLabel: string;
|
||||
polygonLabelColor: string;
|
||||
polygonLabelText: string;
|
||||
usePolygonLabelFunction: boolean;
|
||||
showPolygonTooltip: boolean;
|
||||
autocloseTooltip: boolean;
|
||||
showTooltipAction: string;
|
||||
@ -139,8 +144,11 @@ export type PolygonSettings = {
|
||||
usePolygonTooltipFunction: boolean;
|
||||
polygonClick: { [name: string]: actionsHandler };
|
||||
usePolygonColorFunction: boolean;
|
||||
usePolygonStrokeColorFunction: boolean;
|
||||
polygonTooltipFunction: GenericFunction;
|
||||
polygonColorFunction?: GenericFunction;
|
||||
polygonStrokeColorFunction?: GenericFunction;
|
||||
polygonLabelFunction?: GenericFunction;
|
||||
editablePolygon: boolean;
|
||||
};
|
||||
|
||||
@ -227,8 +235,10 @@ export const defaultSettings: any = {
|
||||
showPolygon: false,
|
||||
labelColor: '#000000',
|
||||
color: '#FE7569',
|
||||
showPolygonLabel: false,
|
||||
polygonColor: '#0000ff',
|
||||
polygonStrokeColor: '#fe0001',
|
||||
polygonLabelColor: '#000000',
|
||||
polygonOpacity: 0.5,
|
||||
polygonStrokeOpacity: 1,
|
||||
polygonStrokeWeight: 1,
|
||||
|
||||
@ -265,10 +265,13 @@ export class MapWidgetController implements MapWidgetInterface {
|
||||
tooltipFunction: parseFunction(settings.tooltipFunction, functionParams),
|
||||
colorFunction: parseFunction(settings.colorFunction, functionParams),
|
||||
colorPointFunction: parseFunction(settings.colorPointFunction, functionParams),
|
||||
polygonLabelFunction: parseFunction(settings.polygonLabelFunction, functionParams),
|
||||
polygonColorFunction: parseFunction(settings.polygonColorFunction, functionParams),
|
||||
polygonStrokeColorFunction: parseFunction(settings.polygonStrokeColorFunction, functionParams),
|
||||
polygonTooltipFunction: parseFunction(settings.polygonTooltipFunction, functionParams),
|
||||
markerImageFunction: parseFunction(settings.markerImageFunction, ['data', 'images', 'dsData', 'dsIndex']),
|
||||
labelColor: this.ctx.widgetConfig.color,
|
||||
polygonLabelColor: this.ctx.widgetConfig.color,
|
||||
polygonKeyName: settings.polKeyName ? settings.polKeyName : settings.polygonKeyName,
|
||||
tooltipPattern: settings.tooltipPattern ||
|
||||
'<b>${entityName}</b><br/><br/><b>Latitude:</b> ${' +
|
||||
|
||||
@ -29,6 +29,15 @@
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.tb-polygon-label {
|
||||
border: none;
|
||||
background: none;
|
||||
box-shadow: none;
|
||||
&:before {
|
||||
content: none;
|
||||
}
|
||||
}
|
||||
|
||||
.leaflet-container {
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
@ -16,8 +16,14 @@
|
||||
|
||||
import L, { LatLngExpression, LeafletMouseEvent } from 'leaflet';
|
||||
import { createTooltip } from './maps-utils';
|
||||
import { functionValueCalculator, parseWithTranslation, safeExecute } from './common-maps-utils';
|
||||
import { FormattedData, PolygonSettings } from './map-models';
|
||||
import {
|
||||
fillPattern,
|
||||
functionValueCalculator,
|
||||
parseWithTranslation,
|
||||
processPattern,
|
||||
safeExecute
|
||||
} from './common-maps-utils';
|
||||
import { FormattedData, MarkerSettings, PolygonSettings } from './map-models';
|
||||
|
||||
export class Polygon {
|
||||
|
||||
@ -26,38 +32,47 @@ export class Polygon {
|
||||
data: FormattedData;
|
||||
dataSources: FormattedData[];
|
||||
|
||||
constructor(public map, polyData: FormattedData, dataSources: FormattedData[], private settings: PolygonSettings, onDragendListener?) {
|
||||
constructor(public map, data: FormattedData, dataSources: FormattedData[], private settings: PolygonSettings,
|
||||
private onDragendListener?) {
|
||||
this.dataSources = dataSources;
|
||||
this.data = polyData;
|
||||
this.data = data;
|
||||
const polygonColor = this.getPolygonColor(settings);
|
||||
this.leafletPoly = L.polygon(polyData[this.settings.polygonKeyName], {
|
||||
const polygonStrokeColor = this.getPolygonStrokeColor(settings);
|
||||
const polyData = data[this.settings.polygonKeyName];
|
||||
const polyConstructor = polyData.length > 2 ? L.polygon : L.rectangle;
|
||||
this.leafletPoly = polyConstructor(polyData, {
|
||||
fill: true,
|
||||
fillColor: polygonColor,
|
||||
color: settings.polygonStrokeColor,
|
||||
color: polygonStrokeColor,
|
||||
weight: settings.polygonStrokeWeight,
|
||||
fillOpacity: settings.polygonOpacity,
|
||||
opacity: settings.polygonStrokeOpacity,
|
||||
pmIgnore: !settings.editablePolygon
|
||||
}).addTo(this.map);
|
||||
|
||||
if (settings.editablePolygon && onDragendListener) {
|
||||
this.leafletPoly.on('pm:edit', (e) => onDragendListener(e, this.data));
|
||||
}
|
||||
|
||||
this.updateLabel(settings);
|
||||
|
||||
if (settings.showPolygonTooltip) {
|
||||
this.tooltip = createTooltip(this.leafletPoly, settings, polyData.$datasource);
|
||||
this.updateTooltip(polyData);
|
||||
}
|
||||
if (settings.polygonClick) {
|
||||
this.leafletPoly.on('click', (event: LeafletMouseEvent) => {
|
||||
for (const action in this.settings.polygonClick) {
|
||||
if (typeof (this.settings.polygonClick[action]) === 'function') {
|
||||
this.settings.polygonClick[action](event.originalEvent, polyData.$datasource);
|
||||
}
|
||||
}
|
||||
});
|
||||
this.tooltip = createTooltip(this.leafletPoly, settings, data.$datasource);
|
||||
this.updateTooltip(data);
|
||||
}
|
||||
this.createEventListeners();
|
||||
}
|
||||
|
||||
private createEventListeners() {
|
||||
if (this.settings.editablePolygon && this.onDragendListener) {
|
||||
this.leafletPoly.on('pm:edit', (e) => this.onDragendListener(e, this.data));
|
||||
}
|
||||
|
||||
if (this.settings.polygonClick) {
|
||||
this.leafletPoly.on('click', (event: LeafletMouseEvent) => {
|
||||
for (const action in this.settings.polygonClick) {
|
||||
if (typeof (this.settings.polygonClick[action]) === 'function') {
|
||||
this.settings.polygonClick[action](event.originalEvent, this.data.$datasource);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
updateTooltip(data: FormattedData) {
|
||||
@ -67,13 +82,54 @@ export class Polygon {
|
||||
this.tooltip.setContent(parseWithTranslation.parseTemplate(pattern, data, true));
|
||||
}
|
||||
|
||||
updateLabel(settings: PolygonSettings) {
|
||||
this.leafletPoly.unbindTooltip();
|
||||
if (settings.showPolygonLabel) {
|
||||
if (!this.map.polygonLabelText || settings.usePolygonLabelFunction) {
|
||||
const pattern = settings.usePolygonLabelFunction ?
|
||||
safeExecute(settings.polygonLabelFunction, [this.data, this.dataSources, this.data.dsIndex]) : settings.polygonLabel;
|
||||
this.map.polygonLabelText = parseWithTranslation.prepareProcessPattern(pattern, true);
|
||||
this.map.replaceInfoLabelPolygon = processPattern(this.map.polygonLabelText, this.data);
|
||||
}
|
||||
settings.polygonLabelText = fillPattern(this.map.polygonLabelText, this.map.replaceInfoLabelPolygon, this.data);
|
||||
this.leafletPoly.bindTooltip(`<div style="color: ${settings.polygonLabelColor};"><b>${settings.polygonLabelText}</b></div>`,
|
||||
{ className: 'tb-polygon-label', permanent: true, sticky: true, direction: 'center' })
|
||||
.openTooltip(this.leafletPoly.getBounds().getCenter());
|
||||
}
|
||||
}
|
||||
|
||||
updatePolygon(data: FormattedData, dataSources: FormattedData[], settings: PolygonSettings) {
|
||||
this.data = data;
|
||||
this.dataSources = dataSources;
|
||||
this.leafletPoly.setLatLngs(data[this.settings.polygonKeyName]);
|
||||
const polyData = data[this.settings.polygonKeyName];
|
||||
if (polyData.length > 2) {
|
||||
if (this.leafletPoly instanceof L.Rectangle) {
|
||||
this.map.removeLayer(this.leafletPoly);
|
||||
const polygonColor = this.getPolygonColor(settings);
|
||||
const polygonStrokeColor = this.getPolygonStrokeColor(settings);
|
||||
this.leafletPoly = L.polygon(polyData, {
|
||||
fill: true,
|
||||
fillColor: polygonColor,
|
||||
color: polygonStrokeColor,
|
||||
weight: settings.polygonStrokeWeight,
|
||||
fillOpacity: settings.polygonOpacity,
|
||||
opacity: settings.polygonStrokeOpacity,
|
||||
pmIgnore: !settings.editablePolygon
|
||||
}).addTo(this.map);
|
||||
} else {
|
||||
this.leafletPoly.setLatLngs(polyData);
|
||||
}
|
||||
} else if (polyData.length === 2) {
|
||||
const bounds = new L.LatLngBounds(polyData);
|
||||
// @ts-ignore
|
||||
this.leafletPoly.setBounds(bounds);
|
||||
}
|
||||
if (settings.showPolygonTooltip) {
|
||||
this.updateTooltip(this.data);
|
||||
}
|
||||
if (settings.showPolygonLabel) {
|
||||
this.updateLabel(settings);
|
||||
}
|
||||
this.updatePolygonColor(settings);
|
||||
}
|
||||
|
||||
@ -83,10 +139,11 @@ export class Polygon {
|
||||
|
||||
updatePolygonColor(settings: PolygonSettings) {
|
||||
const polygonColor = this.getPolygonColor(settings);
|
||||
const polygonStrokeColor = this.getPolygonStrokeColor(settings);
|
||||
const style: L.PathOptions = {
|
||||
fill: true,
|
||||
fillColor: polygonColor,
|
||||
color: settings.polygonStrokeColor,
|
||||
color: polygonStrokeColor,
|
||||
weight: settings.polygonStrokeWeight,
|
||||
fillOpacity: settings.polygonOpacity,
|
||||
opacity: settings.polygonStrokeOpacity
|
||||
@ -107,4 +164,9 @@ export class Polygon {
|
||||
return functionValueCalculator(settings.usePolygonColorFunction, settings.polygonColorFunction,
|
||||
[this.data, this.dataSources, this.data.dsIndex], settings.polygonColor);
|
||||
}
|
||||
|
||||
private getPolygonStrokeColor(settings: PolygonSettings): string | null {
|
||||
return functionValueCalculator(settings.usePolygonStrokeColorFunction, settings.polygonStrokeColorFunction,
|
||||
[this.data, this.dataSources, this.data.dsIndex], settings.polygonStrokeColor);
|
||||
}
|
||||
}
|
||||
|
||||
@ -556,6 +556,25 @@ export const mapPolygonSchema =
|
||||
type: 'boolean',
|
||||
default: false
|
||||
},
|
||||
showPolygonLabel: {
|
||||
title: 'Show polygon label',
|
||||
type: 'boolean',
|
||||
default: false
|
||||
},
|
||||
polygonLabel: {
|
||||
title: 'Polygon label (pattern examples: \'${entityName}\', \'${entityName}: (Text ${keyName} units.)\' )',
|
||||
type: 'string',
|
||||
default: '${entityName}'
|
||||
},
|
||||
usePolygonLabelFunction: {
|
||||
title: 'Use polygon label function',
|
||||
type: 'boolean',
|
||||
default: false
|
||||
},
|
||||
polygonLabelFunction: {
|
||||
title: 'Polygon label function: f(data, dsData, dsIndex)',
|
||||
type: 'string'
|
||||
},
|
||||
polygonColor: {
|
||||
title: 'Polygon color',
|
||||
type: 'string'
|
||||
@ -607,6 +626,15 @@ export const mapPolygonSchema =
|
||||
title: 'Polygon Color function: f(data, dsData, dsIndex)',
|
||||
type: 'string'
|
||||
},
|
||||
usePolygonStrokeColorFunction: {
|
||||
title: 'Use polygon stroke color function',
|
||||
type: 'boolean',
|
||||
default: false
|
||||
},
|
||||
polygonStrokeColorFunction: {
|
||||
title: 'Polygon Stroke Color function: f(data, dsData, dsIndex)',
|
||||
type: 'string'
|
||||
}
|
||||
},
|
||||
required: []
|
||||
},
|
||||
@ -614,6 +642,21 @@ export const mapPolygonSchema =
|
||||
'showPolygon',
|
||||
'polygonKeyName',
|
||||
'editablePolygon',
|
||||
'showPolygonLabel',
|
||||
{
|
||||
key: 'usePolygonLabelFunction',
|
||||
condition: 'model.showPolygonLabel === true'
|
||||
},
|
||||
{
|
||||
key: 'polygonLabel',
|
||||
condition: 'model.showPolygonLabel === true && model.usePolygonLabelFunction !== true'
|
||||
},
|
||||
{
|
||||
key: 'polygonLabelFunction',
|
||||
type: 'javascript',
|
||||
helpId: 'widget/lib/map/label_fn',
|
||||
condition: 'model.showPolygonLabel === true && model.usePolygonLabelFunction === true'
|
||||
},
|
||||
{
|
||||
key: 'polygonColor',
|
||||
type: 'color'
|
||||
@ -630,6 +673,13 @@ export const mapPolygonSchema =
|
||||
key: 'polygonStrokeColor',
|
||||
type: 'color'
|
||||
},
|
||||
'usePolygonStrokeColorFunction',
|
||||
{
|
||||
key: 'polygonStrokeColorFunction',
|
||||
helpId: 'widget/lib/map/polygon_color_fn',
|
||||
type: 'javascript',
|
||||
condition: 'model.usePolygonStrokeColorFunction === true'
|
||||
},
|
||||
'polygonStrokeOpacity',
|
||||
'polygonStrokeWeight',
|
||||
'showPolygonTooltip',
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user