@smarterplan/ngx-smarterplan-locations 0.4.7 → 0.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -27,12 +27,14 @@ export class MapPopupComponent {
27
27
  this.marker.openPopup();
28
28
  this.isOnPopup = false;
29
29
  this.popuparea = document.querySelector(".leaflet-popup");
30
- this.popuparea.addEventListener("mouseleave", () => {
31
- this.closePopup();
32
- });
33
- this.popuparea.addEventListener("mouseover", () => {
34
- this.isOnPopup = true;
35
- });
30
+ if (this.popuparea) {
31
+ this.popuparea.addEventListener("mouseleave", () => {
32
+ this.closePopup();
33
+ });
34
+ this.popuparea.addEventListener("mouseover", () => {
35
+ this.isOnPopup = true;
36
+ });
37
+ }
36
38
  this.marker.on("mouseout", () => {
37
39
  this.closePopup();
38
40
  });
@@ -62,10 +64,10 @@ export class MapPopupComponent {
62
64
  });
63
65
  }
64
66
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapPopupComponent, deps: [{ token: i1.Router }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
65
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MapPopupComponent, selector: "lib-map-popup", ngImport: i0, template: "<div id=\"map-popup\">\r\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\r\n <img [src]=\"space.annexes\" />\r\n </div>\r\n <div class=\"map-popup-details\">\r\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\r\n <span class=\"map-popup-address\">{{space.addresses}}</span>\r\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\r\n [style.cursor]=\"'pointer'\">\u27A4 {{ visit.name ? visit.name : space.name}}</span>\r\n </div>\r\n</div>\r\n", styles: [".map-popup-header{height:120px;overflow:hidden;border-top-right-radius:20px;border-top-left-radius:20px}.map-popup-header img{width:100%;position:relative;top:50%;transform:translateY(-50%)}.map-popup-details{padding:5px 10px 10px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;background-color:#fff;color:#000}.map-popup-details{display:flex;flex-direction:column}.map-popup-details h1{font-size:1.5rem;font-weight:700;margin-bottom:0;color:var(--smarterplan-primary)}.map-popup-address{align-self:flex-end;margin-bottom:10px}.map-popup-visit{color:var(--smarterplan-primary);font-size:1.15rem}.map-popup-visit:hover{color:var(--smarterplan-primary)}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
67
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MapPopupComponent, selector: "lib-map-popup", ngImport: i0, template: "<div id=\"map-popup\">\r\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\r\n <img [src]=\"space.annexes\" />\r\n </div>\r\n <div class=\"map-popup-details\">\r\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\r\n <span class=\"map-popup-address\">{{space.addresses}}</span>\r\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\r\n [style.cursor]=\"'pointer'\">\u27A4 {{ visit.name ? visit.name : space.name}}</span>\r\n </div>\r\n</div>\r\n", styles: [":host{display:none!important}:host-context(.leaflet-popup-content){display:block!important}.map-popup-header{height:120px;overflow:hidden;border-top-right-radius:20px;border-top-left-radius:20px}.map-popup-header img{width:100%;position:relative;top:50%;transform:translateY(-50%)}.map-popup-details{padding:5px 10px 10px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;background-color:#fff;color:#000}.map-popup-details{display:flex;flex-direction:column}.map-popup-details h1{font-size:1.5rem;font-weight:700;margin-bottom:0;color:var(--smarterplan-primary)}.map-popup-address{align-self:flex-end;margin-bottom:10px}.map-popup-visit{color:var(--smarterplan-primary);font-size:1.15rem}.map-popup-visit:hover{color:var(--smarterplan-primary)}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
66
68
  }
67
69
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapPopupComponent, decorators: [{
68
70
  type: Component,
69
- args: [{ selector: 'lib-map-popup', template: "<div id=\"map-popup\">\r\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\r\n <img [src]=\"space.annexes\" />\r\n </div>\r\n <div class=\"map-popup-details\">\r\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\r\n <span class=\"map-popup-address\">{{space.addresses}}</span>\r\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\r\n [style.cursor]=\"'pointer'\">\u27A4 {{ visit.name ? visit.name : space.name}}</span>\r\n </div>\r\n</div>\r\n", styles: [".map-popup-header{height:120px;overflow:hidden;border-top-right-radius:20px;border-top-left-radius:20px}.map-popup-header img{width:100%;position:relative;top:50%;transform:translateY(-50%)}.map-popup-details{padding:5px 10px 10px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;background-color:#fff;color:#000}.map-popup-details{display:flex;flex-direction:column}.map-popup-details h1{font-size:1.5rem;font-weight:700;margin-bottom:0;color:var(--smarterplan-primary)}.map-popup-address{align-self:flex-end;margin-bottom:10px}.map-popup-visit{color:var(--smarterplan-primary);font-size:1.15rem}.map-popup-visit:hover{color:var(--smarterplan-primary)}\n"] }]
71
+ args: [{ selector: 'lib-map-popup', template: "<div id=\"map-popup\">\r\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\r\n <img [src]=\"space.annexes\" />\r\n </div>\r\n <div class=\"map-popup-details\">\r\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\r\n <span class=\"map-popup-address\">{{space.addresses}}</span>\r\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\r\n [style.cursor]=\"'pointer'\">\u27A4 {{ visit.name ? visit.name : space.name}}</span>\r\n </div>\r\n</div>\r\n", styles: [":host{display:none!important}:host-context(.leaflet-popup-content){display:block!important}.map-popup-header{height:120px;overflow:hidden;border-top-right-radius:20px;border-top-left-radius:20px}.map-popup-header img{width:100%;position:relative;top:50%;transform:translateY(-50%)}.map-popup-details{padding:5px 10px 10px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;background-color:#fff;color:#000}.map-popup-details{display:flex;flex-direction:column}.map-popup-details h1{font-size:1.5rem;font-weight:700;margin-bottom:0;color:var(--smarterplan-primary)}.map-popup-address{align-self:flex-end;margin-bottom:10px}.map-popup-visit{color:var(--smarterplan-primary);font-size:1.15rem}.map-popup-visit:hover{color:var(--smarterplan-primary)}\n"] }]
70
72
  }], ctorParameters: () => [{ type: i1.Router }, { type: i0.NgZone }] });
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXBvcHVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9tYXAvbWFwLXBvcHVwL21hcC1wb3B1cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tbG9jYXRpb25zL3NyYy9saWIvY29tcG9uZW50cy9sb2NhdGlvbnMvbWFwL21hcC1wb3B1cC9tYXAtcG9wdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7Ozs7QUFVMUQsTUFBTSxPQUFPLGlCQUFpQjtJQVlOO0lBQXdCO0lBVjVDLEtBQUssQ0FBUTtJQUViLE1BQU0sQ0FBUztJQUVmLFNBQVMsQ0FBYztJQUV2QixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRWxCLFlBQVksR0FBRyxJQUFJLENBQUM7SUFFcEIsWUFBb0IsTUFBYyxFQUFVLE1BQWM7UUFBdEMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7SUFBSSxDQUFDO0lBRS9ELFFBQVE7UUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsU0FBUztRQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1lBQy9DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtZQUM5QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFVBQVU7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixzQ0FBc0M7UUFDdEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0IsQ0FBQztRQUNMLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFRCxpQkFBaUI7UUFDYixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQVk7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQzNDLFdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO2FBQzFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzt3R0FsRVEsaUJBQWlCOzRGQUFqQixpQkFBaUIscURDVjlCLGluQkFXQTs7NEZERGEsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE5nWm9uZSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE1hcmtlciB9IGZyb20gJ2xlYWZsZXQnO1xyXG5pbXBvcnQgeyBTcGFjZSwgVmlzaXQgfSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItbWFwLXBvcHVwJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbWFwLXBvcHVwLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9tYXAtcG9wdXAuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWFwUG9wdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIHNwYWNlOiBTcGFjZTtcclxuXHJcbiAgICBtYXJrZXI6IE1hcmtlcjtcclxuXHJcbiAgICBwb3B1cGFyZWE6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGlzT25Qb3B1cCA9IGZhbHNlO1xyXG5cclxuICAgIGlzTXVzZXVtVXNlciA9IHRydWU7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkgeyB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5tYXJrZXIub24oXCJjbGlja1wiLCAoKSA9PiB0aGlzLm9uQ2xpY2tWaXNpdEZpcnN0KCkpO1xyXG5cclxuICAgICAgICB0aGlzLm1hcmtlci5vbihcIm1vdXNlb3ZlclwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNPblBvcHVwID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm1hcmtlci5pc1BvcHVwT3BlbigpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5Qb3B1cCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb3BlblBvcHVwKCkge1xyXG4gICAgICAgIHRoaXMubWFya2VyLm9wZW5Qb3B1cCgpO1xyXG5cclxuICAgICAgICB0aGlzLmlzT25Qb3B1cCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucG9wdXBhcmVhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5sZWFmbGV0LXBvcHVwXCIpO1xyXG5cclxuICAgICAgICB0aGlzLnBvcHVwYXJlYS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucG9wdXBhcmVhLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzT25Qb3B1cCA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5tYXJrZXIub24oXCJtb3VzZW91dFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlUG9wdXAoKSB7XHJcbiAgICAgICAgdGhpcy5pc09uUG9wdXAgPSBmYWxzZTtcclxuICAgICAgICAvKiogV2Ugd2FudCB0byB3YWl0IHRvIGF2b2lkIGdsaXRjaCAqL1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNPblBvcHVwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlci5jbG9zZVBvcHVwKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAxMDApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2tWaXNpdEZpcnN0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNwYWNlLnZpc2l0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJObyBzcGFjZSB0byB2aXNpdCAhXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMub25WaXNpdENsaWNrKHRoaXMuc3BhY2UudmlzaXRzWzBdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25WaXNpdENsaWNrKHZpc2l0OiBWaXNpdCkge1xyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInZpc2l0XCIsIHRoaXMuc3BhY2UuaWRdLCB7XHJcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogeyBtb2RlbDNEOiB2aXNpdC5tb2RlbDNkIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGlkPVwibWFwLXBvcHVwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWFwLXBvcHVwLWhlYWRlclwiIChjbGljayk9XCJvbkNsaWNrVmlzaXRGaXJzdCgpXCIgW3N0eWxlLmN1cnNvcl09XCIncG9pbnRlcidcIj5cclxuICAgICAgICA8aW1nIFtzcmNdPVwic3BhY2UuYW5uZXhlc1wiIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtYXAtcG9wdXAtZGV0YWlsc1wiPlxyXG4gICAgPGgxIChjbGljayk9XCJvbkNsaWNrVmlzaXRGaXJzdCgpXCIgW3N0eWxlLmN1cnNvcl09XCIncG9pbnRlcidcIj57e3NwYWNlLm5hbWV9fTwvaDE+XHJcbiAgICA8c3BhbiBjbGFzcz1cIm1hcC1wb3B1cC1hZGRyZXNzXCI+e3tzcGFjZS5hZGRyZXNzZXN9fTwvc3Bhbj5cclxuICAgIDxzcGFuICpuZ0Zvcj1cImxldCB2aXNpdCBvZiBzcGFjZS52aXNpdHNcIiBjbGFzcz1cIm1hcC1wb3B1cC12aXNpdFwiIChjbGljayk9XCJvblZpc2l0Q2xpY2sodmlzaXQpXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmN1cnNvcl09XCIncG9pbnRlcidcIj7inqQge3sgdmlzaXQubmFtZSA/IHZpc2l0Lm5hbWUgOiBzcGFjZS5uYW1lfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXBvcHVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9tYXAvbWFwLXBvcHVwL21hcC1wb3B1cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tbG9jYXRpb25zL3NyYy9saWIvY29tcG9uZW50cy9sb2NhdGlvbnMvbWFwL21hcC1wb3B1cC9tYXAtcG9wdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7Ozs7QUFVMUQsTUFBTSxPQUFPLGlCQUFpQjtJQVlOO0lBQXdCO0lBVjVDLEtBQUssQ0FBUTtJQUViLE1BQU0sQ0FBUztJQUVmLFNBQVMsQ0FBYztJQUV2QixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRWxCLFlBQVksR0FBRyxJQUFJLENBQUM7SUFFcEIsWUFBb0IsTUFBYyxFQUFVLE1BQWM7UUFBdEMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7SUFBSSxDQUFDO0lBRS9ELFFBQVE7UUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsU0FBUztRQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFnQixDQUFDO1FBRXpFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtnQkFDL0MsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO2dCQUM5QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO1lBQzVCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxVQUFVO1FBQ04sSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsc0NBQXNDO1FBQ3RDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdCLENBQUM7UUFDTCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWixDQUFDO0lBRUQsaUJBQWlCO1FBQ2IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFZO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUMzQyxXQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTthQUMxQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7d0dBcEVRLGlCQUFpQjs0RkFBakIsaUJBQWlCLHFEQ1Y5QixpbkJBV0E7OzRGRERhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBOZ1pvbmUsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBNYXJrZXIgfSBmcm9tICdsZWFmbGV0JztcclxuaW1wb3J0IHsgU3BhY2UsIFZpc2l0IH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLW1hcC1wb3B1cCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL21hcC1wb3B1cC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbWFwLXBvcHVwLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE1hcFBvcHVwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBzcGFjZTogU3BhY2U7XHJcblxyXG4gICAgbWFya2VyOiBNYXJrZXI7XHJcblxyXG4gICAgcG9wdXBhcmVhOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBpc09uUG9wdXAgPSBmYWxzZTtcclxuXHJcbiAgICBpc011c2V1bVVzZXIgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsIHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMubWFya2VyLm9uKFwiY2xpY2tcIiwgKCkgPT4gdGhpcy5vbkNsaWNrVmlzaXRGaXJzdCgpKTtcclxuXHJcbiAgICAgICAgdGhpcy5tYXJrZXIub24oXCJtb3VzZW92ZXJcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzT25Qb3B1cCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5tYXJrZXIuaXNQb3B1cE9wZW4oKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuUG9wdXAoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Qb3B1cCgpIHtcclxuICAgICAgICB0aGlzLm1hcmtlci5vcGVuUG9wdXAoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc09uUG9wdXAgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnBvcHVwYXJlYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubGVhZmxldC1wb3B1cFwiKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucG9wdXBhcmVhKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9wdXBhcmVhLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5wb3B1cGFyZWEuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzT25Qb3B1cCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1hcmtlci5vbihcIm1vdXNlb3V0XCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZVBvcHVwKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VQb3B1cCgpIHtcclxuICAgICAgICB0aGlzLmlzT25Qb3B1cCA9IGZhbHNlO1xyXG4gICAgICAgIC8qKiBXZSB3YW50IHRvIHdhaXQgdG8gYXZvaWQgZ2xpdGNoICovXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc09uUG9wdXApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWFya2VyLmNsb3NlUG9wdXAoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDEwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGlja1Zpc2l0Rmlyc3QoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3BhY2UudmlzaXRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIHNwYWNlIHRvIHZpc2l0ICFcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5vblZpc2l0Q2xpY2sodGhpcy5zcGFjZS52aXNpdHNbMF0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblZpc2l0Q2xpY2sodmlzaXQ6IFZpc2l0KSB7XHJcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1widmlzaXRcIiwgdGhpcy5zcGFjZS5pZF0sIHtcclxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IG1vZGVsM0Q6IHZpc2l0Lm1vZGVsM2QgfSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiIsIjxkaXYgaWQ9XCJtYXAtcG9wdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtYXAtcG9wdXAtaGVhZGVyXCIgKGNsaWNrKT1cIm9uQ2xpY2tWaXNpdEZpcnN0KClcIiBbc3R5bGUuY3Vyc29yXT1cIidwb2ludGVyJ1wiPlxyXG4gICAgICAgIDxpbWcgW3NyY109XCJzcGFjZS5hbm5leGVzXCIgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1hcC1wb3B1cC1kZXRhaWxzXCI+XHJcbiAgICA8aDEgKGNsaWNrKT1cIm9uQ2xpY2tWaXNpdEZpcnN0KClcIiBbc3R5bGUuY3Vyc29yXT1cIidwb2ludGVyJ1wiPnt7c3BhY2UubmFtZX19PC9oMT5cclxuICAgIDxzcGFuIGNsYXNzPVwibWFwLXBvcHVwLWFkZHJlc3NcIj57e3NwYWNlLmFkZHJlc3Nlc319PC9zcGFuPlxyXG4gICAgPHNwYW4gKm5nRm9yPVwibGV0IHZpc2l0IG9mIHNwYWNlLnZpc2l0c1wiIGNsYXNzPVwibWFwLXBvcHVwLXZpc2l0XCIgKGNsaWNrKT1cIm9uVmlzaXRDbGljayh2aXNpdClcIlxyXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuY3Vyc29yXT1cIidwb2ludGVyJ1wiPuKepCB7eyB2aXNpdC5uYW1lID8gdmlzaXQubmFtZSA6IHNwYWNlLm5hbWV9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
@@ -1,4 +1,4 @@
1
- import { Component, Input } from '@angular/core';
1
+ import { Component, Input, ViewContainerRef, ViewChild } from '@angular/core';
2
2
  import { latLng, marker, tileLayer, latLngBounds, point, Marker, icon, } from "leaflet";
3
3
  import { MapPopupComponent } from './map-popup/map-popup.component';
4
4
  import * as i0 from "@angular/core";
@@ -18,11 +18,9 @@ const iconDefault = icon({
18
18
  });
19
19
  Marker.prototype.options.icon = iconDefault;
20
20
  export class MapComponent {
21
- viewContainerRef;
22
- constructor(viewContainerRef) {
23
- this.viewContainerRef = viewContainerRef;
24
- }
21
+ constructor() { }
25
22
  spaces;
23
+ popupContainer;
26
24
  options = {
27
25
  layers: [
28
26
  tileLayer("http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
@@ -35,57 +33,80 @@ export class MapComponent {
35
33
  };
36
34
  layers = [];
37
35
  map;
36
+ isViewInitialized = false;
38
37
  ngOnChanges(changes) {
39
38
  if (changes.spaces) {
40
- const nm = [];
41
- const bd = [];
42
- if (!changes.spaces.currentValue) {
43
- return;
44
- }
45
- // Filtering out spaces without lat/longitudes
46
- for (const s of changes.spaces.currentValue) {
47
- if (s.latitude === null || s.longitude === null) {
48
- console.log(`${s.name} has not coordinates for ${s.addresses}`);
49
- continue;
50
- }
51
- // We use the popup system from leaflet, as it packs a few improvements
52
- // on using bootstrap: autoclose other popups, closing option.
53
- const m = marker([s.latitude, s.longitude]);
54
- m.bindPopup(this.createPopupComponent(s, m));
55
- nm.push(m);
56
- bd.push(latLng(s.latitude, s.longitude));
39
+ if (this.isViewInitialized) {
40
+ this.rebuildLayers();
57
41
  }
58
- // Note how we set the layers in one assignment, in order to have leaflet
59
- // detects the change correctly
60
- // We also set the bounds afterward, for the map to be properly zoomed and
61
- // centered
62
- this.layers = nm;
63
- if (this.map && bd.length > 0) {
64
- this.map.fitBounds(latLngBounds(bd), {
65
- padding: point(48, 48),
66
- maxZoom: 12,
67
- animate: true,
68
- });
42
+ }
43
+ }
44
+ ngAfterViewInit() {
45
+ this.isViewInitialized = true;
46
+ this.rebuildLayers();
47
+ }
48
+ rebuildLayers() {
49
+ if (!this.spaces) {
50
+ return;
51
+ }
52
+ const nm = [];
53
+ const bd = [];
54
+ // Clear previous components to avoid leakage.
55
+ // this.viewContainerRef.clear(); // Removed as we use the dedicated container
56
+ if (this.popupContainer) {
57
+ this.popupContainer.clear();
58
+ }
59
+ // Filtering out spaces without lat/longitudes
60
+ for (const s of this.spaces) {
61
+ if (s.latitude === null || s.longitude === null) {
62
+ console.log(`${s.name} has not coordinates for ${s.addresses}`);
63
+ continue;
69
64
  }
65
+ // We use the popup system from leaflet, as it packs a few improvements
66
+ // on using bootstrap: autoclose other popups, closing option.
67
+ const m = marker([s.latitude, s.longitude]);
68
+ m.bindPopup(this.createPopupComponent(s, m));
69
+ nm.push(m);
70
+ bd.push(latLng(s.latitude, s.longitude));
71
+ }
72
+ // Note how we set the layers in one assignment, in order to have leaflet
73
+ // detects the change correctly
74
+ // We also set the bounds afterward, for the map to be properly zoomed and
75
+ // centered
76
+ this.layers = nm;
77
+ if (this.map && bd.length > 0) {
78
+ this.map.fitBounds(latLngBounds(bd), {
79
+ padding: point(48, 48),
80
+ maxZoom: 12,
81
+ animate: true,
82
+ });
70
83
  }
71
84
  }
85
+ // Previous ngOnChanges logic was moved to rebuildLayers()
72
86
  onMapReady(map) {
73
87
  this.map = map;
74
88
  }
75
89
  createPopupComponent(space, marker) {
76
- const comp = this.viewContainerRef.createComponent(MapPopupComponent);
90
+ if (!this.popupContainer) {
91
+ console.warn("Popup container not ready yet");
92
+ return "";
93
+ }
94
+ const comp = this.popupContainer.createComponent(MapPopupComponent);
77
95
  comp.instance.space = space;
78
96
  comp.instance.marker = marker;
79
97
  comp.changeDetectorRef.detectChanges();
80
98
  return comp.location.nativeElement;
81
99
  }
82
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
83
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MapComponent, selector: "lib-map", inputs: { spaces: "spaces" }, usesOnChanges: true, ngImport: i0, template: "<div [leafletLayers]=\"layers\" [leafletOptions]=\"options\" (leafletMapReady)=\"onMapReady($any($event))\" id=\"map\" leaflet\r\n style=\"height: 500px; margin-top: 30px; z-index: 195\"></div>", styles: [""], dependencies: [{ kind: "directive", type: i1.LeafletDirective, selector: "[leaflet]", inputs: ["leafletFitBoundsOptions", "leafletPanOptions", "leafletZoomOptions", "leafletZoomPanOptions", "leafletOptions", "leafletZoom", "leafletCenter", "leafletFitBounds", "leafletMaxBounds", "leafletMinZoom", "leafletMaxZoom"], outputs: ["leafletMapReady", "leafletZoomChange", "leafletCenterChange", "leafletClick", "leafletDoubleClick", "leafletMouseDown", "leafletMouseUp", "leafletMouseMove", "leafletMouseOver", "leafletMouseOut", "leafletMapMove", "leafletMapMoveStart", "leafletMapMoveEnd", "leafletMapZoom", "leafletMapZoomStart", "leafletMapZoomEnd"] }, { kind: "directive", type: i1.LeafletLayersDirective, selector: "[leafletLayers]", inputs: ["leafletLayers"] }] });
100
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
101
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MapComponent, selector: "lib-map", inputs: { spaces: "spaces" }, viewQueries: [{ propertyName: "popupContainer", first: true, predicate: ["popupContainer"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<div [leafletLayers]=\"layers\" [leafletOptions]=\"options\" (leafletMapReady)=\"onMapReady($any($event))\" id=\"map\" leaflet\n style=\"height: 500px; margin-top: 30px; z-index: 195\"></div>\n\n<!-- Hidden container for popup components to avoid display leakage and manage lifecycle -->\n<div style=\"display: none\">\n <div #popupContainer></div>\n</div>", styles: [":host ::ng-deep lib-map-popup{display:none!important}:host ::ng-deep .leaflet-popup-content lib-map-popup{display:block!important}\n"], dependencies: [{ kind: "directive", type: i1.LeafletDirective, selector: "[leaflet]", inputs: ["leafletFitBoundsOptions", "leafletPanOptions", "leafletZoomOptions", "leafletZoomPanOptions", "leafletOptions", "leafletZoom", "leafletCenter", "leafletFitBounds", "leafletMaxBounds", "leafletMinZoom", "leafletMaxZoom"], outputs: ["leafletMapReady", "leafletZoomChange", "leafletCenterChange", "leafletClick", "leafletDoubleClick", "leafletMouseDown", "leafletMouseUp", "leafletMouseMove", "leafletMouseOver", "leafletMouseOut", "leafletMapMove", "leafletMapMoveStart", "leafletMapMoveEnd", "leafletMapZoom", "leafletMapZoomStart", "leafletMapZoomEnd"] }, { kind: "directive", type: i1.LeafletLayersDirective, selector: "[leafletLayers]", inputs: ["leafletLayers"] }] });
84
102
  }
85
103
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapComponent, decorators: [{
86
104
  type: Component,
87
- args: [{ selector: 'lib-map', template: "<div [leafletLayers]=\"layers\" [leafletOptions]=\"options\" (leafletMapReady)=\"onMapReady($any($event))\" id=\"map\" leaflet\r\n style=\"height: 500px; margin-top: 30px; z-index: 195\"></div>" }]
88
- }], ctorParameters: () => [{ type: i0.ViewContainerRef }], propDecorators: { spaces: [{
105
+ args: [{ selector: 'lib-map', template: "<div [leafletLayers]=\"layers\" [leafletOptions]=\"options\" (leafletMapReady)=\"onMapReady($any($event))\" id=\"map\" leaflet\n style=\"height: 500px; margin-top: 30px; z-index: 195\"></div>\n\n<!-- Hidden container for popup components to avoid display leakage and manage lifecycle -->\n<div style=\"display: none\">\n <div #popupContainer></div>\n</div>", styles: [":host ::ng-deep lib-map-popup{display:none!important}:host ::ng-deep .leaflet-popup-content lib-map-popup{display:block!important}\n"] }]
106
+ }], ctorParameters: () => [], propDecorators: { spaces: [{
89
107
  type: Input
108
+ }], popupContainer: [{
109
+ type: ViewChild,
110
+ args: ['popupContainer', { read: ViewContainerRef, static: true }]
90
111
  }] } });
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9tYXAvbWFwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9tYXAvbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVksS0FBSyxFQUFzRCxNQUFNLGVBQWUsQ0FBQztBQUUvRyxPQUFPLEVBQ0gsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sSUFBSSxHQUNQLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7QUFJcEUsTUFBTSxhQUFhLEdBQUcsMkJBQTJCLENBQUM7QUFDbEQsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUM7QUFDekMsTUFBTSxTQUFTLEdBQUcsMEJBQTBCLENBQUM7QUFDN0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLGFBQWE7SUFDYixPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDbEIsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNwQixXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDckIsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3hCLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDdkIsQ0FBQyxDQUFDO0FB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QixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDdkMsQ0FBQzt3R0F0RVEsWUFBWTs0RkFBWixZQUFZLGtHQ25DekIsc01BQ2dFOzs0RkRrQ25ELFlBQVk7a0JBTHhCLFNBQVM7K0JBQ0ksU0FBUztxRkFRVixNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdG9yLCBJbnB1dCwgTmdab25lLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3BhY2UgfSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQge1xyXG4gICAgbGF0TG5nLFxyXG4gICAgbWFya2VyLFxyXG4gICAgdGlsZUxheWVyLFxyXG4gICAgTWFwLFxyXG4gICAgbGF0TG5nQm91bmRzLFxyXG4gICAgcG9pbnQsXHJcbiAgICBNYXJrZXIsXHJcbiAgICBpY29uLFxyXG59IGZyb20gXCJsZWFmbGV0XCI7XHJcbmltcG9ydCB7IE1hcFBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi9tYXAtcG9wdXAvbWFwLXBvcHVwLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5cclxuY29uc3QgaWNvblJldGluYVVybCA9IFwiYXNzZXRzL21hcmtlci1pY29uLTJ4LnBuZ1wiO1xyXG5jb25zdCBpY29uVXJsID0gXCJhc3NldHMvbWFya2VyLWljb24ucG5nXCI7XHJcbmNvbnN0IHNoYWRvd1VybCA9IFwiYXNzZXRzL21hcmtlci1zaGFkb3cucG5nXCI7XHJcbmNvbnN0IGljb25EZWZhdWx0ID0gaWNvbih7XHJcbiAgICBpY29uUmV0aW5hVXJsLFxyXG4gICAgaWNvblVybCxcclxuICAgIHNoYWRvd1VybCxcclxuICAgIGljb25TaXplOiBbMjUsIDQxXSxcclxuICAgIGljb25BbmNob3I6IFsxMiwgNDFdLFxyXG4gICAgcG9wdXBBbmNob3I6IFsxLCAtMzRdLFxyXG4gICAgdG9vbHRpcEFuY2hvcjogWzE2LCAtMjhdLFxyXG4gICAgc2hhZG93U2l6ZTogWzQxLCA0MV0sXHJcbn0pO1xyXG5NYXJrZXIucHJvdG90eXBlLm9wdGlvbnMuaWNvbiA9IGljb25EZWZhdWx0O1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbGliLW1hcCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbWFwLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL21hcC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikgeyB9XHJcblxyXG4gICAgQElucHV0KCkgc3BhY2VzOiBTcGFjZVtdO1xyXG5cclxuICAgIG9wdGlvbnMgPSB7XHJcbiAgICAgICAgbGF5ZXJzOiBbXHJcbiAgICAgICAgICAgIHRpbGVMYXllcihcImh0dHA6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmdcIiwge1xyXG4gICAgICAgICAgICAgICAgbWF4Wm9vbTogMTgsXHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbjogXCIuLi5cIixcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgXSxcclxuICAgICAgICB6b29tOiA1LjUsXHJcbiAgICAgICAgY2VudGVyOiBsYXRMbmcoNDcuMDYzOTQsIDIuNzc3MzYpLFxyXG4gICAgfTtcclxuXHJcbiAgICBsYXllcnM6IGFueVtdID0gW107XHJcblxyXG4gICAgbWFwOiBhbnk7XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLnNwYWNlcykge1xyXG4gICAgICAgICAgICBjb25zdCBubSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBiZCA9IFtdO1xyXG4gICAgICAgICAgICBpZiAoIWNoYW5nZXMuc3BhY2VzLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEZpbHRlcmluZyBvdXQgc3BhY2VzIHdpdGhvdXQgbGF0L2xvbmdpdHVkZXNcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIGNoYW5nZXMuc3BhY2VzLmN1cnJlbnRWYWx1ZSBhcyBTcGFjZVtdKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocy5sYXRpdHVkZSA9PT0gbnVsbCB8fCBzLmxvbmdpdHVkZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtzLm5hbWV9IGhhcyBub3QgY29vcmRpbmF0ZXMgZm9yICR7cy5hZGRyZXNzZXN9YCxcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gV2UgdXNlIHRoZSBwb3B1cCBzeXN0ZW0gZnJvbSBsZWFmbGV0LCBhcyBpdCBwYWNrcyBhIGZldyBpbXByb3ZlbWVudHNcclxuICAgICAgICAgICAgICAgIC8vIG9uIHVzaW5nIGJvb3RzdHJhcDogYXV0b2Nsb3NlIG90aGVyIHBvcHVwcywgY2xvc2luZyBvcHRpb24uXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtID0gbWFya2VyKFtzLmxhdGl0dWRlLCBzLmxvbmdpdHVkZV0pO1xyXG5cclxuICAgICAgICAgICAgICAgIG0uYmluZFBvcHVwKHRoaXMuY3JlYXRlUG9wdXBDb21wb25lbnQocywgbSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIG5tLnB1c2gobSk7XHJcbiAgICAgICAgICAgICAgICBiZC5wdXNoKGxhdExuZyhzLmxhdGl0dWRlLCBzLmxvbmdpdHVkZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIE5vdGUgaG93IHdlIHNldCB0aGUgbGF5ZXJzIGluIG9uZSBhc3NpZ25tZW50LCBpbiBvcmRlciB0byBoYXZlIGxlYWZsZXRcclxuICAgICAgICAgICAgLy8gZGV0ZWN0cyB0aGUgY2hhbmdlIGNvcnJlY3RseVxyXG4gICAgICAgICAgICAvLyBXZSBhbHNvIHNldCB0aGUgYm91bmRzIGFmdGVyd2FyZCwgZm9yIHRoZSBtYXAgdG8gYmUgcHJvcGVybHkgem9vbWVkIGFuZFxyXG4gICAgICAgICAgICAvLyBjZW50ZXJlZFxyXG4gICAgICAgICAgICB0aGlzLmxheWVycyA9IG5tO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tYXAgJiYgYmQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXAuZml0Qm91bmRzKGxhdExuZ0JvdW5kcyhiZCksIHtcclxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBwb2ludCg0OCwgNDgpLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heFpvb206IDEyLFxyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbk1hcFJlYWR5KG1hcDogTWFwKSB7XHJcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlUG9wdXBDb21wb25lbnQoc3BhY2U6IFNwYWNlLCBtYXJrZXI6IE1hcmtlcikge1xyXG4gICAgICAgIGNvbnN0IGNvbXAgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KE1hcFBvcHVwQ29tcG9uZW50KTtcclxuICAgICAgICBjb21wLmluc3RhbmNlLnNwYWNlID0gc3BhY2U7XHJcbiAgICAgICAgY29tcC5pbnN0YW5jZS5tYXJrZXIgPSBtYXJrZXI7XHJcbiAgICAgICAgY29tcC5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgcmV0dXJuIGNvbXAubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiPGRpdiBbbGVhZmxldExheWVyc109XCJsYXllcnNcIiBbbGVhZmxldE9wdGlvbnNdPVwib3B0aW9uc1wiIChsZWFmbGV0TWFwUmVhZHkpPVwib25NYXBSZWFkeSgkYW55KCRldmVudCkpXCIgaWQ9XCJtYXBcIiBsZWFmbGV0XHJcbiAgICBzdHlsZT1cImhlaWdodDogNTAwcHg7IG1hcmdpbi10b3A6IDMwcHg7IHotaW5kZXg6IDE5NVwiPjwvZGl2PiJdfQ==
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9tYXAvbWFwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9tYXAvbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVksS0FBSyxFQUFvQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBRXpJLE9BQU8sRUFDSCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixJQUFJLEdBQ1AsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7OztBQUlwRSxNQUFNLGFBQWEsR0FBRywyQkFBMkIsQ0FBQztBQUNsRCxNQUFNLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQztBQUN6QyxNQUFNLFNBQVMsR0FBRywwQkFBMEIsQ0FBQztBQUM3QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDckIsYUFBYTtJQUNiLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNsQixVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3BCLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNyQixhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDeEIsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUs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Q0wsQ0FBQztJQUVELDBEQUEwRDtJQUUxRCxVQUFVLENBQUMsR0FBUTtRQUNmLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFZLEVBQUUsTUFBYztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUM5QyxPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDdkMsQ0FBQzt3R0FqR1EsWUFBWTs0RkFBWixZQUFZLDBLQUtnQixnQkFBZ0IsZ0VDeEN6RCw0V0FNTTs7NEZENkJPLFlBQVk7a0JBTHhCLFNBQVM7K0JBQ0ksU0FBUzt3REFRVixNQUFNO3NCQUFkLEtBQUs7Z0JBQ2lFLGNBQWM7c0JBQXBGLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0b3IsIElucHV0LCBOZ1pvbmUsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0NvbnRhaW5lclJlZiwgVmlld0NoaWxkLCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNwYWNlIH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuaW1wb3J0IHtcclxuICAgIGxhdExuZyxcclxuICAgIG1hcmtlcixcclxuICAgIHRpbGVMYXllcixcclxuICAgIE1hcCxcclxuICAgIGxhdExuZ0JvdW5kcyxcclxuICAgIHBvaW50LFxyXG4gICAgTWFya2VyLFxyXG4gICAgaWNvbixcclxufSBmcm9tIFwibGVhZmxldFwiO1xyXG5pbXBvcnQgeyBNYXBQb3B1cENvbXBvbmVudCB9IGZyb20gJy4vbWFwLXBvcHVwL21hcC1wb3B1cC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuXHJcbmNvbnN0IGljb25SZXRpbmFVcmwgPSBcImFzc2V0cy9tYXJrZXItaWNvbi0yeC5wbmdcIjtcclxuY29uc3QgaWNvblVybCA9IFwiYXNzZXRzL21hcmtlci1pY29uLnBuZ1wiO1xyXG5jb25zdCBzaGFkb3dVcmwgPSBcImFzc2V0cy9tYXJrZXItc2hhZG93LnBuZ1wiO1xyXG5jb25zdCBpY29uRGVmYXVsdCA9IGljb24oe1xyXG4gICAgaWNvblJldGluYVVybCxcclxuICAgIGljb25VcmwsXHJcbiAgICBzaGFkb3dVcmwsXHJcbiAgICBpY29uU2l6ZTogWzI1LCA0MV0sXHJcbiAgICBpY29uQW5jaG9yOiBbMTIsIDQxXSxcclxuICAgIHBvcHVwQW5jaG9yOiBbMSwgLTM0XSxcclxuICAgIHRvb2x0aXBBbmNob3I6IFsxNiwgLTI4XSxcclxuICAgIHNoYWRvd1NpemU6IFs0MSwgNDFdLFxyXG59KTtcclxuTWFya2VyLnByb3RvdHlwZS5vcHRpb25zLmljb24gPSBpY29uRGVmYXVsdDtcclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1tYXAnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL21hcC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9tYXAuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWFwQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICAgIEBJbnB1dCgpIHNwYWNlczogU3BhY2VbXTtcclxuICAgIEBWaWV3Q2hpbGQoJ3BvcHVwQ29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSkgcG9wdXBDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XHJcblxyXG4gICAgb3B0aW9ucyA9IHtcclxuICAgICAgICBsYXllcnM6IFtcclxuICAgICAgICAgICAgdGlsZUxheWVyKFwiaHR0cDovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZ1wiLCB7XHJcbiAgICAgICAgICAgICAgICBtYXhab29tOiAxOCxcclxuICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uOiBcIi4uLlwiLFxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHpvb206IDUuNSxcclxuICAgICAgICBjZW50ZXI6IGxhdExuZyg0Ny4wNjM5NCwgMi43NzczNiksXHJcbiAgICB9O1xyXG5cclxuICAgIGxheWVyczogYW55W10gPSBbXTtcclxuXHJcbiAgICBtYXA6IGFueTtcclxuICAgIHByaXZhdGUgaXNWaWV3SW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMuc3BhY2VzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmlld0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGRMYXllcnMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgdGhpcy5pc1ZpZXdJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkTGF5ZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWJ1aWxkTGF5ZXJzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zcGFjZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgbm0gPSBbXTtcclxuICAgICAgICBjb25zdCBiZCA9IFtdO1xyXG5cclxuICAgICAgICAvLyBDbGVhciBwcmV2aW91cyBjb21wb25lbnRzIHRvIGF2b2lkIGxlYWthZ2UuIFxyXG4gICAgICAgIC8vIHRoaXMudmlld0NvbnRhaW5lclJlZi5jbGVhcigpOyAvLyBSZW1vdmVkIGFzIHdlIHVzZSB0aGUgZGVkaWNhdGVkIGNvbnRhaW5lclxyXG4gICAgICAgIGlmICh0aGlzLnBvcHVwQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9wdXBDb250YWluZXIuY2xlYXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEZpbHRlcmluZyBvdXQgc3BhY2VzIHdpdGhvdXQgbGF0L2xvbmdpdHVkZXNcclxuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5zcGFjZXMpIHtcclxuICAgICAgICAgICAgaWYgKHMubGF0aXR1ZGUgPT09IG51bGwgfHwgcy5sb25naXR1ZGUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICAgICAgIGAke3MubmFtZX0gaGFzIG5vdCBjb29yZGluYXRlcyBmb3IgJHtzLmFkZHJlc3Nlc31gLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgcG9wdXAgc3lzdGVtIGZyb20gbGVhZmxldCwgYXMgaXQgcGFja3MgYSBmZXcgaW1wcm92ZW1lbnRzXHJcbiAgICAgICAgICAgIC8vIG9uIHVzaW5nIGJvb3RzdHJhcDogYXV0b2Nsb3NlIG90aGVyIHBvcHVwcywgY2xvc2luZyBvcHRpb24uXHJcbiAgICAgICAgICAgIGNvbnN0IG0gPSBtYXJrZXIoW3MubGF0aXR1ZGUsIHMubG9uZ2l0dWRlXSk7XHJcblxyXG4gICAgICAgICAgICBtLmJpbmRQb3B1cCh0aGlzLmNyZWF0ZVBvcHVwQ29tcG9uZW50KHMsIG0pKTtcclxuXHJcbiAgICAgICAgICAgIG5tLnB1c2gobSk7XHJcbiAgICAgICAgICAgIGJkLnB1c2gobGF0TG5nKHMubGF0aXR1ZGUsIHMubG9uZ2l0dWRlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE5vdGUgaG93IHdlIHNldCB0aGUgbGF5ZXJzIGluIG9uZSBhc3NpZ25tZW50LCBpbiBvcmRlciB0byBoYXZlIGxlYWZsZXRcclxuICAgICAgICAvLyBkZXRlY3RzIHRoZSBjaGFuZ2UgY29ycmVjdGx5XHJcbiAgICAgICAgLy8gV2UgYWxzbyBzZXQgdGhlIGJvdW5kcyBhZnRlcndhcmQsIGZvciB0aGUgbWFwIHRvIGJlIHByb3Blcmx5IHpvb21lZCBhbmRcclxuICAgICAgICAvLyBjZW50ZXJlZFxyXG4gICAgICAgIHRoaXMubGF5ZXJzID0gbm07XHJcbiAgICAgICAgaWYgKHRoaXMubWFwICYmIGJkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5tYXAuZml0Qm91bmRzKGxhdExuZ0JvdW5kcyhiZCksIHtcclxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IHBvaW50KDQ4LCA0OCksXHJcbiAgICAgICAgICAgICAgICBtYXhab29tOiAxMixcclxuICAgICAgICAgICAgICAgIGFuaW1hdGU6IHRydWUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBQcmV2aW91cyBuZ09uQ2hhbmdlcyBsb2dpYyB3YXMgbW92ZWQgdG8gcmVidWlsZExheWVycygpXHJcblxyXG4gICAgb25NYXBSZWFkeShtYXA6IE1hcCkge1xyXG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVBvcHVwQ29tcG9uZW50KHNwYWNlOiBTcGFjZSwgbWFya2VyOiBNYXJrZXIpIHtcclxuICAgICAgICBpZiAoIXRoaXMucG9wdXBDb250YWluZXIpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiUG9wdXAgY29udGFpbmVyIG5vdCByZWFkeSB5ZXRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb21wID0gdGhpcy5wb3B1cENvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoTWFwUG9wdXBDb21wb25lbnQpO1xyXG4gICAgICAgIGNvbXAuaW5zdGFuY2Uuc3BhY2UgPSBzcGFjZTtcclxuICAgICAgICBjb21wLmluc3RhbmNlLm1hcmtlciA9IG1hcmtlcjtcclxuICAgICAgICBjb21wLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICByZXR1cm4gY29tcC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IFtsZWFmbGV0TGF5ZXJzXT1cImxheWVyc1wiIFtsZWFmbGV0T3B0aW9uc109XCJvcHRpb25zXCIgKGxlYWZsZXRNYXBSZWFkeSk9XCJvbk1hcFJlYWR5KCRhbnkoJGV2ZW50KSlcIiBpZD1cIm1hcFwiIGxlYWZsZXRcbiAgICBzdHlsZT1cImhlaWdodDogNTAwcHg7IG1hcmdpbi10b3A6IDMwcHg7IHotaW5kZXg6IDE5NVwiPjwvZGl2PlxuXG48IS0tIEhpZGRlbiBjb250YWluZXIgZm9yIHBvcHVwIGNvbXBvbmVudHMgdG8gYXZvaWQgZGlzcGxheSBsZWFrYWdlIGFuZCBtYW5hZ2UgbGlmZWN5Y2xlIC0tPlxuPGRpdiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj5cbiAgICA8ZGl2ICNwb3B1cENvbnRhaW5lcj48L2Rpdj5cbjwvZGl2PiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, EventEmitter, Input, Output, Component, ViewChild, Pipe, HostListener, NgModule } from '@angular/core';
2
+ import { Injectable, EventEmitter, Input, Output, Component, ViewContainerRef, ViewChild, Pipe, HostListener, NgModule } from '@angular/core';
3
3
  import * as i2 from '@smarterplan/ngx-smarterplan-core';
4
4
  import { enumToArray, LevelStatus, textValidator, noEmptyValidator, floatValidator, uploadFileToS3, deleteFromS3, PropertyType, getSignedImageUrlForSpace, SearchObjectType, SpaceStatus, getMetaForImage, getSignedFile, downloadFileAsObject, downloadBlob, CaptureViewer, showScanPointsOnPlanInDiv, getCoefficientsForImage, CommentType, SpModule, wait, InventoryStatus, NgxSmarterplanCoreModule } from '@smarterplan/ngx-smarterplan-core';
5
5
  import * as i1 from '@angular/router';
@@ -96,12 +96,14 @@ class MapPopupComponent {
96
96
  this.marker.openPopup();
97
97
  this.isOnPopup = false;
98
98
  this.popuparea = document.querySelector(".leaflet-popup");
99
- this.popuparea.addEventListener("mouseleave", () => {
100
- this.closePopup();
101
- });
102
- this.popuparea.addEventListener("mouseover", () => {
103
- this.isOnPopup = true;
104
- });
99
+ if (this.popuparea) {
100
+ this.popuparea.addEventListener("mouseleave", () => {
101
+ this.closePopup();
102
+ });
103
+ this.popuparea.addEventListener("mouseover", () => {
104
+ this.isOnPopup = true;
105
+ });
106
+ }
105
107
  this.marker.on("mouseout", () => {
106
108
  this.closePopup();
107
109
  });
@@ -131,11 +133,11 @@ class MapPopupComponent {
131
133
  });
132
134
  }
133
135
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapPopupComponent, deps: [{ token: i1.Router }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
134
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MapPopupComponent, selector: "lib-map-popup", ngImport: i0, template: "<div id=\"map-popup\">\r\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\r\n <img [src]=\"space.annexes\" />\r\n </div>\r\n <div class=\"map-popup-details\">\r\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\r\n <span class=\"map-popup-address\">{{space.addresses}}</span>\r\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\r\n [style.cursor]=\"'pointer'\">\u27A4 {{ visit.name ? visit.name : space.name}}</span>\r\n </div>\r\n</div>\r\n", styles: [".map-popup-header{height:120px;overflow:hidden;border-top-right-radius:20px;border-top-left-radius:20px}.map-popup-header img{width:100%;position:relative;top:50%;transform:translateY(-50%)}.map-popup-details{padding:5px 10px 10px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;background-color:#fff;color:#000}.map-popup-details{display:flex;flex-direction:column}.map-popup-details h1{font-size:1.5rem;font-weight:700;margin-bottom:0;color:var(--smarterplan-primary)}.map-popup-address{align-self:flex-end;margin-bottom:10px}.map-popup-visit{color:var(--smarterplan-primary);font-size:1.15rem}.map-popup-visit:hover{color:var(--smarterplan-primary)}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
136
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MapPopupComponent, selector: "lib-map-popup", ngImport: i0, template: "<div id=\"map-popup\">\r\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\r\n <img [src]=\"space.annexes\" />\r\n </div>\r\n <div class=\"map-popup-details\">\r\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\r\n <span class=\"map-popup-address\">{{space.addresses}}</span>\r\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\r\n [style.cursor]=\"'pointer'\">\u27A4 {{ visit.name ? visit.name : space.name}}</span>\r\n </div>\r\n</div>\r\n", styles: [":host{display:none!important}:host-context(.leaflet-popup-content){display:block!important}.map-popup-header{height:120px;overflow:hidden;border-top-right-radius:20px;border-top-left-radius:20px}.map-popup-header img{width:100%;position:relative;top:50%;transform:translateY(-50%)}.map-popup-details{padding:5px 10px 10px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;background-color:#fff;color:#000}.map-popup-details{display:flex;flex-direction:column}.map-popup-details h1{font-size:1.5rem;font-weight:700;margin-bottom:0;color:var(--smarterplan-primary)}.map-popup-address{align-self:flex-end;margin-bottom:10px}.map-popup-visit{color:var(--smarterplan-primary);font-size:1.15rem}.map-popup-visit:hover{color:var(--smarterplan-primary)}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
135
137
  }
136
138
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapPopupComponent, decorators: [{
137
139
  type: Component,
138
- args: [{ selector: 'lib-map-popup', template: "<div id=\"map-popup\">\r\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\r\n <img [src]=\"space.annexes\" />\r\n </div>\r\n <div class=\"map-popup-details\">\r\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\r\n <span class=\"map-popup-address\">{{space.addresses}}</span>\r\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\r\n [style.cursor]=\"'pointer'\">\u27A4 {{ visit.name ? visit.name : space.name}}</span>\r\n </div>\r\n</div>\r\n", styles: [".map-popup-header{height:120px;overflow:hidden;border-top-right-radius:20px;border-top-left-radius:20px}.map-popup-header img{width:100%;position:relative;top:50%;transform:translateY(-50%)}.map-popup-details{padding:5px 10px 10px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;background-color:#fff;color:#000}.map-popup-details{display:flex;flex-direction:column}.map-popup-details h1{font-size:1.5rem;font-weight:700;margin-bottom:0;color:var(--smarterplan-primary)}.map-popup-address{align-self:flex-end;margin-bottom:10px}.map-popup-visit{color:var(--smarterplan-primary);font-size:1.15rem}.map-popup-visit:hover{color:var(--smarterplan-primary)}\n"] }]
140
+ args: [{ selector: 'lib-map-popup', template: "<div id=\"map-popup\">\r\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\r\n <img [src]=\"space.annexes\" />\r\n </div>\r\n <div class=\"map-popup-details\">\r\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\r\n <span class=\"map-popup-address\">{{space.addresses}}</span>\r\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\r\n [style.cursor]=\"'pointer'\">\u27A4 {{ visit.name ? visit.name : space.name}}</span>\r\n </div>\r\n</div>\r\n", styles: [":host{display:none!important}:host-context(.leaflet-popup-content){display:block!important}.map-popup-header{height:120px;overflow:hidden;border-top-right-radius:20px;border-top-left-radius:20px}.map-popup-header img{width:100%;position:relative;top:50%;transform:translateY(-50%)}.map-popup-details{padding:5px 10px 10px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;background-color:#fff;color:#000}.map-popup-details{display:flex;flex-direction:column}.map-popup-details h1{font-size:1.5rem;font-weight:700;margin-bottom:0;color:var(--smarterplan-primary)}.map-popup-address{align-self:flex-end;margin-bottom:10px}.map-popup-visit{color:var(--smarterplan-primary);font-size:1.15rem}.map-popup-visit:hover{color:var(--smarterplan-primary)}\n"] }]
139
141
  }], ctorParameters: () => [{ type: i1.Router }, { type: i0.NgZone }] });
140
142
 
141
143
  const iconRetinaUrl = "assets/marker-icon-2x.png";
@@ -153,11 +155,9 @@ const iconDefault = icon({
153
155
  });
154
156
  Marker.prototype.options.icon = iconDefault;
155
157
  class MapComponent {
156
- viewContainerRef;
157
- constructor(viewContainerRef) {
158
- this.viewContainerRef = viewContainerRef;
159
- }
158
+ constructor() { }
160
159
  spaces;
160
+ popupContainer;
161
161
  options = {
162
162
  layers: [
163
163
  tileLayer("http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
@@ -170,58 +170,81 @@ class MapComponent {
170
170
  };
171
171
  layers = [];
172
172
  map;
173
+ isViewInitialized = false;
173
174
  ngOnChanges(changes) {
174
175
  if (changes.spaces) {
175
- const nm = [];
176
- const bd = [];
177
- if (!changes.spaces.currentValue) {
178
- return;
176
+ if (this.isViewInitialized) {
177
+ this.rebuildLayers();
179
178
  }
180
- // Filtering out spaces without lat/longitudes
181
- for (const s of changes.spaces.currentValue) {
182
- if (s.latitude === null || s.longitude === null) {
183
- console.log(`${s.name} has not coordinates for ${s.addresses}`);
184
- continue;
185
- }
186
- // We use the popup system from leaflet, as it packs a few improvements
187
- // on using bootstrap: autoclose other popups, closing option.
188
- const m = marker([s.latitude, s.longitude]);
189
- m.bindPopup(this.createPopupComponent(s, m));
190
- nm.push(m);
191
- bd.push(latLng(s.latitude, s.longitude));
192
- }
193
- // Note how we set the layers in one assignment, in order to have leaflet
194
- // detects the change correctly
195
- // We also set the bounds afterward, for the map to be properly zoomed and
196
- // centered
197
- this.layers = nm;
198
- if (this.map && bd.length > 0) {
199
- this.map.fitBounds(latLngBounds(bd), {
200
- padding: point(48, 48),
201
- maxZoom: 12,
202
- animate: true,
203
- });
179
+ }
180
+ }
181
+ ngAfterViewInit() {
182
+ this.isViewInitialized = true;
183
+ this.rebuildLayers();
184
+ }
185
+ rebuildLayers() {
186
+ if (!this.spaces) {
187
+ return;
188
+ }
189
+ const nm = [];
190
+ const bd = [];
191
+ // Clear previous components to avoid leakage.
192
+ // this.viewContainerRef.clear(); // Removed as we use the dedicated container
193
+ if (this.popupContainer) {
194
+ this.popupContainer.clear();
195
+ }
196
+ // Filtering out spaces without lat/longitudes
197
+ for (const s of this.spaces) {
198
+ if (s.latitude === null || s.longitude === null) {
199
+ console.log(`${s.name} has not coordinates for ${s.addresses}`);
200
+ continue;
204
201
  }
202
+ // We use the popup system from leaflet, as it packs a few improvements
203
+ // on using bootstrap: autoclose other popups, closing option.
204
+ const m = marker([s.latitude, s.longitude]);
205
+ m.bindPopup(this.createPopupComponent(s, m));
206
+ nm.push(m);
207
+ bd.push(latLng(s.latitude, s.longitude));
208
+ }
209
+ // Note how we set the layers in one assignment, in order to have leaflet
210
+ // detects the change correctly
211
+ // We also set the bounds afterward, for the map to be properly zoomed and
212
+ // centered
213
+ this.layers = nm;
214
+ if (this.map && bd.length > 0) {
215
+ this.map.fitBounds(latLngBounds(bd), {
216
+ padding: point(48, 48),
217
+ maxZoom: 12,
218
+ animate: true,
219
+ });
205
220
  }
206
221
  }
222
+ // Previous ngOnChanges logic was moved to rebuildLayers()
207
223
  onMapReady(map) {
208
224
  this.map = map;
209
225
  }
210
226
  createPopupComponent(space, marker) {
211
- const comp = this.viewContainerRef.createComponent(MapPopupComponent);
227
+ if (!this.popupContainer) {
228
+ console.warn("Popup container not ready yet");
229
+ return "";
230
+ }
231
+ const comp = this.popupContainer.createComponent(MapPopupComponent);
212
232
  comp.instance.space = space;
213
233
  comp.instance.marker = marker;
214
234
  comp.changeDetectorRef.detectChanges();
215
235
  return comp.location.nativeElement;
216
236
  }
217
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
218
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MapComponent, selector: "lib-map", inputs: { spaces: "spaces" }, usesOnChanges: true, ngImport: i0, template: "<div [leafletLayers]=\"layers\" [leafletOptions]=\"options\" (leafletMapReady)=\"onMapReady($any($event))\" id=\"map\" leaflet\r\n style=\"height: 500px; margin-top: 30px; z-index: 195\"></div>", styles: [""], dependencies: [{ kind: "directive", type: i1$1.LeafletDirective, selector: "[leaflet]", inputs: ["leafletFitBoundsOptions", "leafletPanOptions", "leafletZoomOptions", "leafletZoomPanOptions", "leafletOptions", "leafletZoom", "leafletCenter", "leafletFitBounds", "leafletMaxBounds", "leafletMinZoom", "leafletMaxZoom"], outputs: ["leafletMapReady", "leafletZoomChange", "leafletCenterChange", "leafletClick", "leafletDoubleClick", "leafletMouseDown", "leafletMouseUp", "leafletMouseMove", "leafletMouseOver", "leafletMouseOut", "leafletMapMove", "leafletMapMoveStart", "leafletMapMoveEnd", "leafletMapZoom", "leafletMapZoomStart", "leafletMapZoomEnd"] }, { kind: "directive", type: i1$1.LeafletLayersDirective, selector: "[leafletLayers]", inputs: ["leafletLayers"] }] });
237
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
238
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MapComponent, selector: "lib-map", inputs: { spaces: "spaces" }, viewQueries: [{ propertyName: "popupContainer", first: true, predicate: ["popupContainer"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<div [leafletLayers]=\"layers\" [leafletOptions]=\"options\" (leafletMapReady)=\"onMapReady($any($event))\" id=\"map\" leaflet\n style=\"height: 500px; margin-top: 30px; z-index: 195\"></div>\n\n<!-- Hidden container for popup components to avoid display leakage and manage lifecycle -->\n<div style=\"display: none\">\n <div #popupContainer></div>\n</div>", styles: [":host ::ng-deep lib-map-popup{display:none!important}:host ::ng-deep .leaflet-popup-content lib-map-popup{display:block!important}\n"], dependencies: [{ kind: "directive", type: i1$1.LeafletDirective, selector: "[leaflet]", inputs: ["leafletFitBoundsOptions", "leafletPanOptions", "leafletZoomOptions", "leafletZoomPanOptions", "leafletOptions", "leafletZoom", "leafletCenter", "leafletFitBounds", "leafletMaxBounds", "leafletMinZoom", "leafletMaxZoom"], outputs: ["leafletMapReady", "leafletZoomChange", "leafletCenterChange", "leafletClick", "leafletDoubleClick", "leafletMouseDown", "leafletMouseUp", "leafletMouseMove", "leafletMouseOver", "leafletMouseOut", "leafletMapMove", "leafletMapMoveStart", "leafletMapMoveEnd", "leafletMapZoom", "leafletMapZoomStart", "leafletMapZoomEnd"] }, { kind: "directive", type: i1$1.LeafletLayersDirective, selector: "[leafletLayers]", inputs: ["leafletLayers"] }] });
219
239
  }
220
240
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapComponent, decorators: [{
221
241
  type: Component,
222
- args: [{ selector: 'lib-map', template: "<div [leafletLayers]=\"layers\" [leafletOptions]=\"options\" (leafletMapReady)=\"onMapReady($any($event))\" id=\"map\" leaflet\r\n style=\"height: 500px; margin-top: 30px; z-index: 195\"></div>" }]
223
- }], ctorParameters: () => [{ type: i0.ViewContainerRef }], propDecorators: { spaces: [{
242
+ args: [{ selector: 'lib-map', template: "<div [leafletLayers]=\"layers\" [leafletOptions]=\"options\" (leafletMapReady)=\"onMapReady($any($event))\" id=\"map\" leaflet\n style=\"height: 500px; margin-top: 30px; z-index: 195\"></div>\n\n<!-- Hidden container for popup components to avoid display leakage and manage lifecycle -->\n<div style=\"display: none\">\n <div #popupContainer></div>\n</div>", styles: [":host ::ng-deep lib-map-popup{display:none!important}:host ::ng-deep .leaflet-popup-content lib-map-popup{display:block!important}\n"] }]
243
+ }], ctorParameters: () => [], propDecorators: { spaces: [{
224
244
  type: Input
245
+ }], popupContainer: [{
246
+ type: ViewChild,
247
+ args: ['popupContainer', { read: ViewContainerRef, static: true }]
225
248
  }] } });
226
249
 
227
250
  class FormLocationComponent {