@smarterplan/ngx-smarterplan-locations 0.3.4 → 0.4.2
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.
- package/esm2022/lib/components/carousel/carousel.component.mjs +30 -0
- package/esm2022/lib/components/chevron/chevron.component.mjs +18 -0
- package/esm2022/lib/components/detail-location/detail-location.component.mjs +183 -0
- package/{esm2020 → esm2022}/lib/components/form-location/form-location.component.mjs +254 -237
- package/esm2022/lib/components/images/images.component.mjs +120 -0
- package/esm2022/lib/components/locations/locations.component.mjs +157 -0
- package/esm2022/lib/components/locations/map/map-popup/map-popup.component.mjs +72 -0
- package/esm2022/lib/components/locations/map/map.component.mjs +92 -0
- package/esm2022/lib/components/plan-legend/plan-legend.component.mjs +49 -0
- package/esm2022/lib/components/plans/calibration/calibration.component.mjs +494 -0
- package/esm2022/lib/components/plans/edit-plan/edit-plan.component.mjs +350 -0
- package/{esm2020 → esm2022}/lib/components/plans/plans.component.mjs +243 -225
- package/esm2022/lib/components/tab-navigation/tab-navigation.component.mjs +43 -0
- package/esm2022/lib/components/visits/visits.component.mjs +294 -0
- package/esm2022/lib/components/zones/add-audio-zone/add-audio-zone.component.mjs +250 -0
- package/esm2022/lib/components/zones/add-zone/add-zone.component.mjs +333 -0
- package/esm2022/lib/components/zones/add-zone/selection/selection.component.mjs +81 -0
- package/esm2022/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.mjs +518 -0
- package/esm2022/lib/components/zones/zones.component.mjs +291 -0
- package/{esm2020 → esm2022}/lib/helper.service.mjs +133 -133
- package/esm2022/lib/ngx-smarterplan-location-routing.module.mjs +50 -0
- package/esm2022/lib/ngx-smarterplan-locations.module.mjs +124 -0
- package/esm2022/lib/ngx-smarterplan-locations.service.mjs +15 -0
- package/esm2022/lib/pipes/count-audio-sweeps.pipe.mjs +29 -0
- package/esm2022/lib/radio-button/radio-button.component.mjs +28 -0
- package/{esm2020 → esm2022}/public-api.mjs +8 -8
- package/{esm2020 → esm2022}/smarterplan-ngx-smarterplan-locations.mjs +4 -4
- package/{fesm2020 → fesm2022}/smarterplan-ngx-smarterplan-locations.mjs +3959 -3738
- package/fesm2022/smarterplan-ngx-smarterplan-locations.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/components/carousel/carousel.component.d.ts +12 -12
- package/lib/components/chevron/chevron.component.d.ts +9 -9
- package/lib/components/detail-location/detail-location.component.d.ts +55 -55
- package/lib/components/form-location/form-location.component.d.ts +45 -45
- package/lib/components/images/images.component.d.ts +33 -33
- package/lib/components/locations/locations.component.d.ts +51 -51
- package/lib/components/locations/map/map-popup/map-popup.component.d.ts +22 -22
- package/lib/components/locations/map/map.component.d.ts +21 -22
- package/lib/components/plan-legend/plan-legend.component.d.ts +14 -14
- package/lib/components/plans/calibration/calibration.component.d.ts +140 -140
- package/lib/components/plans/edit-plan/edit-plan.component.d.ts +55 -55
- package/lib/components/plans/plans.component.d.ts +63 -63
- package/lib/components/tab-navigation/tab-navigation.component.d.ts +13 -13
- package/lib/components/visits/visits.component.d.ts +63 -63
- package/lib/components/zones/add-audio-zone/add-audio-zone.component.d.ts +63 -63
- package/lib/components/zones/add-zone/add-zone.component.d.ts +69 -69
- package/lib/components/zones/add-zone/selection/selection.component.d.ts +44 -44
- package/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.d.ts +107 -107
- package/lib/components/zones/zones.component.d.ts +73 -73
- package/lib/helper.service.d.ts +53 -53
- package/lib/ngx-smarterplan-location-routing.module.d.ts +7 -7
- package/lib/ngx-smarterplan-locations.module.d.ts +36 -36
- package/lib/ngx-smarterplan-locations.service.d.ts +6 -6
- package/lib/pipes/count-audio-sweeps.pipe.d.ts +10 -10
- package/lib/radio-button/radio-button.component.d.ts +12 -12
- package/package.json +13 -19
- package/public-api.d.ts +4 -4
- package/esm2020/lib/components/carousel/carousel.component.mjs +0 -28
- package/esm2020/lib/components/chevron/chevron.component.mjs +0 -18
- package/esm2020/lib/components/detail-location/detail-location.component.mjs +0 -168
- package/esm2020/lib/components/images/images.component.mjs +0 -107
- package/esm2020/lib/components/locations/locations.component.mjs +0 -145
- package/esm2020/lib/components/locations/map/map-popup/map-popup.component.mjs +0 -66
- package/esm2020/lib/components/locations/map/map.component.mjs +0 -91
- package/esm2020/lib/components/plan-legend/plan-legend.component.mjs +0 -47
- package/esm2020/lib/components/plans/calibration/calibration.component.mjs +0 -468
- package/esm2020/lib/components/plans/edit-plan/edit-plan.component.mjs +0 -324
- package/esm2020/lib/components/tab-navigation/tab-navigation.component.mjs +0 -41
- package/esm2020/lib/components/visits/visits.component.mjs +0 -275
- package/esm2020/lib/components/zones/add-audio-zone/add-audio-zone.component.mjs +0 -230
- package/esm2020/lib/components/zones/add-zone/add-zone.component.mjs +0 -315
- package/esm2020/lib/components/zones/add-zone/selection/selection.component.mjs +0 -77
- package/esm2020/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.mjs +0 -502
- package/esm2020/lib/components/zones/zones.component.mjs +0 -268
- package/esm2020/lib/ngx-smarterplan-location-routing.module.mjs +0 -49
- package/esm2020/lib/ngx-smarterplan-locations.module.mjs +0 -123
- package/esm2020/lib/ngx-smarterplan-locations.service.mjs +0 -14
- package/esm2020/lib/pipes/count-audio-sweeps.pipe.mjs +0 -27
- package/esm2020/lib/radio-button/radio-button.component.mjs +0 -26
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs +0 -3983
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs.map +0 -1
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs.map +0 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { InventoryStatus } from '@smarterplan/ngx-smarterplan-core';
|
|
3
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/router";
|
|
6
|
+
import * as i2 from "@smarterplan/ngx-smarterplan-core";
|
|
7
|
+
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
8
|
+
import * as i4 from "@angular/common";
|
|
9
|
+
import * as i5 from "../tab-navigation/tab-navigation.component";
|
|
10
|
+
import * as i6 from "../carousel/carousel.component";
|
|
11
|
+
import * as i7 from "@ngx-translate/core";
|
|
12
|
+
class ImagesComponent {
|
|
13
|
+
route;
|
|
14
|
+
spaceService;
|
|
15
|
+
visitService;
|
|
16
|
+
nodeService;
|
|
17
|
+
navigatorService;
|
|
18
|
+
router;
|
|
19
|
+
images;
|
|
20
|
+
spaceID;
|
|
21
|
+
currentSpace;
|
|
22
|
+
currentVisit;
|
|
23
|
+
currentImages;
|
|
24
|
+
loading = false;
|
|
25
|
+
currentScanID;
|
|
26
|
+
menuItems = [];
|
|
27
|
+
destroy$ = new Subject();
|
|
28
|
+
constructor(route, spaceService, visitService, nodeService, navigatorService, router) {
|
|
29
|
+
this.route = route;
|
|
30
|
+
this.spaceService = spaceService;
|
|
31
|
+
this.visitService = visitService;
|
|
32
|
+
this.nodeService = nodeService;
|
|
33
|
+
this.navigatorService = navigatorService;
|
|
34
|
+
this.router = router;
|
|
35
|
+
this.navigatorService.locationIDChange
|
|
36
|
+
.pipe(takeUntil(this.destroy$))
|
|
37
|
+
.subscribe((spaceID) => {
|
|
38
|
+
this.router.navigate(["dashboard/localisation", spaceID, "images"]);
|
|
39
|
+
});
|
|
40
|
+
this.route.params.subscribe((params) => {
|
|
41
|
+
this.spaceID = params.id;
|
|
42
|
+
;
|
|
43
|
+
this.loadImages();
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
ngOnInit() {
|
|
47
|
+
}
|
|
48
|
+
ngOnDestroy() {
|
|
49
|
+
this.destroy$.next(true);
|
|
50
|
+
this.destroy$.complete();
|
|
51
|
+
}
|
|
52
|
+
setupMenuItems() {
|
|
53
|
+
this.menuItems = [
|
|
54
|
+
{ label: "Locations", url: "/localisation" },
|
|
55
|
+
{
|
|
56
|
+
label: this.currentSpace.name,
|
|
57
|
+
url: `/localisation/${this.spaceID}`,
|
|
58
|
+
},
|
|
59
|
+
{ label: "360° Images" },
|
|
60
|
+
];
|
|
61
|
+
if (this.currentVisit) {
|
|
62
|
+
this.menuItems.push({ label: this.currentVisit.name });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
onGoBack() {
|
|
66
|
+
this.currentVisit = null;
|
|
67
|
+
this.currentImages = null;
|
|
68
|
+
this.setupMenuItems();
|
|
69
|
+
}
|
|
70
|
+
async loadImages() {
|
|
71
|
+
this.loading = true;
|
|
72
|
+
this.currentSpace = await this.spaceService.getSpace(this.spaceID);
|
|
73
|
+
this.setupMenuItems();
|
|
74
|
+
this.images = await this.visitService.loadImagesForSpace(this.currentSpace);
|
|
75
|
+
if (this.currentSpace.visits.length === 1) {
|
|
76
|
+
this.setVisit(this.currentSpace.visits[0]);
|
|
77
|
+
}
|
|
78
|
+
this.loading = false;
|
|
79
|
+
}
|
|
80
|
+
setVisit(visit) {
|
|
81
|
+
this.currentVisit = visit;
|
|
82
|
+
this.currentImages = this.images.filter((im) => {
|
|
83
|
+
return im.visit === visit;
|
|
84
|
+
});
|
|
85
|
+
this.setupMenuItems();
|
|
86
|
+
}
|
|
87
|
+
setCurrentScan(id) {
|
|
88
|
+
this.currentScanID = id;
|
|
89
|
+
}
|
|
90
|
+
async onInventoryClick() {
|
|
91
|
+
const { node } = this.currentVisit;
|
|
92
|
+
const { filename } = this.currentImages[this.currentScanID]; // 110ee452_sweep.jpeg
|
|
93
|
+
// check if node has already errors of inventory
|
|
94
|
+
const missingFilesErrors = [
|
|
95
|
+
InventoryStatus.ERROR_FILE_JSON_NOT_EXIST,
|
|
96
|
+
InventoryStatus.ERROR_FILE_MODEL_NOT_EXIST,
|
|
97
|
+
InventoryStatus.ERROR_FILE_OBJ_NOT_EXIST,
|
|
98
|
+
];
|
|
99
|
+
if (node.inventoryStatus &&
|
|
100
|
+
missingFilesErrors.includes(node.inventoryStatus)) {
|
|
101
|
+
alert("Files missing for this visit's inventory. Contact your administrator.");
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
await this.nodeService.updateNode({
|
|
105
|
+
id: node.id,
|
|
106
|
+
inventoryStatus: InventoryStatus.TO_RUN_ONE_IMAGE,
|
|
107
|
+
navigationForInventory: filename.split("_")[0],
|
|
108
|
+
});
|
|
109
|
+
alert("Automatic AI Inventory started! Detected equipments will appear soon in the visit.");
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ImagesComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.SpaceService }, { token: i2.VisitService }, { token: i2.NodeService }, { token: i2.NavigatorService }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
113
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ImagesComponent, selector: "lib-images", ngImport: i0, template: "<div class=\"container-fluid dashboard-tab col-sm-10 mb-3\" *ngIf=\"currentSpace\" >\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">{{'Loading' | translate}}...</span>\r\n </div>\r\n </div>\r\n <div ngbDropdown class=\"d-inline-block\" *ngIf=\"currentSpace.visits && currentSpace.visits.length > 0\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" *ngIf=\"!currentVisit\"\r\n ngbDropdownToggle>{{'Choose 3D visit' | translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button ngbDropdownItem *ngFor=\"let visit of currentSpace.visits\" (click)=\"setVisit(visit)\"> {{ visit.name }}\r\n </button>\r\n </div>\r\n </div>\r\n <h3 *ngIf=\"currentVisit\">{{ currentVisit.name }}</h3>\r\n <div class=\"mt-3\" *ngIf=\"currentVisit && currentImages.length == 0 && !loading\">\r\n <h4>{{'No imported images' | translate }}</h4>\r\n <p>{{'For import: go Virtual Visits => Import Images' | translate}}</p>\r\n </div>\r\n <button *ngIf=\"currentVisit && currentImages.length > 0 && !loading\"\r\n class=\"btn btn-outline-primary rounded-pill no-lowercase mb-2\" (click)=\"onInventoryClick()\">\r\n {{'Run AI inventory on this image' | translate}}</button>\r\n <lib-carousel [images]=\"currentImages\" *ngIf=\"currentImages\" (currentScan)=\"setCurrentScan($event)\"></lib-carousel>\r\n </div>", styles: [""], dependencies: [{ kind: "directive", type: i3.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i3.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i3.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i3.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { kind: "component", type: i6.CarouselComponent, selector: "lib-carousel", inputs: ["images"], outputs: ["currentScan"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }] });
|
|
114
|
+
}
|
|
115
|
+
export { ImagesComponent };
|
|
116
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ImagesComponent, decorators: [{
|
|
117
|
+
type: Component,
|
|
118
|
+
args: [{ selector: 'lib-images', template: "<div class=\"container-fluid dashboard-tab col-sm-10 mb-3\" *ngIf=\"currentSpace\" >\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">{{'Loading' | translate}}...</span>\r\n </div>\r\n </div>\r\n <div ngbDropdown class=\"d-inline-block\" *ngIf=\"currentSpace.visits && currentSpace.visits.length > 0\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" *ngIf=\"!currentVisit\"\r\n ngbDropdownToggle>{{'Choose 3D visit' | translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button ngbDropdownItem *ngFor=\"let visit of currentSpace.visits\" (click)=\"setVisit(visit)\"> {{ visit.name }}\r\n </button>\r\n </div>\r\n </div>\r\n <h3 *ngIf=\"currentVisit\">{{ currentVisit.name }}</h3>\r\n <div class=\"mt-3\" *ngIf=\"currentVisit && currentImages.length == 0 && !loading\">\r\n <h4>{{'No imported images' | translate }}</h4>\r\n <p>{{'For import: go Virtual Visits => Import Images' | translate}}</p>\r\n </div>\r\n <button *ngIf=\"currentVisit && currentImages.length > 0 && !loading\"\r\n class=\"btn btn-outline-primary rounded-pill no-lowercase mb-2\" (click)=\"onInventoryClick()\">\r\n {{'Run AI inventory on this image' | translate}}</button>\r\n <lib-carousel [images]=\"currentImages\" *ngIf=\"currentImages\" (currentScan)=\"setCurrentScan($event)\"></lib-carousel>\r\n </div>" }]
|
|
119
|
+
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.SpaceService }, { type: i2.VisitService }, { type: i2.NodeService }, { type: i2.NavigatorService }, { type: i1.Router }]; } });
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2VzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2ltYWdlcy9pbWFnZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvaW1hZ2VzL2ltYWdlcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRWxELE9BQU8sRUFBbUUsZUFBZSxFQUFvQixNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZKLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7QUFFMUMsTUFLYSxlQUFlO0lBcUJaO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXhCWixNQUFNLENBQWE7SUFFbkIsT0FBTyxDQUFTO0lBRWhCLFlBQVksQ0FBUTtJQUVwQixZQUFZLENBQVE7SUFFcEIsYUFBYSxDQUFhO0lBRTFCLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFFaEIsYUFBYSxDQUFTO0lBRXRCLFNBQVMsR0FBZSxFQUFFLENBQUM7SUFFM0IsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFFekIsWUFDWSxLQUFxQixFQUNyQixZQUEwQixFQUMxQixZQUEwQixFQUMxQixXQUF3QixFQUN4QixnQkFBa0MsRUFDbEMsTUFBYztRQUxkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsV0FBTSxH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QUMsZ0JBQWdCO1FBQ2xCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ25DLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtRQUNuRixnREFBZ0Q7UUFDaEQsTUFBTSxrQkFBa0IsR0FBRztZQUN2QixlQUFlLENBQUMseUJBQXlCO1lBQ3pDLGVBQWUsQ0FBQywwQkFBMEI7WUFDMUMsZUFBZSxDQUFDLHdCQUF3QjtTQUMzQyxDQUFDO1FBQ0YsSUFDSSxJQUFJLENBQUMsZUFBZTtZQUNwQixrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUNuRDtZQUNFLEtBQUssQ0FDRCx1RUFBdUUsQ0FDMUUsQ0FBQztTQUNMO2FBQU07WUFDSCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO2dCQUM5QixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ1gsZUFBZSxFQUFFLGVBQWUsQ0FBQyxnQkFBZ0I7Z0JBQ2pELHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pELENBQUMsQ0FBQztZQUNILEtBQUssQ0FDRCxvRkFBb0YsQ0FDdkYsQ0FBQztTQUNMO0lBQ0wsQ0FBQzt3R0F4SFEsZUFBZTs0RkFBZixlQUFlLGtEQ1Y1QiwrcERBMEJROztTRGhCSyxlQUFlOzRGQUFmLGVBQWU7a0JBTDNCLFNBQVM7K0JBQ0ksWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTcGFjZSwgVmlzaXQsIE1lbnVJdGVtLCBTcGFjZVNlcnZpY2UsIFZpc2l0U2VydmljZSwgTm9kZVNlcnZpY2UsIEludmVudG9yeVN0YXR1cywgTmF2aWdhdG9yU2VydmljZSB9IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1pbWFnZXMnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9pbWFnZXMuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgSW1hZ2VzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBpbWFnZXM6IEFycmF5PGFueT47XHJcblxyXG4gICAgc3BhY2VJRDogc3RyaW5nO1xyXG5cclxuICAgIGN1cnJlbnRTcGFjZTogU3BhY2U7XHJcblxyXG4gICAgY3VycmVudFZpc2l0OiBWaXNpdDtcclxuXHJcbiAgICBjdXJyZW50SW1hZ2VzOiBBcnJheTxhbnk+O1xyXG5cclxuICAgIGxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBjdXJyZW50U2NhbklEOiBzdHJpbmc7XHJcblxyXG4gICAgbWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XHJcblxyXG4gICAgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgIHByaXZhdGUgc3BhY2VTZXJ2aWNlOiBTcGFjZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB2aXNpdFNlcnZpY2U6IFZpc2l0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG5vZGVTZXJ2aWNlOiBOb2RlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG5hdmlnYXRvclNlcnZpY2U6IE5hdmlnYXRvclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5sb2NhdGlvbklEQ2hhbmdlXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoc3BhY2VJRCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL2xvY2FsaXNhdGlvblwiLCBzcGFjZUlELCBcImltYWdlc1wiXSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNwYWNlSUQgPSBwYXJhbXMuaWQ7O1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRJbWFnZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldHVwTWVudUl0ZW1zKCkge1xyXG4gICAgICAgIHRoaXMubWVudUl0ZW1zID0gW1xyXG4gICAgICAgICAgICB7IGxhYmVsOiBcIkxvY2F0aW9uc1wiLCB1cmw6IFwiL2xvY2FsaXNhdGlvblwiIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLmN1cnJlbnRTcGFjZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgdXJsOiBgL2xvY2FsaXNhdGlvbi8ke3RoaXMuc3BhY2VJRH1gLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7IGxhYmVsOiBcIjM2MMKwIEltYWdlc1wiIH0sXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpc2l0KSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zLnB1c2goeyBsYWJlbDogdGhpcy5jdXJyZW50VmlzaXQubmFtZSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25Hb0JhY2soKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VmlzaXQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEltYWdlcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRJbWFnZXMoKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTcGFjZSA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldFNwYWNlKHRoaXMuc3BhY2VJRCk7XHJcbiAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VzID0gYXdhaXQgdGhpcy52aXNpdFNlcnZpY2UubG9hZEltYWdlc0ZvclNwYWNlKFxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTcGFjZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTcGFjZS52aXNpdHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmlzaXQodGhpcy5jdXJyZW50U3BhY2UudmlzaXRzWzBdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VmlzaXQodmlzaXQpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRWaXNpdCA9IHZpc2l0O1xyXG4gICAgICAgIHRoaXMuY3VycmVudEltYWdlcyA9IHRoaXMuaW1hZ2VzLmZpbHRlcigoaW0pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGltLnZpc2l0ID09PSB2aXNpdDtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q3VycmVudFNjYW4oaWQpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTY2FuSUQgPSBpZDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkludmVudG9yeUNsaWNrKCkge1xyXG4gICAgICAgIGNvbnN0IHsgbm9kZSB9ID0gdGhpcy5jdXJyZW50VmlzaXQ7XHJcbiAgICAgICAgY29uc3QgeyBmaWxlbmFtZSB9ID0gdGhpcy5jdXJyZW50SW1hZ2VzW3RoaXMuY3VycmVudFNjYW5JRF07IC8vIDExMGVlNDUyX3N3ZWVwLmpwZWdcclxuICAgICAgICAvLyBjaGVjayBpZiBub2RlIGhhcyBhbHJlYWR5IGVycm9ycyBvZiBpbnZlbnRvcnlcclxuICAgICAgICBjb25zdCBtaXNzaW5nRmlsZXNFcnJvcnMgPSBbXHJcbiAgICAgICAgICAgIEludmVudG9yeVN0YXR1cy5FUlJPUl9GSUxFX0pTT05fTk9UX0VYSVNULFxyXG4gICAgICAgICAgICBJbnZlbnRvcnlTdGF0dXMuRVJST1JfRklMRV9NT0RFTF9OT1RfRVhJU1QsXHJcbiAgICAgICAgICAgIEludmVudG9yeVN0YXR1cy5FUlJPUl9GSUxFX09CSl9OT1RfRVhJU1QsXHJcbiAgICAgICAgXTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIG5vZGUuaW52ZW50b3J5U3RhdHVzICYmXHJcbiAgICAgICAgICAgIG1pc3NpbmdGaWxlc0Vycm9ycy5pbmNsdWRlcyhub2RlLmludmVudG9yeVN0YXR1cylcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgYWxlcnQoXHJcbiAgICAgICAgICAgICAgICBcIkZpbGVzIG1pc3NpbmcgZm9yIHRoaXMgdmlzaXQncyBpbnZlbnRvcnkuIENvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yLlwiLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubm9kZVNlcnZpY2UudXBkYXRlTm9kZSh7XHJcbiAgICAgICAgICAgICAgICBpZDogbm9kZS5pZCxcclxuICAgICAgICAgICAgICAgIGludmVudG9yeVN0YXR1czogSW52ZW50b3J5U3RhdHVzLlRPX1JVTl9PTkVfSU1BR0UsXHJcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uRm9ySW52ZW50b3J5OiBmaWxlbmFtZS5zcGxpdChcIl9cIilbMF0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBhbGVydChcclxuICAgICAgICAgICAgICAgIFwiQXV0b21hdGljIEFJIEludmVudG9yeSBzdGFydGVkISBEZXRlY3RlZCBlcXVpcG1lbnRzIHdpbGwgYXBwZWFyIHNvb24gaW4gdGhlIHZpc2l0LlwiLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCBkYXNoYm9hcmQtdGFiIGNvbC1zbS0xMCBtYi0zXCIgKm5nSWY9XCJjdXJyZW50U3BhY2VcIiA+XHJcbiAgICA8ZGl2IGNsYXNzPVwibS0zXCI+XHJcbiAgICAgIDxsaWItdGFiLW5hdmlnYXRpb24gW21lbnVJdGVtc109J21lbnVJdGVtcycgKG9uR29CYWNrKT1cIm9uR29CYWNrKClcIj48L2xpYi10YWItbmF2aWdhdGlvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlclwiIHJvbGU9XCJzdGF0dXNcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPnt7J0xvYWRpbmcnIHwgdHJhbnNsYXRlfX0uLi48L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2tcIiAqbmdJZj1cImN1cnJlbnRTcGFjZS52aXNpdHMgJiYgY3VycmVudFNwYWNlLnZpc2l0cy5sZW5ndGggPiAwXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxhYmVsLWZpbGUgcm91bmRlZC1waWxsXCIgaWQ9XCJkcm9wZG93bkJhc2ljMVwiICpuZ0lmPVwiIWN1cnJlbnRWaXNpdFwiXHJcbiAgICAgICAgbmdiRHJvcGRvd25Ub2dnbGU+e3snQ2hvb3NlIDNEIHZpc2l0JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duQmFzaWMxXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW0gKm5nRm9yPVwibGV0IHZpc2l0IG9mIGN1cnJlbnRTcGFjZS52aXNpdHNcIiAoY2xpY2spPVwic2V0VmlzaXQodmlzaXQpXCI+IHt7IHZpc2l0Lm5hbWUgfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxoMyAqbmdJZj1cImN1cnJlbnRWaXNpdFwiPnt7IGN1cnJlbnRWaXNpdC5uYW1lIH19PC9oMz5cclxuICAgIDxkaXYgY2xhc3M9XCJtdC0zXCIgKm5nSWY9XCJjdXJyZW50VmlzaXQgJiYgY3VycmVudEltYWdlcy5sZW5ndGggPT0gMCAmJiAhbG9hZGluZ1wiPlxyXG4gICAgICA8aDQ+e3snTm8gaW1wb3J0ZWQgaW1hZ2VzJyB8IHRyYW5zbGF0ZSB9fTwvaDQ+XHJcbiAgICAgIDxwPnt7J0ZvciBpbXBvcnQ6IGdvIFZpcnR1YWwgVmlzaXRzID0+IEltcG9ydCBJbWFnZXMnIHwgdHJhbnNsYXRlfX08L3A+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxidXR0b24gKm5nSWY9XCJjdXJyZW50VmlzaXQgJiYgY3VycmVudEltYWdlcy5sZW5ndGggPiAwICYmICFsb2FkaW5nXCJcclxuICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbm8tbG93ZXJjYXNlIG1iLTJcIiAoY2xpY2spPVwib25JbnZlbnRvcnlDbGljaygpXCI+XHJcbiAgICAgIHt7J1J1biBBSSBpbnZlbnRvcnkgb24gdGhpcyBpbWFnZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPGxpYi1jYXJvdXNlbCBbaW1hZ2VzXT1cImN1cnJlbnRJbWFnZXNcIiAqbmdJZj1cImN1cnJlbnRJbWFnZXNcIiAoY3VycmVudFNjYW4pPVwic2V0Q3VycmVudFNjYW4oJGV2ZW50KVwiPjwvbGliLWNhcm91c2VsPlxyXG4gIDwvZGl2PiJdfQ==
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { LevelStatus, enumToArray, SearchObjectType } from '@smarterplan/ngx-smarterplan-core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@smarterplan/ngx-smarterplan-core";
|
|
5
|
+
import * as i2 from "@angular/router";
|
|
6
|
+
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
7
|
+
import * as i4 from "@angular/common";
|
|
8
|
+
import * as i5 from "../tab-navigation/tab-navigation.component";
|
|
9
|
+
import * as i6 from "./map/map.component";
|
|
10
|
+
import * as i7 from "../form-location/form-location.component";
|
|
11
|
+
import * as i8 from "@ngx-translate/core";
|
|
12
|
+
class LocationsComponent {
|
|
13
|
+
spaceService;
|
|
14
|
+
router;
|
|
15
|
+
userService;
|
|
16
|
+
viewerService;
|
|
17
|
+
navigationService;
|
|
18
|
+
navigatorService;
|
|
19
|
+
createForm;
|
|
20
|
+
levels;
|
|
21
|
+
imageToUpload;
|
|
22
|
+
isAdding = false;
|
|
23
|
+
filteredLocations = [];
|
|
24
|
+
isManager = false;
|
|
25
|
+
isMuseumUser = true;
|
|
26
|
+
locations = [];
|
|
27
|
+
menuItems = [];
|
|
28
|
+
userSubcription;
|
|
29
|
+
locationIDSubscription;
|
|
30
|
+
/** Last filtered Locations, used when we go back on all locations from the search bar location */
|
|
31
|
+
lastFiltredLocations = [];
|
|
32
|
+
constructor(spaceService, router, userService, viewerService, navigationService, navigatorService) {
|
|
33
|
+
this.spaceService = spaceService;
|
|
34
|
+
this.router = router;
|
|
35
|
+
this.userService = userService;
|
|
36
|
+
this.viewerService = viewerService;
|
|
37
|
+
this.navigationService = navigationService;
|
|
38
|
+
this.navigatorService = navigatorService;
|
|
39
|
+
this.levels = enumToArray(LevelStatus);
|
|
40
|
+
this.userSubcription = this.userService.isChanged.subscribe((isConnected) => {
|
|
41
|
+
if (isConnected) {
|
|
42
|
+
this.refresh();
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
this.locationIDSubscription =
|
|
46
|
+
this.navigatorService.locationIDChange.subscribe((id) => {
|
|
47
|
+
this.changeSelectedLocation(id);
|
|
48
|
+
this.setupMenuItems();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async ngOnInit() {
|
|
52
|
+
if (this.userService.cu) {
|
|
53
|
+
this.resetList();
|
|
54
|
+
this.updateUserRights();
|
|
55
|
+
}
|
|
56
|
+
this.setupMenuItems();
|
|
57
|
+
}
|
|
58
|
+
findSpaceById(id) {
|
|
59
|
+
return this.locations.find((loc) => loc.id === id);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Update when we change the selected location in filter (search bar)
|
|
63
|
+
* @param id for a location, if null display all last filtred location
|
|
64
|
+
*/
|
|
65
|
+
changeSelectedLocation(id) {
|
|
66
|
+
const space = id ? this.findSpaceById(id) : null;
|
|
67
|
+
this.filteredLocations = space ? [space] : this.lastFiltredLocations; // New selected space or last filtered location
|
|
68
|
+
}
|
|
69
|
+
refresh() {
|
|
70
|
+
this.updateUserRights();
|
|
71
|
+
this.resetList();
|
|
72
|
+
}
|
|
73
|
+
ngOnDestroy() {
|
|
74
|
+
this.userSubcription.unsubscribe();
|
|
75
|
+
this.locationIDSubscription.unsubscribe();
|
|
76
|
+
}
|
|
77
|
+
setupMenuItems() {
|
|
78
|
+
this.menuItems = [{ label: "All Locations", url: "/localisation" }];
|
|
79
|
+
if (this.isAdding) {
|
|
80
|
+
this.menuItems.push({ label: "New" });
|
|
81
|
+
}
|
|
82
|
+
if (this.filteredLocations.length === 1) {
|
|
83
|
+
const selectedLoc = this.filteredLocations[0];
|
|
84
|
+
this.menuItems.push({ label: selectedLoc.name });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
updateUserRights() {
|
|
88
|
+
this.isManager = this.userService.hasManagerRoleInAnyMission();
|
|
89
|
+
this.isMuseumUser = this.userService.hasOnlyMuseumRole();
|
|
90
|
+
}
|
|
91
|
+
isManagerForSpace(spaceID) {
|
|
92
|
+
return (this.userService.isManager(spaceID) ||
|
|
93
|
+
this.userService.isGuide(spaceID));
|
|
94
|
+
}
|
|
95
|
+
async resetList() {
|
|
96
|
+
this.locations = await this.spaceService.getLocationsForCurrentUser();
|
|
97
|
+
this.filteredLocations = this.locations;
|
|
98
|
+
this.lastFiltredLocations = this.locations;
|
|
99
|
+
this.isAdding = false;
|
|
100
|
+
this.changeSelectedLocation(this.navigatorService.currentNavBarLocationID); // Set for the current selected location
|
|
101
|
+
this.setupMenuItems();
|
|
102
|
+
}
|
|
103
|
+
onAddLocation() {
|
|
104
|
+
this.isAdding = true;
|
|
105
|
+
this.setupMenuItems();
|
|
106
|
+
}
|
|
107
|
+
handleImageInput(files) {
|
|
108
|
+
this.imageToUpload = files.item(0);
|
|
109
|
+
}
|
|
110
|
+
onFormChange(event) {
|
|
111
|
+
this.navigatorService.locationIDChange.next(null); /** Remove selected location */
|
|
112
|
+
this.isAdding = false;
|
|
113
|
+
if (event) {
|
|
114
|
+
this.resetList();
|
|
115
|
+
}
|
|
116
|
+
this.setupMenuItems();
|
|
117
|
+
}
|
|
118
|
+
async onVisitClick(loc, visit) {
|
|
119
|
+
if (!this.userService.userHasAccessToAllZonesInSpace(loc.id)) {
|
|
120
|
+
// get allowed sweep for the user
|
|
121
|
+
const allowedSweeps = await this.navigationService.getAllowedSweepsIDsForUserInSpace(loc.id);
|
|
122
|
+
const firstSweep = allowedSweeps[0];
|
|
123
|
+
this.viewerService.setSweepToMove(firstSweep);
|
|
124
|
+
}
|
|
125
|
+
if (this.userService.isGuide(loc.id)) {
|
|
126
|
+
this.router.navigate(["museum", loc.id]);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
this.router.navigate(["visit", loc.id], {
|
|
130
|
+
queryParams: { model3D: visit.model3d },
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
applyResultsSearchBar(results) {
|
|
135
|
+
this.filteredLocations = results || this.locations;
|
|
136
|
+
this.lastFiltredLocations = this.filteredLocations;
|
|
137
|
+
this.navigatorService.locationIDChange.next(null); // When we search with keyword, we would like to search on all locations
|
|
138
|
+
}
|
|
139
|
+
getSearchType() {
|
|
140
|
+
return SearchObjectType.LOCATION;
|
|
141
|
+
}
|
|
142
|
+
getStringNoSpace(data) {
|
|
143
|
+
return data.replace(/\s/g, '');
|
|
144
|
+
}
|
|
145
|
+
onDetailViewClick(spaceID) {
|
|
146
|
+
this.navigatorService.locationIDChange.next(spaceID); // Send update for the location filter bar
|
|
147
|
+
this.router.navigate(["dashboard/localisation", spaceID]);
|
|
148
|
+
}
|
|
149
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocationsComponent, deps: [{ token: i1.SpaceService }, { token: i2.Router }, { token: i1.BaseUserService }, { token: i1.ViewerService }, { token: i1.NavigationService }, { token: i1.NavigatorService }], target: i0.ɵɵFactoryTarget.Component });
|
|
150
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: LocationsComponent, selector: "lib-locations", ngImport: i0, template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation (onGoBack)=\"onFormChange(null)\" [menuItems]='menuItems'></lib-tab-navigation>\r\n <span class=\"ml-3 refreshIcon\" (click)=\"refresh()\" *ngIf=\"!(isAdding)\" ngbTooltip=\"Refresh list\">\r\n <span class=\"iconify refreshIcon\" data-icon=\"ion:refresh-circle\" data-width=\"35\" data-rotate=\"90deg\"></span>\r\n </span>\r\n </div> \r\n <lib-search-bar *ngIf=\"!isAdding && !isMuseumUser\" [searchable]=\"locations\" [objectType]=\"getSearchType()\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\"></lib-search-bar>\r\n \r\n <div class=\"col-md-8\">\r\n <div class=\"sp-row\" *ngIf=\"!isAdding && isManager\">\r\n <button data-testid=\"new-location-btn\" class=\"btn btn-outline-primary rounded-pill add-location\" (click)=\"onAddLocation()\">\r\n {{'Add location' | translate}}</button>\r\n <!-- <div class=\"outer_circle\">\r\n <button id='btn-icon' (click)=\"onAddLocation()\"></button>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <hr>\r\n <div class=\"row\" *ngIf=\"isAdding\">\r\n <div class=\"col-md-6\">\r\n <h4>{{'New location' | translate}}</h4>\r\n </div>\r\n </div>\r\n <section *ngIf=\"!isAdding\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-12 col-md-12 col-lg-6\" *ngIf=\"filteredLocations\">\r\n <ul data-testid=\"location-list-container\" class=\"list-group list-group-flush\">\r\n <li class=\"d-flex justify-content-between list-group-item\"\r\n *ngFor=\"let loc of filteredLocations; index as index\">\r\n <div class=\"d-flex\">\r\n <div class=\"col-md-5 img-main-container\">\r\n <div id=\"img_container\">\r\n <img class=\"location-img\" *ngIf=\"loc.annexes; else elseBlock\" [src]=\"loc.annexes\">\r\n <ng-template #elseBlock><img class=\"location-img\"\r\n src=\"./../../../../assets/images/visuel-off-big.jpg\" />\r\n </ng-template>\r\n <button [ngClass]=\"['open-btn-'+getStringNoSpace(loc.name)]\" *ngIf=\"isManagerForSpace(loc.id)\" class=\"btn-details\" (click)=\"onDetailViewClick(loc.id)\">\r\n {{'View details' | translate}}</button>\r\n </div>\r\n \r\n </div>\r\n <div class=\"col-md-7 location-info\">\r\n <p>{{loc.name}}</p>\r\n <p>{{loc.addresses}}</p>\r\n <p [ngClass]=\"['view-btn-'+getStringNoSpace(loc.name)]\" *ngFor=\"let visit of loc.visits\" (click)=\"onVisitClick(loc, visit)\" class=\"visit-name\"\r\n [style.cursor]=\"'pointer'\" ngbTooltip=\"Visit\">{{ visit.name ? visit.name : loc.name}}</p>\r\n </div>\r\n </div>\r\n </li>\r\n \r\n </ul>\r\n </div>\r\n <div class=\"col-sm-12 col-md-12 col-lg-6\">\r\n <lib-map [spaces]=\"filteredLocations\"></lib-map>\r\n </div>\r\n </div>\r\n </section>\r\n <lib-form-location *ngIf=\"isAdding\" (onChange)=\"onFormChange($event)\"></lib-form-location>\r\n</div>\r\n", styles: [".searchbar{margin-bottom:10px}input[type=file]{display:none}.form-control{border-radius:var(--form-control-border-radius)}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}section .list-group{margin-top:15px}section .list-group-item{padding:5px 0}section .location-info{font-size:1.1em}section .location-img{width:100%;object-fit:cover;object-position:center bottom;height:165px}#img_container{position:relative;display:inline-block;text-align:center;width:250px}.img-main-container{max-width:250px;width:250px!important;margin-right:10px}.visit-name{color:var(--smarterplan-primary);font-weight:600}.btn-details{background-color:var(--smarterplan-primary-transparent);position:absolute;color:#fff;bottom:0;right:0;width:100%;height:30%;border:none;font-size:1em;text-transform:lowercase}#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.refreshIcon{color:var(--smarterplan-primary);cursor:pointer}.refreshIcon svg{vertical-align:middle!important}.add-location{width:-moz-fit-content;width:fit-content}.sp-row{display:flex;flex-direction:row}\n"], dependencies: [{ kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.SearchBarComponent, selector: "lib-search-bar", inputs: ["searchable", "objectType"], outputs: ["searchEvent"] }, { kind: "component", type: i5.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { kind: "component", type: i6.MapComponent, selector: "lib-map", inputs: ["spaces"] }, { kind: "component", type: i7.FormLocationComponent, selector: "lib-form-location", inputs: ["location"], outputs: ["onChange"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
|
|
151
|
+
}
|
|
152
|
+
export { LocationsComponent };
|
|
153
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocationsComponent, decorators: [{
|
|
154
|
+
type: Component,
|
|
155
|
+
args: [{ selector: 'lib-locations', template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation (onGoBack)=\"onFormChange(null)\" [menuItems]='menuItems'></lib-tab-navigation>\r\n <span class=\"ml-3 refreshIcon\" (click)=\"refresh()\" *ngIf=\"!(isAdding)\" ngbTooltip=\"Refresh list\">\r\n <span class=\"iconify refreshIcon\" data-icon=\"ion:refresh-circle\" data-width=\"35\" data-rotate=\"90deg\"></span>\r\n </span>\r\n </div> \r\n <lib-search-bar *ngIf=\"!isAdding && !isMuseumUser\" [searchable]=\"locations\" [objectType]=\"getSearchType()\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\"></lib-search-bar>\r\n \r\n <div class=\"col-md-8\">\r\n <div class=\"sp-row\" *ngIf=\"!isAdding && isManager\">\r\n <button data-testid=\"new-location-btn\" class=\"btn btn-outline-primary rounded-pill add-location\" (click)=\"onAddLocation()\">\r\n {{'Add location' | translate}}</button>\r\n <!-- <div class=\"outer_circle\">\r\n <button id='btn-icon' (click)=\"onAddLocation()\"></button>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <hr>\r\n <div class=\"row\" *ngIf=\"isAdding\">\r\n <div class=\"col-md-6\">\r\n <h4>{{'New location' | translate}}</h4>\r\n </div>\r\n </div>\r\n <section *ngIf=\"!isAdding\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-12 col-md-12 col-lg-6\" *ngIf=\"filteredLocations\">\r\n <ul data-testid=\"location-list-container\" class=\"list-group list-group-flush\">\r\n <li class=\"d-flex justify-content-between list-group-item\"\r\n *ngFor=\"let loc of filteredLocations; index as index\">\r\n <div class=\"d-flex\">\r\n <div class=\"col-md-5 img-main-container\">\r\n <div id=\"img_container\">\r\n <img class=\"location-img\" *ngIf=\"loc.annexes; else elseBlock\" [src]=\"loc.annexes\">\r\n <ng-template #elseBlock><img class=\"location-img\"\r\n src=\"./../../../../assets/images/visuel-off-big.jpg\" />\r\n </ng-template>\r\n <button [ngClass]=\"['open-btn-'+getStringNoSpace(loc.name)]\" *ngIf=\"isManagerForSpace(loc.id)\" class=\"btn-details\" (click)=\"onDetailViewClick(loc.id)\">\r\n {{'View details' | translate}}</button>\r\n </div>\r\n \r\n </div>\r\n <div class=\"col-md-7 location-info\">\r\n <p>{{loc.name}}</p>\r\n <p>{{loc.addresses}}</p>\r\n <p [ngClass]=\"['view-btn-'+getStringNoSpace(loc.name)]\" *ngFor=\"let visit of loc.visits\" (click)=\"onVisitClick(loc, visit)\" class=\"visit-name\"\r\n [style.cursor]=\"'pointer'\" ngbTooltip=\"Visit\">{{ visit.name ? visit.name : loc.name}}</p>\r\n </div>\r\n </div>\r\n </li>\r\n \r\n </ul>\r\n </div>\r\n <div class=\"col-sm-12 col-md-12 col-lg-6\">\r\n <lib-map [spaces]=\"filteredLocations\"></lib-map>\r\n </div>\r\n </div>\r\n </section>\r\n <lib-form-location *ngIf=\"isAdding\" (onChange)=\"onFormChange($event)\"></lib-form-location>\r\n</div>\r\n", styles: [".searchbar{margin-bottom:10px}input[type=file]{display:none}.form-control{border-radius:var(--form-control-border-radius)}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}section .list-group{margin-top:15px}section .list-group-item{padding:5px 0}section .location-info{font-size:1.1em}section .location-img{width:100%;object-fit:cover;object-position:center bottom;height:165px}#img_container{position:relative;display:inline-block;text-align:center;width:250px}.img-main-container{max-width:250px;width:250px!important;margin-right:10px}.visit-name{color:var(--smarterplan-primary);font-weight:600}.btn-details{background-color:var(--smarterplan-primary-transparent);position:absolute;color:#fff;bottom:0;right:0;width:100%;height:30%;border:none;font-size:1em;text-transform:lowercase}#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.refreshIcon{color:var(--smarterplan-primary);cursor:pointer}.refreshIcon svg{vertical-align:middle!important}.add-location{width:-moz-fit-content;width:fit-content}.sp-row{display:flex;flex-direction:row}\n"] }]
|
|
156
|
+
}], ctorParameters: function () { return [{ type: i1.SpaceService }, { type: i2.Router }, { type: i1.BaseUserService }, { type: i1.ViewerService }, { type: i1.NavigationService }, { type: i1.NavigatorService }]; } });
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9sb2NhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvbG9jYXRpb25zL2xvY2F0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBR2xELE9BQU8sRUFBRSxXQUFXLEVBQTRGLFdBQVcsRUFBbUIsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7OztBQUcxTSxNQUthLGtCQUFrQjtJQTRCZjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUEvQlosVUFBVSxDQUFtQjtJQUU3QixNQUFNLENBQXFCO0lBRTNCLGFBQWEsQ0FBTztJQUVwQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRWpCLGlCQUFpQixHQUFZLEVBQUUsQ0FBQztJQUVoQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRWxCLFlBQVksR0FBRyxJQUFJLENBQUM7SUFFcEIsU0FBUyxHQUFZLEVBQUUsQ0FBQztJQUV4QixTQUFTLEdBQWUsRUFBRSxDQUFDO0lBRTNCLGVBQWUsQ0FBZTtJQUU5QixzQkFBc0IsQ0FBZTtJQUVyQyxrR0FBa0c7SUFDbEcsb0JBQW9CLEdBQVksRUFBRSxDQUFDO0lBRW5DLFlBQ1ksWUFBMEIsRUFDMUIsTUFBYyxFQUNkLFdBQTRCLEVBQzVCLGFBQTRCLEVBQzVCLGlCQUFvQyxFQUNwQyxnQkFBa0M7UUFMbEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGdCQUFX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QUMsUUFBUSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUFJO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELGlCQUFpQixDQUFDLE9BQWU7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLDBDQUEwQztRQUNoRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQzt3R0E1S1Esa0JBQWtCOzRGQUFsQixrQkFBa0IscURDWC9CLCt5R0ErREE7O1NEcERhLGtCQUFrQjs0RkFBbEIsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNJLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBMZXZlbFN0YXR1cywgU3BhY2UsIFNwYWNlU2VydmljZSwgQmFzZVVzZXJTZXJ2aWNlLCBWaWV3ZXJTZXJ2aWNlLCBOYXZpZ2F0aW9uU2VydmljZSwgTmF2aWdhdG9yU2VydmljZSwgZW51bVRvQXJyYXksIFZpc2l0LCBNZW51SXRlbSwgU2VhcmNoT2JqZWN0VHlwZSB9IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1sb2NhdGlvbnMnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2xvY2F0aW9ucy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9sb2NhdGlvbnMuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTG9jYXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBjcmVhdGVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG5cclxuICAgIGxldmVsczogQXJyYXk8TGV2ZWxTdGF0dXM+O1xyXG5cclxuICAgIGltYWdlVG9VcGxvYWQ6IEZpbGU7XHJcblxyXG4gICAgaXNBZGRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBmaWx0ZXJlZExvY2F0aW9uczogU3BhY2VbXSA9IFtdO1xyXG5cclxuICAgIGlzTWFuYWdlciA9IGZhbHNlO1xyXG5cclxuICAgIGlzTXVzZXVtVXNlciA9IHRydWU7XHJcblxyXG4gICAgbG9jYXRpb25zOiBTcGFjZVtdID0gW107XHJcblxyXG4gICAgbWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XHJcblxyXG4gICAgdXNlclN1YmNyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgbG9jYXRpb25JRFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIC8qKiBMYXN0IGZpbHRlcmVkIExvY2F0aW9ucywgdXNlZCB3aGVuIHdlIGdvIGJhY2sgb24gYWxsIGxvY2F0aW9ucyBmcm9tIHRoZSBzZWFyY2ggYmFyIGxvY2F0aW9uICovXHJcbiAgICBsYXN0RmlsdHJlZExvY2F0aW9uczogU3BhY2VbXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgc3BhY2VTZXJ2aWNlOiBTcGFjZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB2aWV3ZXJTZXJ2aWNlOiBWaWV3ZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbmF2aWdhdG9yU2VydmljZTogTmF2aWdhdG9yU2VydmljZSxcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMubGV2ZWxzID0gZW51bVRvQXJyYXkoTGV2ZWxTdGF0dXMpO1xyXG4gICAgICAgIHRoaXMudXNlclN1YmNyaXB0aW9uID0gdGhpcy51c2VyU2VydmljZS5pc0NoYW5nZWQuc3Vic2NyaWJlKChpc0Nvbm5lY3RlZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMubG9jYXRpb25JRFN1YnNjcmlwdGlvbiA9XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5sb2NhdGlvbklEQ2hhbmdlLnN1YnNjcmliZSgoaWQpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlU2VsZWN0ZWRMb2NhdGlvbihpZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLnVzZXJTZXJ2aWNlLmN1KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVXNlclJpZ2h0cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZpbmRTcGFjZUJ5SWQoaWQ6IHN0cmluZyk6IFNwYWNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2NhdGlvbnMuZmluZCgobG9jKSA9PiBsb2MuaWQgPT09IGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB3aGVuIHdlIGNoYW5nZSB0aGUgc2VsZWN0ZWQgbG9jYXRpb24gaW4gZmlsdGVyIChzZWFyY2ggYmFyKVxyXG4gICAgICogQHBhcmFtIGlkIGZvciBhIGxvY2F0aW9uLCBpZiBudWxsIGRpc3BsYXkgYWxsIGxhc3QgZmlsdHJlZCBsb2NhdGlvblxyXG4gICAgICovXHJcbiAgICBjaGFuZ2VTZWxlY3RlZExvY2F0aW9uKGlkPzogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3Qgc3BhY2UgPSBpZCA/IHRoaXMuZmluZFNwYWNlQnlJZChpZCkgOiBudWxsO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSBzcGFjZSA/IFtzcGFjZV0gOiB0aGlzLmxhc3RGaWx0cmVkTG9jYXRpb25zOyAvLyBOZXcgc2VsZWN0ZWQgc3BhY2Ugb3IgbGFzdCBmaWx0ZXJlZCBsb2NhdGlvblxyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2goKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVVc2VyUmlnaHRzKCk7XHJcbiAgICAgICAgdGhpcy5yZXNldExpc3QoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy51c2VyU3ViY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uSURTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXR1cE1lbnVJdGVtcygpIHtcclxuICAgICAgICB0aGlzLm1lbnVJdGVtcyA9IFt7IGxhYmVsOiBcIkFsbCBMb2NhdGlvbnNcIiwgdXJsOiBcIi9sb2NhbGlzYXRpb25cIiB9XTtcclxuICAgICAgICBpZiAodGhpcy5pc0FkZGluZykge1xyXG4gICAgICAgICAgICB0aGlzLm1lbnVJdGVtcy5wdXNoKHsgbGFiZWw6IFwiTmV3XCIgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkTG9jYXRpb25zLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZExvYyA9IHRoaXMuZmlsdGVyZWRMb2NhdGlvbnNbMF07XHJcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zLnB1c2goeyBsYWJlbDogc2VsZWN0ZWRMb2MubmFtZSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlVXNlclJpZ2h0cygpIHtcclxuICAgICAgICB0aGlzLmlzTWFuYWdlciA9IHRoaXMudXNlclNlcnZpY2UuaGFzTWFuYWdlclJvbGVJbkFueU1pc3Npb24oKTtcclxuICAgICAgICB0aGlzLmlzTXVzZXVtVXNlciA9IHRoaXMudXNlclNlcnZpY2UuaGFzT25seU11c2V1bVJvbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpc01hbmFnZXJGb3JTcGFjZShzcGFjZUlEOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmlzTWFuYWdlcihzcGFjZUlEKSB8fFxyXG4gICAgICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmlzR3VpZGUoc3BhY2VJRClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlc2V0TGlzdCgpIHtcclxuICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldExvY2F0aW9uc0ZvckN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IHRoaXMubG9jYXRpb25zO1xyXG4gICAgICAgIHRoaXMubGFzdEZpbHRyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucztcclxuICAgICAgICB0aGlzLmlzQWRkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VTZWxlY3RlZExvY2F0aW9uKFxyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudE5hdkJhckxvY2F0aW9uSUQsXHJcbiAgICAgICAgKTsgLy8gU2V0IGZvciB0aGUgY3VycmVudCBzZWxlY3RlZCBsb2NhdGlvblxyXG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZExvY2F0aW9uKCkge1xyXG4gICAgICAgIHRoaXMuaXNBZGRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVJbWFnZUlucHV0KGZpbGVzOiBGaWxlTGlzdCkge1xyXG4gICAgICAgIHRoaXMuaW1hZ2VUb1VwbG9hZCA9IGZpbGVzLml0ZW0oMCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Gb3JtQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZS5uZXh0KFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICk7IC8qKiBSZW1vdmUgc2VsZWN0ZWQgbG9jYXRpb24gKi9cclxuICAgICAgICB0aGlzLmlzQWRkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblZpc2l0Q2xpY2sobG9jOiBTcGFjZSwgdmlzaXQ6IFZpc2l0KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJTZXJ2aWNlLnVzZXJIYXNBY2Nlc3NUb0FsbFpvbmVzSW5TcGFjZShsb2MuaWQpKSB7XHJcbiAgICAgICAgICAgIC8vIGdldCBhbGxvd2VkIHN3ZWVwIGZvciB0aGUgdXNlclxyXG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkU3dlZXBzID1cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0QWxsb3dlZFN3ZWVwc0lEc0ZvclVzZXJJblNwYWNlKFxyXG4gICAgICAgICAgICAgICAgICAgIGxvYy5pZCxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0U3dlZXAgPSBhbGxvd2VkU3dlZXBzWzBdO1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2Uuc2V0U3dlZXBUb01vdmUoZmlyc3RTd2VlcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnVzZXJTZXJ2aWNlLmlzR3VpZGUobG9jLmlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJtdXNldW1cIiwgbG9jLmlkXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1widmlzaXRcIiwgbG9jLmlkXSwge1xyXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgbW9kZWwzRDogdmlzaXQubW9kZWwzZCB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlSZXN1bHRzU2VhcmNoQmFyKHJlc3VsdHM6IFNwYWNlW10pIHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gcmVzdWx0cyB8fCB0aGlzLmxvY2F0aW9ucztcclxuICAgICAgICB0aGlzLmxhc3RGaWx0cmVkTG9jYXRpb25zID0gdGhpcy5maWx0ZXJlZExvY2F0aW9ucztcclxuICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZS5uZXh0KG51bGwpOyAvLyBXaGVuIHdlIHNlYXJjaCB3aXRoIGtleXdvcmQsIHdlIHdvdWxkIGxpa2UgdG8gc2VhcmNoIG9uIGFsbCBsb2NhdGlvbnNcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWFyY2hUeXBlKCk6IFNlYXJjaE9iamVjdFR5cGUge1xyXG4gICAgICAgIHJldHVybiBTZWFyY2hPYmplY3RUeXBlLkxPQ0FUSU9OO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0cmluZ05vU3BhY2UoZGF0YSk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGEucmVwbGFjZSgvXFxzL2csICcnKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRldGFpbFZpZXdDbGljayhzcGFjZUlEOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZS5uZXh0KHNwYWNlSUQpOyAvLyBTZW5kIHVwZGF0ZSBmb3IgdGhlIGxvY2F0aW9uIGZpbHRlciBiYXJcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvbG9jYWxpc2F0aW9uXCIsIHNwYWNlSURdKTtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImRhc2hib2FyZC10YWJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItZGFzaGJvYXJkLXRhYlwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibS0zXCI+XHJcbiAgICAgICAgPGxpYi10YWItbmF2aWdhdGlvbiAob25Hb0JhY2spPVwib25Gb3JtQ2hhbmdlKG51bGwpXCIgW21lbnVJdGVtc109J21lbnVJdGVtcyc+PC9saWItdGFiLW5hdmlnYXRpb24+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0zIHJlZnJlc2hJY29uXCIgKGNsaWNrKT1cInJlZnJlc2goKVwiICpuZ0lmPVwiIShpc0FkZGluZylcIiBuZ2JUb29sdGlwPVwiUmVmcmVzaCBsaXN0XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnkgcmVmcmVzaEljb25cIiBkYXRhLWljb249XCJpb246cmVmcmVzaC1jaXJjbGVcIiBkYXRhLXdpZHRoPVwiMzVcIiBkYXRhLXJvdGF0ZT1cIjkwZGVnXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+ICBcclxuICAgICAgPGxpYi1zZWFyY2gtYmFyICpuZ0lmPVwiIWlzQWRkaW5nICYmICFpc011c2V1bVVzZXJcIiBbc2VhcmNoYWJsZV09XCJsb2NhdGlvbnNcIiBbb2JqZWN0VHlwZV09XCJnZXRTZWFyY2hUeXBlKClcIlxyXG4gICAgICAgIChzZWFyY2hFdmVudCk9XCJhcHBseVJlc3VsdHNTZWFyY2hCYXIoJGV2ZW50KVwiPjwvbGliLXNlYXJjaC1iYXI+XHJcbiAgICAgIFxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLThcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Atcm93XCIgKm5nSWY9XCIhaXNBZGRpbmcgJiYgaXNNYW5hZ2VyXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGRhdGEtdGVzdGlkPVwibmV3LWxvY2F0aW9uLWJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFkZC1sb2NhdGlvblwiIChjbGljayk9XCJvbkFkZExvY2F0aW9uKClcIj5cclxuICAgICAgICAgICAge3snQWRkIGxvY2F0aW9uJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJvdXRlcl9jaXJjbGVcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBpZD0nYnRuLWljb24nIChjbGljayk9XCJvbkFkZExvY2F0aW9uKClcIj48L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxocj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cImlzQWRkaW5nXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgIDxoND57eydOZXcgbG9jYXRpb24nIHwgdHJhbnNsYXRlfX08L2g0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHNlY3Rpb24gKm5nSWY9XCIhaXNBZGRpbmdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy02XCIgKm5nSWY9XCJmaWx0ZXJlZExvY2F0aW9uc1wiPlxyXG4gICAgICAgICAgPHVsIGRhdGEtdGVzdGlkPVwibG9jYXRpb24tbGlzdC1jb250YWluZXJcIiBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbGlzdC1ncm91cC1pdGVtXCJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbG9jIG9mIGZpbHRlcmVkTG9jYXRpb25zOyBpbmRleCBhcyBpbmRleFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBpbWctbWFpbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImltZ19jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwibG9jYXRpb24taW1nXCIgKm5nSWY9XCJsb2MuYW5uZXhlczsgZWxzZSBlbHNlQmxvY2tcIiBbc3JjXT1cImxvYy5hbm5leGVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlQmxvY2s+PGltZyBjbGFzcz1cImxvY2F0aW9uLWltZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cIi4vLi4vLi4vLi4vLi4vYXNzZXRzL2ltYWdlcy92aXN1ZWwtb2ZmLWJpZy5qcGdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbbmdDbGFzc109XCJbJ29wZW4tYnRuLScrZ2V0U3RyaW5nTm9TcGFjZShsb2MubmFtZSldXCIgKm5nSWY9XCJpc01hbmFnZXJGb3JTcGFjZShsb2MuaWQpXCIgY2xhc3M9XCJidG4tZGV0YWlsc1wiIChjbGljayk9XCJvbkRldGFpbFZpZXdDbGljayhsb2MuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eydWaWV3IGRldGFpbHMnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNyBsb2NhdGlvbi1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwPnt7bG9jLm5hbWV9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgPHA+e3tsb2MuYWRkcmVzc2VzfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgIDxwIFtuZ0NsYXNzXT1cIlsndmlldy1idG4tJytnZXRTdHJpbmdOb1NwYWNlKGxvYy5uYW1lKV1cIiAqbmdGb3I9XCJsZXQgdmlzaXQgb2YgbG9jLnZpc2l0c1wiIChjbGljayk9XCJvblZpc2l0Q2xpY2sobG9jLCB2aXNpdClcIiBjbGFzcz1cInZpc2l0LW5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCIgbmdiVG9vbHRpcD1cIlZpc2l0XCI+e3sgdmlzaXQubmFtZSA/IHZpc2l0Lm5hbWUgOiBsb2MubmFtZX19PC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgXHJcbiAgICAgICAgICA8L3VsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy02XCI+XHJcbiAgICAgICAgICA8bGliLW1hcCBbc3BhY2VzXT1cImZpbHRlcmVkTG9jYXRpb25zXCI+PC9saWItbWFwPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvc2VjdGlvbj5cclxuICAgIDxsaWItZm9ybS1sb2NhdGlvbiAqbmdJZj1cImlzQWRkaW5nXCIgKG9uQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgkZXZlbnQpXCI+PC9saWItZm9ybS1sb2NhdGlvbj5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/router";
|
|
4
|
+
import * as i2 from "@angular/common";
|
|
5
|
+
class MapPopupComponent {
|
|
6
|
+
router;
|
|
7
|
+
ngZone;
|
|
8
|
+
space;
|
|
9
|
+
marker;
|
|
10
|
+
popuparea;
|
|
11
|
+
isOnPopup = false;
|
|
12
|
+
isMuseumUser = true;
|
|
13
|
+
constructor(router, ngZone) {
|
|
14
|
+
this.router = router;
|
|
15
|
+
this.ngZone = ngZone;
|
|
16
|
+
}
|
|
17
|
+
ngOnInit() {
|
|
18
|
+
this.marker.on("click", () => this.onClickVisitFirst());
|
|
19
|
+
this.marker.on("mouseover", () => {
|
|
20
|
+
this.isOnPopup = true;
|
|
21
|
+
if (!this.marker.isPopupOpen()) {
|
|
22
|
+
this.openPopup();
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
openPopup() {
|
|
27
|
+
this.marker.openPopup();
|
|
28
|
+
this.isOnPopup = false;
|
|
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
|
+
});
|
|
36
|
+
this.marker.on("mouseout", () => {
|
|
37
|
+
this.closePopup();
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
closePopup() {
|
|
41
|
+
this.isOnPopup = false;
|
|
42
|
+
/** We want to wait to avoid glitch */
|
|
43
|
+
setTimeout(() => {
|
|
44
|
+
if (!this.isOnPopup) {
|
|
45
|
+
this.marker.closePopup();
|
|
46
|
+
}
|
|
47
|
+
}, 100);
|
|
48
|
+
}
|
|
49
|
+
onClickVisitFirst() {
|
|
50
|
+
if (this.space.visits.length === 0) {
|
|
51
|
+
console.log("No space to visit !");
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
this.onVisitClick(this.space.visits[0]);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async onVisitClick(visit) {
|
|
58
|
+
this.ngZone.run(() => {
|
|
59
|
+
this.router.navigate(["visit", this.space.id], {
|
|
60
|
+
queryParams: { model3D: visit.model3d },
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.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: "16.2.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"] }] });
|
|
66
|
+
}
|
|
67
|
+
export { MapPopupComponent };
|
|
68
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapPopupComponent, decorators: [{
|
|
69
|
+
type: Component,
|
|
70
|
+
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
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i0.NgZone }]; } });
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXBvcHVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9tYXAvbWFwLXBvcHVwL21hcC1wb3B1cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tbG9jYXRpb25zL3NyYy9saWIvY29tcG9uZW50cy9sb2NhdGlvbnMvbWFwL21hcC1wb3B1cC9tYXAtcG9wdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7Ozs7QUFLMUQsTUFLYSxpQkFBaUI7SUFZTjtJQUF3QjtJQVY1QyxLQUFLLENBQVE7SUFFYixNQUFNLENBQVM7SUFFZixTQUFTLENBQWM7SUFFdkIsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUVsQixZQUFZLEdBQUcsSUFBSSxDQUFDO0lBRXBCLFlBQW9CLE1BQWMsRUFBVSxNQUFjO1FBQXRDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQUksQ0FBQztJQUUvRCxRQUFRO1FBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFFeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtZQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ3BCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsU0FBUztRQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1lBQy9DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtZQUM5QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFVBQVU7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixzQ0FBc0M7UUFDdEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQzVCO1FBQ0wsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUVELGlCQUFpQjtRQUNiLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDdEM7YUFBTTtZQUNILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQVk7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQzNDLFdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO2FBQzFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzt3R0FsRVEsaUJBQWlCOzRGQUFqQixpQkFBaUIscURDVjlCLGluQkFXQTs7U0REYSxpQkFBaUI7NEZBQWpCLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBOZ1pvbmUsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBNYXJrZXIgfSBmcm9tICdsZWFmbGV0JztcclxuaW1wb3J0IHsgU3BhY2UsIFZpc2l0IH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLW1hcC1wb3B1cCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL21hcC1wb3B1cC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbWFwLXBvcHVwLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE1hcFBvcHVwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBzcGFjZTogU3BhY2U7XHJcblxyXG4gICAgbWFya2VyOiBNYXJrZXI7XHJcblxyXG4gICAgcG9wdXBhcmVhOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBpc09uUG9wdXAgPSBmYWxzZTtcclxuXHJcbiAgICBpc011c2V1bVVzZXIgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsIHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMubWFya2VyLm9uKFwiY2xpY2tcIiwgKCkgPT4gdGhpcy5vbkNsaWNrVmlzaXRGaXJzdCgpKTtcclxuXHJcbiAgICAgICAgdGhpcy5tYXJrZXIub24oXCJtb3VzZW92ZXJcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzT25Qb3B1cCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5tYXJrZXIuaXNQb3B1cE9wZW4oKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuUG9wdXAoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Qb3B1cCgpIHtcclxuICAgICAgICB0aGlzLm1hcmtlci5vcGVuUG9wdXAoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc09uUG9wdXAgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnBvcHVwYXJlYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubGVhZmxldC1wb3B1cFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5wb3B1cGFyZWEuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnBvcHVwYXJlYS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc09uUG9wdXAgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMubWFya2VyLm9uKFwibW91c2VvdXRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZVBvcHVwKCkge1xyXG4gICAgICAgIHRoaXMuaXNPblBvcHVwID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFdlIHdhbnQgdG8gd2FpdCB0byBhdm9pZCBnbGl0Y2ggKi9cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzT25Qb3B1cCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrZXIuY2xvc2VQb3B1cCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrVmlzaXRGaXJzdCgpIHtcclxuICAgICAgICBpZiAodGhpcy5zcGFjZS52aXNpdHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTm8gc3BhY2UgdG8gdmlzaXQgIVwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm9uVmlzaXRDbGljayh0aGlzLnNwYWNlLnZpc2l0c1swXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uVmlzaXRDbGljayh2aXNpdDogVmlzaXQpIHtcclxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJ2aXNpdFwiLCB0aGlzLnNwYWNlLmlkXSwge1xyXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgbW9kZWwzRDogdmlzaXQubW9kZWwzZCB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiPGRpdiBpZD1cIm1hcC1wb3B1cFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1hcC1wb3B1cC1oZWFkZXJcIiAoY2xpY2spPVwib25DbGlja1Zpc2l0Rmlyc3QoKVwiIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCI+XHJcbiAgICAgICAgPGltZyBbc3JjXT1cInNwYWNlLmFubmV4ZXNcIiAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWFwLXBvcHVwLWRldGFpbHNcIj5cclxuICAgIDxoMSAoY2xpY2spPVwib25DbGlja1Zpc2l0Rmlyc3QoKVwiIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCI+e3tzcGFjZS5uYW1lfX08L2gxPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJtYXAtcG9wdXAtYWRkcmVzc1wiPnt7c3BhY2UuYWRkcmVzc2VzfX08L3NwYW4+XHJcbiAgICA8c3BhbiAqbmdGb3I9XCJsZXQgdmlzaXQgb2Ygc3BhY2UudmlzaXRzXCIgY2xhc3M9XCJtYXAtcG9wdXAtdmlzaXRcIiAoY2xpY2spPVwib25WaXNpdENsaWNrKHZpc2l0KVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCI+4p6kIHt7IHZpc2l0Lm5hbWUgPyB2aXNpdC5uYW1lIDogc3BhY2UubmFtZX19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { latLng, marker, tileLayer, latLngBounds, point, Marker, icon, } from "leaflet";
|
|
3
|
+
import { MapPopupComponent } from './map-popup/map-popup.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@asymmetrik/ngx-leaflet";
|
|
6
|
+
const iconRetinaUrl = "assets/marker-icon-2x.png";
|
|
7
|
+
const iconUrl = "assets/marker-icon.png";
|
|
8
|
+
const shadowUrl = "assets/marker-shadow.png";
|
|
9
|
+
const iconDefault = icon({
|
|
10
|
+
iconRetinaUrl,
|
|
11
|
+
iconUrl,
|
|
12
|
+
shadowUrl,
|
|
13
|
+
iconSize: [25, 41],
|
|
14
|
+
iconAnchor: [12, 41],
|
|
15
|
+
popupAnchor: [1, -34],
|
|
16
|
+
tooltipAnchor: [16, -28],
|
|
17
|
+
shadowSize: [41, 41],
|
|
18
|
+
});
|
|
19
|
+
Marker.prototype.options.icon = iconDefault;
|
|
20
|
+
class MapComponent {
|
|
21
|
+
viewContainerRef;
|
|
22
|
+
constructor(viewContainerRef) {
|
|
23
|
+
this.viewContainerRef = viewContainerRef;
|
|
24
|
+
}
|
|
25
|
+
spaces;
|
|
26
|
+
options = {
|
|
27
|
+
layers: [
|
|
28
|
+
tileLayer("http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
|
29
|
+
maxZoom: 18,
|
|
30
|
+
attribution: "...",
|
|
31
|
+
}),
|
|
32
|
+
],
|
|
33
|
+
zoom: 5.5,
|
|
34
|
+
center: latLng(47.06394, 2.77736),
|
|
35
|
+
};
|
|
36
|
+
layers = [];
|
|
37
|
+
map;
|
|
38
|
+
ngOnChanges(changes) {
|
|
39
|
+
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));
|
|
57
|
+
}
|
|
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
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
onMapReady(map) {
|
|
73
|
+
this.map = map;
|
|
74
|
+
}
|
|
75
|
+
createPopupComponent(space, marker) {
|
|
76
|
+
const comp = this.viewContainerRef.createComponent(MapPopupComponent);
|
|
77
|
+
comp.instance.space = space;
|
|
78
|
+
comp.instance.marker = marker;
|
|
79
|
+
comp.changeDetectorRef.detectChanges();
|
|
80
|
+
return comp.location.nativeElement;
|
|
81
|
+
}
|
|
82
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
83
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.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"] }] });
|
|
84
|
+
}
|
|
85
|
+
export { MapComponent };
|
|
86
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapComponent, decorators: [{
|
|
87
|
+
type: Component,
|
|
88
|
+
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>" }]
|
|
89
|
+
}], ctorParameters: function () { return [{ type: i0.ViewContainerRef }]; }, propDecorators: { spaces: [{
|
|
90
|
+
type: Input
|
|
91
|
+
}] } });
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9tYXAvbWFwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9tYXAvbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVksS0FBSyxFQUFzRCxNQUFNLGVBQWUsQ0FBQztBQUUvRyxPQUFPLEVBQ0gsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sSUFBSSxHQUNQLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7QUFJcEUsTUFBTSxhQUFhLEdBQUcsMkJBQTJCLENBQUM7QUFDbEQsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUM7QUFDekMsTUFBTSxTQUFTLEdBQUcsMEJBQTBCLENBQUM7QUFDN0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLGFBQWE7SUFDYixPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDbEIsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNwQixXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDckIsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3hCLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDdkIsQ0FBQyxDQUFDO0FB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QWEsQ0FBQztJQUN2QyxDQUFDO3dHQXRFUSxZQUFZOzRGQUFaLFlBQVksa0dDbkN6QixzTUFDZ0U7O1NEa0NuRCxZQUFZOzRGQUFaLFlBQVk7a0JBTHhCLFNBQVM7K0JBQ0ksU0FBUzt1R0FRVixNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdG9yLCBJbnB1dCwgTmdab25lLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3BhY2UgfSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQge1xyXG4gICAgbGF0TG5nLFxyXG4gICAgbWFya2VyLFxyXG4gICAgdGlsZUxheWVyLFxyXG4gICAgTWFwLFxyXG4gICAgbGF0TG5nQm91bmRzLFxyXG4gICAgcG9pbnQsXHJcbiAgICBNYXJrZXIsXHJcbiAgICBpY29uLFxyXG59IGZyb20gXCJsZWFmbGV0XCI7XHJcbmltcG9ydCB7IE1hcFBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi9tYXAtcG9wdXAvbWFwLXBvcHVwLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5cclxuY29uc3QgaWNvblJldGluYVVybCA9IFwiYXNzZXRzL21hcmtlci1pY29uLTJ4LnBuZ1wiO1xyXG5jb25zdCBpY29uVXJsID0gXCJhc3NldHMvbWFya2VyLWljb24ucG5nXCI7XHJcbmNvbnN0IHNoYWRvd1VybCA9IFwiYXNzZXRzL21hcmtlci1zaGFkb3cucG5nXCI7XHJcbmNvbnN0IGljb25EZWZhdWx0ID0gaWNvbih7XHJcbiAgICBpY29uUmV0aW5hVXJsLFxyXG4gICAgaWNvblVybCxcclxuICAgIHNoYWRvd1VybCxcclxuICAgIGljb25TaXplOiBbMjUsIDQxXSxcclxuICAgIGljb25BbmNob3I6IFsxMiwgNDFdLFxyXG4gICAgcG9wdXBBbmNob3I6IFsxLCAtMzRdLFxyXG4gICAgdG9vbHRpcEFuY2hvcjogWzE2LCAtMjhdLFxyXG4gICAgc2hhZG93U2l6ZTogWzQxLCA0MV0sXHJcbn0pO1xyXG5NYXJrZXIucHJvdG90eXBlLm9wdGlvbnMuaWNvbiA9IGljb25EZWZhdWx0O1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbGliLW1hcCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbWFwLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL21hcC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikgeyB9XHJcblxyXG4gICAgQElucHV0KCkgc3BhY2VzOiBTcGFjZVtdO1xyXG5cclxuICAgIG9wdGlvbnMgPSB7XHJcbiAgICAgICAgbGF5ZXJzOiBbXHJcbiAgICAgICAgICAgIHRpbGVMYXllcihcImh0dHA6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmdcIiwge1xyXG4gICAgICAgICAgICAgICAgbWF4Wm9vbTogMTgsXHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbjogXCIuLi5cIixcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgXSxcclxuICAgICAgICB6b29tOiA1LjUsXHJcbiAgICAgICAgY2VudGVyOiBsYXRMbmcoNDcuMDYzOTQsIDIuNzc3MzYpLFxyXG4gICAgfTtcclxuXHJcbiAgICBsYXllcnM6IGFueVtdID0gW107XHJcblxyXG4gICAgbWFwOiBhbnk7XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLnNwYWNlcykge1xyXG4gICAgICAgICAgICBjb25zdCBubSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBiZCA9IFtdO1xyXG4gICAgICAgICAgICBpZiAoIWNoYW5nZXMuc3BhY2VzLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEZpbHRlcmluZyBvdXQgc3BhY2VzIHdpdGhvdXQgbGF0L2xvbmdpdHVkZXNcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIGNoYW5nZXMuc3BhY2VzLmN1cnJlbnRWYWx1ZSBhcyBTcGFjZVtdKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocy5sYXRpdHVkZSA9PT0gbnVsbCB8fCBzLmxvbmdpdHVkZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtzLm5hbWV9IGhhcyBub3QgY29vcmRpbmF0ZXMgZm9yICR7cy5hZGRyZXNzZXN9YCxcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gV2UgdXNlIHRoZSBwb3B1cCBzeXN0ZW0gZnJvbSBsZWFmbGV0LCBhcyBpdCBwYWNrcyBhIGZldyBpbXByb3ZlbWVudHNcclxuICAgICAgICAgICAgICAgIC8vIG9uIHVzaW5nIGJvb3RzdHJhcDogYXV0b2Nsb3NlIG90aGVyIHBvcHVwcywgY2xvc2luZyBvcHRpb24uXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtID0gbWFya2VyKFtzLmxhdGl0dWRlLCBzLmxvbmdpdHVkZV0pO1xyXG5cclxuICAgICAgICAgICAgICAgIG0uYmluZFBvcHVwKHRoaXMuY3JlYXRlUG9wdXBDb21wb25lbnQocywgbSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIG5tLnB1c2gobSk7XHJcbiAgICAgICAgICAgICAgICBiZC5wdXNoKGxhdExuZyhzLmxhdGl0dWRlLCBzLmxvbmdpdHVkZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIE5vdGUgaG93IHdlIHNldCB0aGUgbGF5ZXJzIGluIG9uZSBhc3NpZ25tZW50LCBpbiBvcmRlciB0byBoYXZlIGxlYWZsZXRcclxuICAgICAgICAgICAgLy8gZGV0ZWN0cyB0aGUgY2hhbmdlIGNvcnJlY3RseVxyXG4gICAgICAgICAgICAvLyBXZSBhbHNvIHNldCB0aGUgYm91bmRzIGFmdGVyd2FyZCwgZm9yIHRoZSBtYXAgdG8gYmUgcHJvcGVybHkgem9vbWVkIGFuZFxyXG4gICAgICAgICAgICAvLyBjZW50ZXJlZFxyXG4gICAgICAgICAgICB0aGlzLmxheWVycyA9IG5tO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tYXAgJiYgYmQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXAuZml0Qm91bmRzKGxhdExuZ0JvdW5kcyhiZCksIHtcclxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBwb2ludCg0OCwgNDgpLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heFpvb206IDEyLFxyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbk1hcFJlYWR5KG1hcDogTWFwKSB7XHJcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlUG9wdXBDb21wb25lbnQoc3BhY2U6IFNwYWNlLCBtYXJrZXI6IE1hcmtlcikge1xyXG4gICAgICAgIGNvbnN0IGNvbXAgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KE1hcFBvcHVwQ29tcG9uZW50KTtcclxuICAgICAgICBjb21wLmluc3RhbmNlLnNwYWNlID0gc3BhY2U7XHJcbiAgICAgICAgY29tcC5pbnN0YW5jZS5tYXJrZXIgPSBtYXJrZXI7XHJcbiAgICAgICAgY29tcC5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgcmV0dXJuIGNvbXAubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiPGRpdiBbbGVhZmxldExheWVyc109XCJsYXllcnNcIiBbbGVhZmxldE9wdGlvbnNdPVwib3B0aW9uc1wiIChsZWFmbGV0TWFwUmVhZHkpPVwib25NYXBSZWFkeSgkYW55KCRldmVudCkpXCIgaWQ9XCJtYXBcIiBsZWFmbGV0XHJcbiAgICBzdHlsZT1cImhlaWdodDogNTAwcHg7IG1hcmdpbi10b3A6IDMwcHg7IHotaW5kZXg6IDE5NVwiPjwvZGl2PiJdfQ==
|