@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.
Files changed (82) hide show
  1. package/esm2022/lib/components/carousel/carousel.component.mjs +30 -0
  2. package/esm2022/lib/components/chevron/chevron.component.mjs +18 -0
  3. package/esm2022/lib/components/detail-location/detail-location.component.mjs +183 -0
  4. package/{esm2020 → esm2022}/lib/components/form-location/form-location.component.mjs +254 -237
  5. package/esm2022/lib/components/images/images.component.mjs +120 -0
  6. package/esm2022/lib/components/locations/locations.component.mjs +157 -0
  7. package/esm2022/lib/components/locations/map/map-popup/map-popup.component.mjs +72 -0
  8. package/esm2022/lib/components/locations/map/map.component.mjs +92 -0
  9. package/esm2022/lib/components/plan-legend/plan-legend.component.mjs +49 -0
  10. package/esm2022/lib/components/plans/calibration/calibration.component.mjs +494 -0
  11. package/esm2022/lib/components/plans/edit-plan/edit-plan.component.mjs +350 -0
  12. package/{esm2020 → esm2022}/lib/components/plans/plans.component.mjs +243 -225
  13. package/esm2022/lib/components/tab-navigation/tab-navigation.component.mjs +43 -0
  14. package/esm2022/lib/components/visits/visits.component.mjs +294 -0
  15. package/esm2022/lib/components/zones/add-audio-zone/add-audio-zone.component.mjs +250 -0
  16. package/esm2022/lib/components/zones/add-zone/add-zone.component.mjs +333 -0
  17. package/esm2022/lib/components/zones/add-zone/selection/selection.component.mjs +81 -0
  18. package/esm2022/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.mjs +518 -0
  19. package/esm2022/lib/components/zones/zones.component.mjs +291 -0
  20. package/{esm2020 → esm2022}/lib/helper.service.mjs +133 -133
  21. package/esm2022/lib/ngx-smarterplan-location-routing.module.mjs +50 -0
  22. package/esm2022/lib/ngx-smarterplan-locations.module.mjs +124 -0
  23. package/esm2022/lib/ngx-smarterplan-locations.service.mjs +15 -0
  24. package/esm2022/lib/pipes/count-audio-sweeps.pipe.mjs +29 -0
  25. package/esm2022/lib/radio-button/radio-button.component.mjs +28 -0
  26. package/{esm2020 → esm2022}/public-api.mjs +8 -8
  27. package/{esm2020 → esm2022}/smarterplan-ngx-smarterplan-locations.mjs +4 -4
  28. package/{fesm2020 → fesm2022}/smarterplan-ngx-smarterplan-locations.mjs +3959 -3738
  29. package/fesm2022/smarterplan-ngx-smarterplan-locations.mjs.map +1 -0
  30. package/index.d.ts +5 -5
  31. package/lib/components/carousel/carousel.component.d.ts +12 -12
  32. package/lib/components/chevron/chevron.component.d.ts +9 -9
  33. package/lib/components/detail-location/detail-location.component.d.ts +55 -55
  34. package/lib/components/form-location/form-location.component.d.ts +45 -45
  35. package/lib/components/images/images.component.d.ts +33 -33
  36. package/lib/components/locations/locations.component.d.ts +51 -51
  37. package/lib/components/locations/map/map-popup/map-popup.component.d.ts +22 -22
  38. package/lib/components/locations/map/map.component.d.ts +21 -22
  39. package/lib/components/plan-legend/plan-legend.component.d.ts +14 -14
  40. package/lib/components/plans/calibration/calibration.component.d.ts +140 -140
  41. package/lib/components/plans/edit-plan/edit-plan.component.d.ts +55 -55
  42. package/lib/components/plans/plans.component.d.ts +63 -63
  43. package/lib/components/tab-navigation/tab-navigation.component.d.ts +13 -13
  44. package/lib/components/visits/visits.component.d.ts +63 -63
  45. package/lib/components/zones/add-audio-zone/add-audio-zone.component.d.ts +63 -63
  46. package/lib/components/zones/add-zone/add-zone.component.d.ts +69 -69
  47. package/lib/components/zones/add-zone/selection/selection.component.d.ts +44 -44
  48. package/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.d.ts +107 -107
  49. package/lib/components/zones/zones.component.d.ts +73 -73
  50. package/lib/helper.service.d.ts +53 -53
  51. package/lib/ngx-smarterplan-location-routing.module.d.ts +7 -7
  52. package/lib/ngx-smarterplan-locations.module.d.ts +36 -36
  53. package/lib/ngx-smarterplan-locations.service.d.ts +6 -6
  54. package/lib/pipes/count-audio-sweeps.pipe.d.ts +10 -10
  55. package/lib/radio-button/radio-button.component.d.ts +12 -12
  56. package/package.json +13 -19
  57. package/public-api.d.ts +4 -4
  58. package/esm2020/lib/components/carousel/carousel.component.mjs +0 -28
  59. package/esm2020/lib/components/chevron/chevron.component.mjs +0 -18
  60. package/esm2020/lib/components/detail-location/detail-location.component.mjs +0 -168
  61. package/esm2020/lib/components/images/images.component.mjs +0 -107
  62. package/esm2020/lib/components/locations/locations.component.mjs +0 -145
  63. package/esm2020/lib/components/locations/map/map-popup/map-popup.component.mjs +0 -66
  64. package/esm2020/lib/components/locations/map/map.component.mjs +0 -91
  65. package/esm2020/lib/components/plan-legend/plan-legend.component.mjs +0 -47
  66. package/esm2020/lib/components/plans/calibration/calibration.component.mjs +0 -468
  67. package/esm2020/lib/components/plans/edit-plan/edit-plan.component.mjs +0 -324
  68. package/esm2020/lib/components/tab-navigation/tab-navigation.component.mjs +0 -41
  69. package/esm2020/lib/components/visits/visits.component.mjs +0 -275
  70. package/esm2020/lib/components/zones/add-audio-zone/add-audio-zone.component.mjs +0 -230
  71. package/esm2020/lib/components/zones/add-zone/add-zone.component.mjs +0 -315
  72. package/esm2020/lib/components/zones/add-zone/selection/selection.component.mjs +0 -77
  73. package/esm2020/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.mjs +0 -502
  74. package/esm2020/lib/components/zones/zones.component.mjs +0 -268
  75. package/esm2020/lib/ngx-smarterplan-location-routing.module.mjs +0 -49
  76. package/esm2020/lib/ngx-smarterplan-locations.module.mjs +0 -123
  77. package/esm2020/lib/ngx-smarterplan-locations.service.mjs +0 -14
  78. package/esm2020/lib/pipes/count-audio-sweeps.pipe.mjs +0 -27
  79. package/esm2020/lib/radio-button/radio-button.component.mjs +0 -26
  80. package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs +0 -3983
  81. package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs.map +0 -1
  82. 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==