@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
94 lines • 11.7 kB
JavaScript
import { gettext } from '@c8y/ngx-components';
import { MapService } from './map.service';
export class ClusterMap {
set clusterMarker(item) {
this.removeClusterToBigMarker();
this._clusterMarker = item;
}
get clusterMarker() {
return this._clusterMarker;
}
set rect(item) {
if (this._rect) {
this._rect.remove();
}
this._rect = item;
}
get rect() {
return this._rect;
}
constructor(iterable, addAssetCallback, translateService) {
this.iterable = iterable;
this.addAssetCallback = addAssetCallback;
this.translateService = translateService;
this.markers = [];
this.positions = [];
this.iterableDiffer = this.iterable.find(this.positions).create(this.trackBy);
}
render(map) {
if (this._rect) {
this._rect.addTo(map);
}
this.updateChanges(map);
if (this._clusterMarker) {
this._clusterMarker.addTo(map);
}
}
clear(map) {
this.removeClusterToBigMarker();
this._rect.remove();
this.positions = [];
this.updateChanges(map);
}
removeClusterToBigMarker() {
if (this._clusterMarker) {
this._clusterMarker.remove();
this._clusterMarker = null;
}
}
addMarkerToMap(device, map) {
const marker = this.addAssetCallback(device);
this.markers.push(marker);
marker.addTo(map);
}
setClusterToBigMarker(map, count, leaflet) {
const bound = this.rect.getBounds();
const text = this.translateService.instant(gettext('Zoom in'));
const divMarker = leaflet.divIcon({
html: `<div class="c8y-map-marker-count" data-count="${count}" title="${text}"></div>`
});
const labelIcon = leaflet.marker(bound.getCenter(), {
icon: divMarker
});
labelIcon.addTo(map);
labelIcon.on('click', () => {
map.fitBounds(bound);
});
this.clusterMarker = labelIcon;
}
updateChanges(map) {
const changes = this.iterableDiffer.diff(this.positions);
if (changes) {
changes.forEachRemovedItem((record) => {
this.removeMarkerFromMap(record.item);
});
changes.forEachAddedItem((record) => {
this.addMarkerToMap(record.item, map);
});
}
}
trackBy(index, item) {
const trackItems = [
item.id,
item.c8y_Position.lat,
item.c8y_Position.lng,
MapService.getStatus(item)
];
return trackItems.join('');
}
removeMarkerFromMap(device) {
const markers = this.markers.filter((marker) => marker.asset?.id === device.id);
markers.forEach(marker => marker.remove());
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3Rlci1tYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9tYXAvY2x1c3Rlci1tYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsTUFBTSxPQUFPLFVBQVU7SUFJckIsSUFBSSxhQUFhLENBQUMsSUFBYTtRQUM3QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxJQUFpQjtRQUN4QixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQU1ELFlBQ1UsUUFBeUIsRUFDekIsZ0JBQTZELEVBQzdELGdCQUFrQztRQUZsQyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTZDO1FBQzdELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUE5QjVDLFlBQU8sR0FBZ0IsRUFBRSxDQUFDO1FBQzFCLGNBQVMsR0FBNEIsRUFBRSxDQUFDO1FBK0J0QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxD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MkI7UUFDeEQsTUFBTSxVQUFVLEdBQUc7WUFDakIsSUFBSSxDQUFDLEVBQUU7WUFDUCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUc7WUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHO1lBQ3JCLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1NBQzNCLENBQUM7UUFDRixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLG1CQUFtQixDQUFDLE1BQTZCO1FBQ3ZELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBaUIsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNGLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJdGVyYWJsZUNoYW5nZVJlY29yZCwgSXRlcmFibGVEaWZmZXIsIEl0ZXJhYmxlRGlmZmVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHR5cGUgKiBhcyBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgQzh5TWFya2VyLCBQb3NpdGlvbk1hbmFnZWRPYmplY3QgfSBmcm9tICcuL21hcC5tb2RlbCc7XG5pbXBvcnQgeyBNYXBTZXJ2aWNlIH0gZnJvbSAnLi9tYXAuc2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBDbHVzdGVyTWFwIHtcbiAgbWFya2VyczogQzh5TWFya2VyW10gPSBbXTtcbiAgcG9zaXRpb25zOiBQb3NpdGlvbk1hbmFnZWRPYmplY3RbXSA9IFtdO1xuXG4gIHNldCBjbHVzdGVyTWFya2VyKGl0ZW06IEwuTGF5ZXIpIHtcbiAgICB0aGlzLnJlbW92ZUNsdXN0ZXJUb0JpZ01hcmtlcigpO1xuICAgIHRoaXMuX2NsdXN0ZXJNYXJrZXIgPSBpdGVtO1xuICB9XG5cbiAgZ2V0IGNsdXN0ZXJNYXJrZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsdXN0ZXJNYXJrZXI7XG4gIH1cblxuICBzZXQgcmVjdChpdGVtOiBMLlJlY3RhbmdsZSkge1xuICAgIGlmICh0aGlzLl9yZWN0KSB7XG4gICAgICB0aGlzLl9yZWN0LnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLl9yZWN0ID0gaXRlbTtcbiAgfVxuXG4gIGdldCByZWN0KCkge1xuICAgIHJldHVybiB0aGlzLl9yZWN0O1xuICB9XG5cbiAgcHJpdmF0ZSBfY2x1c3Rlck1hcmtlcjogTC5MYXllcjtcbiAgcHJpdmF0ZSBfcmVjdDogTC5SZWN0YW5nbGU7XG4gIHByaXZhdGUgaXRlcmFibGVEaWZmZXI6IEl0ZXJhYmxlRGlmZmVyPFBvc2l0aW9uTWFuYWdlZE9iamVjdD4gfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaXRlcmFibGU6IEl0ZXJhYmxlRGlmZmVycyxcbiAgICBwcml2YXRlIGFkZEFzc2V0Q2FsbGJhY2s6IChhc3NldDogUG9zaXRpb25NYW5hZ2VkT2JqZWN0KSA9PiBDOHlNYXJrZXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuaXRlcmFibGVEaWZmZXIgPSB0aGlzLml0ZXJhYmxlLmZpbmQodGhpcy5wb3NpdGlvbnMpLmNyZWF0ZSh0aGlzLnRyYWNrQnkpO1xuICB9XG5cbiAgcmVuZGVyKG1hcDogTC5NYXApIHtcbiAgICBpZiAodGhpcy5fcmVjdCkge1xuICAgICAgdGhpcy5fcmVjdC5hZGRUbyhtYXApO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNoYW5nZXMobWFwKTtcbiAgICBpZiAodGhpcy5fY2x1c3Rlck1hcmtlcikge1xuICAgICAgdGhpcy5fY2x1c3Rlck1hcmtlci5hZGRUbyhtYXApO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKG1hcDogTC5NYXApIHtcbiAgICB0aGlzLnJlbW92ZUNsdXN0ZXJUb0JpZ01hcmtlcigpO1xuICAgIHRoaXMuX3JlY3QucmVtb3ZlKCk7XG4gICAgdGhpcy5wb3NpdGlvbnMgPSBbXTtcbiAgICB0aGlzLnVwZGF0ZUNoYW5nZXMobWFwKTtcbiAgfVxuXG4gIHJlbW92ZUNsdXN0ZXJUb0JpZ01hcmtlcigpIHtcbiAgICBpZiAodGhpcy5fY2x1c3Rlck1hcmtlcikge1xuICAgICAgdGhpcy5fY2x1c3Rlck1hcmtlci5yZW1vdmUoKTtcbiAgICAgIHRoaXMuX2NsdXN0ZXJNYXJrZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFkZE1hcmtlclRvTWFwKGRldmljZTogUG9zaXRpb25NYW5hZ2VkT2JqZWN0LCBtYXA6IEwuTWFwKSB7XG4gICAgY29uc3QgbWFya2VyID0gdGhpcy5hZGRBc3NldENhbGxiYWNrKGRldmljZSk7XG4gICAgdGhpcy5tYXJrZXJzLnB1c2gobWFya2VyKTtcbiAgICBtYXJrZXIuYWRkVG8obWFwKTtcbiAgfVxuXG4gIHNldENsdXN0ZXJUb0JpZ01hcmtlcihtYXA6IEwuTWFwLCBjb3VudCwgbGVhZmxldDogdHlwZW9mIEwpIHtcbiAgICBjb25zdCBib3VuZCA9IHRoaXMucmVjdC5nZXRCb3VuZHMoKTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnWm9vbSBpbicpKTtcbiAgICBjb25zdCBkaXZNYXJrZXIgPSBsZWFmbGV0LmRpdkljb24oe1xuICAgICAgaHRtbDogYDxkaXYgY2xhc3M9XCJjOHktbWFwLW1hcmtlci1jb3VudFwiIGRhdGEtY291bnQ9XCIke2NvdW50fVwiIHRpdGxlPVwiJHt0ZXh0fVwiPjwvZGl2PmBcbiAgICB9KTtcbiAgICBjb25zdCBsYWJlbEljb24gPSBsZWFmbGV0Lm1hcmtlcihib3VuZC5nZXRDZW50ZXIoKSwge1xuICAgICAgaWNvbjogZGl2TWFya2VyXG4gICAgfSk7XG4gICAgbGFiZWxJY29uLmFkZFRvKG1hcCk7XG4gICAgbGFiZWxJY29uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgIG1hcC5maXRCb3VuZHMoYm91bmQpO1xuICAgIH0pO1xuICAgIHRoaXMuY2x1c3Rlck1hcmtlciA9IGxhYmVsSWNvbjtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2hhbmdlcyhtYXA6IEwuTWFwKSB7XG4gICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuaXRlcmFibGVEaWZmZXIuZGlmZih0aGlzLnBvc2l0aW9ucyk7XG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPFBvc2l0aW9uTWFuYWdlZE9iamVjdD4pID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmVNYXJrZXJGcm9tTWFwKHJlY29yZC5pdGVtKTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0oKHJlY29yZDogSXRlcmFibGVDaGFuZ2VSZWNvcmQ8UG9zaXRpb25NYW5hZ2VkT2JqZWN0PikgPT4ge1xuICAgICAgICB0aGlzLmFkZE1hcmtlclRvTWFwKHJlY29yZC5pdGVtLCBtYXApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0cmFja0J5KGluZGV4OiBudW1iZXIsIGl0ZW06IFBvc2l0aW9uTWFuYWdlZE9iamVjdCkge1xuICAgIGNvbnN0IHRyYWNrSXRlbXMgPSBbXG4gICAgICBpdGVtLmlkLFxuICAgICAgaXRlbS5jOHlfUG9zaXRpb24ubGF0LFxuICAgICAgaXRlbS5jOHlfUG9zaXRpb24ubG5nLFxuICAgICAgTWFwU2VydmljZS5nZXRTdGF0dXMoaXRlbSlcbiAgICBdO1xuICAgIHJldHVybiB0cmFja0l0ZW1zLmpvaW4oJycpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVNYXJrZXJGcm9tTWFwKGRldmljZTogUG9zaXRpb25NYW5hZ2VkT2JqZWN0KSB7XG4gICAgY29uc3QgbWFya2VycyA9IHRoaXMubWFya2Vycy5maWx0ZXIoKG1hcmtlcjogQzh5TWFya2VyKSA9PiBtYXJrZXIuYXNzZXQ/LmlkID09PSBkZXZpY2UuaWQpO1xuICAgIG1hcmtlcnMuZm9yRWFjaChtYXJrZXIgPT4gbWFya2VyLnJlbW92ZSgpKTtcbiAgfVxufVxuIl19