@smarterplan/ngx-smarterplan-locations 0.4.2 → 0.4.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"smarterplan-ngx-smarterplan-locations.mjs","sources":["../../../projects/ngx-smarterplan-locations/src/lib/ngx-smarterplan-locations.service.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/tab-navigation/tab-navigation.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/tab-navigation/tab-navigation.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/map/map-popup/map-popup.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/map/map-popup/map-popup.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/map/map.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/map/map.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/form-location/form-location.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/form-location/form-location.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/locations.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/locations.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/detail-location/detail-location.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/detail-location/detail-location.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/calibration/calibration.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/calibration/calibration.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/plans.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/plans.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/chevron/chevron.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/chevron/chevron.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/visits/visits.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/visits/visits.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/carousel/carousel.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/carousel/carousel.component.html","../../../projects/ngx-smarterplan-locations/src/lib/helper.service.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/selection/selection.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/selection/selection.component.html","../../../projects/ngx-smarterplan-locations/src/lib/radio-button/radio-button.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/radio-button/radio-button.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/plan-legend/plan-legend.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/plan-legend/plan-legend.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/add-zone.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/add-zone.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-audio-zone/add-audio-zone.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-audio-zone/add-audio-zone.component.html","../../../projects/ngx-smarterplan-locations/src/lib/pipes/count-audio-sweeps.pipe.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/zones.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/zones.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/images/images.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/images/images.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/edit-plan/edit-plan.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/edit-plan/edit-plan.component.html","../../../projects/ngx-smarterplan-locations/src/lib/ngx-smarterplan-location-routing.module.ts","../../../projects/ngx-smarterplan-locations/src/lib/ngx-smarterplan-locations.module.ts","../../../projects/ngx-smarterplan-locations/src/public-api.ts","../../../projects/ngx-smarterplan-locations/src/smarterplan-ngx-smarterplan-locations.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NgxSmarterplanLocationsService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { MenuItem } from '@smarterplan/ngx-smarterplan-core';\r\n\r\n@Component({\r\n selector: 'lib-tab-navigation',\r\n templateUrl: './tab-navigation.component.html',\r\n styleUrls: ['./tab-navigation.component.scss']\r\n})\r\nexport class TabNavigationComponent {\r\n\r\n @Output() onGoBack = new EventEmitter<void>();\r\n\r\n @Input() menuItems: MenuItem[] = [];\r\n\r\n constructor(private router: Router) { }\r\n\r\n onClick(url: string, parameter: any, index: number) {\r\n if (index === this.menuItems.length - 1) {\r\n return;\r\n }\r\n if (url) {\r\n const newURL = `/dashboard${url}`;\r\n if (this.router.url !== newURL) {\r\n console.log('new url', newURL);\r\n this.router.navigate([newURL]);\r\n } else {\r\n this.onGoBack.emit(parameter);\r\n }\r\n } else {\r\n this.onGoBack.emit(parameter);\r\n }\r\n }\r\n\r\n}\r\n","<span class=\"menu\">\r\n <span *ngFor=\"let item of menuItems; let index = index;\">\r\n <span class=\"item\" [ngClass]=\"{'current':index === menuItems.length - 1}\"\r\n (click)=\"onClick(item.url,item.back, index)\">{{item.label | translate}}</span> <span\r\n *ngIf=\"index !== menuItems.length - 1\" class=\"separator\">></span>\r\n </span>\r\n</span>\r\n","import { Component, NgZone, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { Marker } from 'leaflet';\r\nimport { Space, Visit } from '@smarterplan/ngx-smarterplan-core';\r\n\r\n@Component({\r\n selector: 'lib-map-popup',\r\n templateUrl: './map-popup.component.html',\r\n styleUrls: ['./map-popup.component.scss']\r\n})\r\nexport class MapPopupComponent implements OnInit {\r\n\r\n space: Space;\r\n\r\n marker: Marker;\r\n\r\n popuparea: HTMLElement;\r\n\r\n isOnPopup = false;\r\n\r\n isMuseumUser = true;\r\n\r\n constructor(private router: Router, private ngZone: NgZone) { }\r\n\r\n ngOnInit() {\r\n this.marker.on(\"click\", () => this.onClickVisitFirst());\r\n\r\n this.marker.on(\"mouseover\", () => {\r\n this.isOnPopup = true;\r\n if (!this.marker.isPopupOpen()) {\r\n this.openPopup();\r\n }\r\n });\r\n }\r\n\r\n openPopup() {\r\n this.marker.openPopup();\r\n\r\n this.isOnPopup = false;\r\n this.popuparea = document.querySelector(\".leaflet-popup\");\r\n\r\n this.popuparea.addEventListener(\"mouseleave\", () => {\r\n this.closePopup();\r\n });\r\n this.popuparea.addEventListener(\"mouseover\", () => {\r\n this.isOnPopup = true;\r\n });\r\n this.marker.on(\"mouseout\", () => {\r\n this.closePopup();\r\n });\r\n }\r\n\r\n closePopup() {\r\n this.isOnPopup = false;\r\n /** We want to wait to avoid glitch */\r\n setTimeout(() => {\r\n if (!this.isOnPopup) {\r\n this.marker.closePopup();\r\n }\r\n }, 100);\r\n }\r\n\r\n onClickVisitFirst() {\r\n if (this.space.visits.length === 0) {\r\n console.log(\"No space to visit !\");\r\n } else {\r\n this.onVisitClick(this.space.visits[0]);\r\n }\r\n }\r\n\r\n async onVisitClick(visit: Visit) {\r\n this.ngZone.run(() => {\r\n this.router.navigate([\"visit\", this.space.id], {\r\n queryParams: { model3D: visit.model3d },\r\n });\r\n });\r\n }\r\n\r\n}\r\n","<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'\">➤ {{ visit.name ? visit.name : space.name}}</span>\r\n </div>\r\n</div>\r\n","import { Component, Injector, Input, NgZone, OnChanges, SimpleChanges, ViewContainerRef } from '@angular/core';\r\nimport { Space } from '@smarterplan/ngx-smarterplan-core';\r\nimport {\r\n latLng,\r\n marker,\r\n tileLayer,\r\n Map,\r\n latLngBounds,\r\n point,\r\n Marker,\r\n icon,\r\n} from \"leaflet\";\r\nimport { MapPopupComponent } from './map-popup/map-popup.component';\r\nimport { Router } from '@angular/router';\r\n\r\n\r\nconst iconRetinaUrl = \"assets/marker-icon-2x.png\";\r\nconst iconUrl = \"assets/marker-icon.png\";\r\nconst shadowUrl = \"assets/marker-shadow.png\";\r\nconst iconDefault = icon({\r\n iconRetinaUrl,\r\n iconUrl,\r\n shadowUrl,\r\n iconSize: [25, 41],\r\n iconAnchor: [12, 41],\r\n popupAnchor: [1, -34],\r\n tooltipAnchor: [16, -28],\r\n shadowSize: [41, 41],\r\n});\r\nMarker.prototype.options.icon = iconDefault;\r\n@Component({\r\n selector: 'lib-map',\r\n templateUrl: './map.component.html',\r\n styleUrls: ['./map.component.scss']\r\n})\r\nexport class MapComponent implements OnChanges {\r\n\r\n constructor(private viewContainerRef: ViewContainerRef) { }\r\n\r\n @Input() spaces: Space[];\r\n\r\n options = {\r\n layers: [\r\n tileLayer(\"http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\", {\r\n maxZoom: 18,\r\n attribution: \"...\",\r\n }),\r\n ],\r\n zoom: 5.5,\r\n center: latLng(47.06394, 2.77736),\r\n };\r\n\r\n layers: any[] = [];\r\n\r\n map: any;\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes.spaces) {\r\n const nm = [];\r\n const bd = [];\r\n if (!changes.spaces.currentValue) {\r\n return;\r\n }\r\n // Filtering out spaces without lat/longitudes\r\n for (const s of changes.spaces.currentValue as Space[]) {\r\n if (s.latitude === null || s.longitude === null) {\r\n console.log(\r\n `${s.name} has not coordinates for ${s.addresses}`,\r\n );\r\n continue;\r\n }\r\n // We use the popup system from leaflet, as it packs a few improvements\r\n // on using bootstrap: autoclose other popups, closing option.\r\n const m = marker([s.latitude, s.longitude]);\r\n\r\n m.bindPopup(this.createPopupComponent(s, m));\r\n\r\n nm.push(m);\r\n bd.push(latLng(s.latitude, s.longitude));\r\n }\r\n // Note how we set the layers in one assignment, in order to have leaflet\r\n // detects the change correctly\r\n // We also set the bounds afterward, for the map to be properly zoomed and\r\n // centered\r\n this.layers = nm;\r\n if (this.map && bd.length > 0) {\r\n this.map.fitBounds(latLngBounds(bd), {\r\n padding: point(48, 48),\r\n maxZoom: 12,\r\n animate: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n onMapReady(map: Map) {\r\n this.map = map;\r\n }\r\n\r\n createPopupComponent(space: Space, marker: Marker) {\r\n const comp = this.viewContainerRef.createComponent(MapPopupComponent);\r\n comp.instance.space = space;\r\n comp.instance.marker = marker;\r\n comp.changeDetectorRef.detectChanges();\r\n return comp.location.nativeElement;\r\n }\r\n\r\n}\r\n","<div [leafletLayers]=\"layers\" [leafletOptions]=\"options\" (leafletMapReady)=\"onMapReady($any($event))\" id=\"map\" leaflet\r\n style=\"height: 500px; margin-top: 30px; z-index: 195\"></div>","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { UntypedFormGroup, UntypedFormBuilder, Validators, AbstractControl } from '@angular/forms';\r\nimport { Space, LevelStatus, SpaceService, PropertyService, BaseUserService, MissionService, enumToArray, uploadFileToS3, Layer, PropertyType, getSignedImageUrlForSpace, LayerService, deleteFromS3 } from '@smarterplan/ngx-smarterplan-core';\r\nimport { ValidatorsService, textValidator, noEmptyValidator, floatValidator } from \"@smarterplan/ngx-smarterplan-core\";\r\n\r\n@Component({\r\n selector: 'lib-form-location',\r\n templateUrl: './form-location.component.html',\r\n styleUrls: ['./form-location.component.scss']\r\n})\r\nexport class FormLocationComponent implements OnInit {\r\n\r\n form: UntypedFormGroup;\r\n\r\n @ViewChild(\"imageInputContainer\")\r\n imageInputContainer: ElementRef;\r\n\r\n @ViewChild(\"imageInput\")\r\n imageInput: ElementRef;\r\n\r\n @ViewChild(\"imageBasePreview\")\r\n imageBasePreview: ElementRef;\r\n\r\n @Input()\r\n location: Space;\r\n\r\n imageToUpload: any;\r\n\r\n isSubmitted = false;\r\n\r\n levels: Array<LevelStatus>;\r\n\r\n addMissionForNewSpace = true;\r\n\r\n imageInputText: string;\r\n\r\n currentImage: string;\r\n\r\n imageToBeDeleted: boolean = false;\r\n\r\n errorForm: boolean = false;\r\n\r\n @Output() onChange = new EventEmitter<Space | null>();\r\n\r\n constructor(\r\n private spaceService: SpaceService,\r\n private propertyService: PropertyService,\r\n private userService: BaseUserService,\r\n private fb: UntypedFormBuilder,\r\n private missionService: MissionService,\r\n private layerService: LayerService,\r\n public validatorsService: ValidatorsService\r\n ) {\r\n this.levels = enumToArray(LevelStatus);\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.location) {\r\n this.initEditForm();\r\n } else {\r\n this.initForm();\r\n }\r\n this.handleInputImageText();\r\n }\r\n\r\n initForm() {\r\n this.form = this.fb.group({\r\n name: [\"\", [Validators.required, Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n addresses: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n latitude: [null, [Validators.maxLength(255), noEmptyValidator(), floatValidator()]],\r\n longitude: [null, [Validators.maxLength(255), noEmptyValidator(), floatValidator()]],\r\n level: LevelStatus.LOW,\r\n classGes: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n classEnergyConsumption: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n constructionYear: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n });\r\n }\r\n\r\n initEditForm() {\r\n this.form = this.fb.group({\r\n id: this.location.id,\r\n name: [this.location.name, [Validators.required, Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n addresses: [this.location.addresses, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n latitude: [this.location.latitude, [Validators.maxLength(255), floatValidator()]],\r\n longitude: [this.location.longitude, [Validators.maxLength(255), floatValidator()]],\r\n level: this.location.level,\r\n classGes: [this.location.classGes, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n classEnergyConsumption: [this.location.classEnergyConsumption, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n constructionYear: [this.location.constructionYear, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n });\r\n }\r\n\r\n handleImageInput(target: EventTarget) {\r\n this.imageToUpload = (target as HTMLInputElement).files[0];\r\n if (this.imageToUpload) {\r\n this.imageInputContainer.nativeElement.style.display = \"none\";\r\n const reader = new FileReader();\r\n reader.addEventListener(\"load\", () => {\r\n this.currentImage = reader.result as string;\r\n });\r\n reader.readAsDataURL(this.imageToUpload);\r\n }\r\n }\r\n\r\n async uploadImage(spaceID: string) {\r\n if (this.imageToUpload) {\r\n uploadFileToS3(\"locations/\", this.imageToUpload, spaceID).then(\r\n async (url) => {\r\n if (url) {\r\n await this.spaceService.updateSpace({\r\n id: spaceID,\r\n annexes: url,\r\n });\r\n }\r\n },\r\n );\r\n } else if (this.imageToBeDeleted) {\r\n await this.spaceService.updateSpace({\r\n id: spaceID,\r\n annexes: null,\r\n });\r\n await deleteFromS3(this.location.annexes);\r\n }\r\n }\r\n\r\n clearImageFile() {\r\n this.imageToUpload = null;\r\n this.currentImage = null;\r\n this.imageInputContainer.nativeElement.style.display = \"flex\";\r\n this.imageInput.nativeElement.value = \"\";\r\n this.imageInputText = \"Add picture\";\r\n }\r\n\r\n async getLayerByName(name: string): Promise<Layer> {\r\n const currentOrgId = this.userService.currentOrganisation().id;\r\n const layers = await this.layerService.getLayerByNameForOrganisation(\r\n name,\r\n currentOrgId,\r\n );\r\n if (layers) {\r\n return layers[0];\r\n }\r\n // create then\r\n return this.layerService.createLayerForOrganisation(name, currentOrgId);\r\n }\r\n\r\n async onSubmit() {\r\n this.isSubmitted = true;\r\n if (!this.form.valid) {\r\n this.errorForm = true;\r\n return;\r\n }\r\n try {\r\n this.errorForm = false;\r\n let space;\r\n if (this.location) {\r\n this.changeCommaToDot();\r\n space = await this.spaceService.updateSpace(this.form.value);\r\n if (space) {\r\n await this.uploadImage(space.id);\r\n this.location = space;\r\n this.onChange.emit(space);\r\n }\r\n } else {\r\n this.changeCommaToDot();\r\n const spaceInput = this.form.value as Space;\r\n const currentOrgID = this.userService.currentOrganisation().id;\r\n spaceInput.organisationID = currentOrgID;\r\n let layer = await this.getLayerByName(\"BUILDING\");\r\n if (!layer) {\r\n layer = await this.layerService.createLayerForOrganisation(\r\n \"BUILDING\",\r\n currentOrgID,\r\n );\r\n }\r\n space = await this.spaceService.createSpace(\r\n spaceInput,\r\n layer,\r\n );\r\n\r\n const missions = this.userService.getManagerMissions();\r\n if (space && missions.length > 0) {\r\n const exampleMission = missions[0];\r\n await this.uploadImage(space.id);\r\n try {\r\n await this.propertyService.createProperty({\r\n type: PropertyType.PROPERTY,\r\n spaceID: space.id,\r\n organisationID: currentOrgID,\r\n });\r\n } catch (e) {\r\n console.log(\"API Service does not have Property requests\");\r\n }\r\n\r\n // add directly a mission for this space\r\n if (this.addMissionForNewSpace) {\r\n await this.missionService.create({\r\n spaceID: space.id,\r\n userID: exampleMission.userID,\r\n role: exampleMission.role,\r\n level: exampleMission.level,\r\n organisationID: exampleMission.organisationID,\r\n orderedOrganisationID:\r\n exampleMission.organisationID,\r\n });\r\n }\r\n this.onChange.emit(space);\r\n } else {\r\n this.onChange.emit(null);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n this.onChange.emit(null);\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.form.reset();\r\n this.onChange.emit(null);\r\n }\r\n\r\n get name(): AbstractControl {\r\n return this.form.get(\"name\");\r\n }\r\n\r\n changeCommaToDot() {\r\n const updatedSpace = this.form.value;\r\n if (\r\n updatedSpace.latitude &&\r\n updatedSpace.latitude.toString().includes(\",\")\r\n ) {\r\n updatedSpace.latitude = updatedSpace.latitude\r\n .toString()\r\n .replace(\",\", \".\");\r\n Number.parseFloat(updatedSpace.latitude);\r\n }\r\n if (\r\n updatedSpace.longitude &&\r\n updatedSpace.longitude.toString().includes(\",\")\r\n ) {\r\n updatedSpace.longitude = updatedSpace.longitude\r\n .toString()\r\n .replace(\",\", \".\");\r\n Number.parseFloat(updatedSpace.longitude);\r\n }\r\n }\r\n\r\n handleInputImageText() {\r\n if (this.location && this.location.annexes) {\r\n this.imageInputText = \"Change picture\";\r\n getSignedImageUrlForSpace(this.location).then((url) => {\r\n if (url) {\r\n this.currentImage = url;\r\n }\r\n });\r\n } else {\r\n this.imageInputText = \"Add picture\";\r\n }\r\n }\r\n\r\n\r\n isFormError(control) {\r\n return control && control.invalid && this.errorForm;\r\n }\r\n\r\n\r\n onFormChange() {\r\n if (this.errorForm && this.form.valid) {\r\n this.errorForm = false;\r\n }\r\n\r\n }\r\n}\r\n","<div class=\"col-md-6 form-new-loc\" *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" data-testid=\"new-location-name\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['name'])|| isFormError(form.controls['name'])}\"\r\n required formControlName=\"name\">\r\n\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-name-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['name']) \r\n || isFormError(form.controls['name'])\">\r\n {{validatorsService.getError(form.controls['name']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"addresses\" data-testid=\"new-location-address\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['addresses']) || isFormError(form.controls['addresses'])}\">\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"\" [translate]=\"validatorsService.getError(form.controls['addresses'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['addresses'])\"></span>\r\n\r\n <ngb-alert data-testid=\"new-location-address-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['addresses']) \">\r\n\r\n {{validatorsService.getError(form.controls['addresses']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Construction year' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"constructionYear\"\r\n data-testid=\"new-location-constructionYear\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-constructionYear-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])\">\r\n {{validatorsService.getError(form.controls['constructionYear']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Latitude' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"latitude\" data-testid=\"new-location-latitude\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['latitude'])|| isFormError(form.controls['latitude'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-latitude-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['latitude']) || isFormError(form.controls['latitude'])\">\r\n {{validatorsService.getError(form.controls['latitude']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Longitude' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"longitude\" data-testid=\"new-location-longitude\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['longitude'])|| isFormError(form.controls['longitude'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-longitude-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['longitude']) || isFormError(form.controls['longitude'])\">\r\n {{validatorsService.getError(form.controls['longitude']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Access level' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <select class=\"d-inline-block custom-select rounded-pill\" formControlName=\"level\">\r\n <option *ngFor=\"let level of levels\" [value]=\"level\">{{level | translate}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Energy Class' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"classEnergyConsumption\"\r\n data-testid=\"new-location-classEnergyConsumption\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-classEnergyConsumption-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])\">\r\n {{validatorsService.getError(form.controls['classEnergyConsumption']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Greenhouse gas emission Class' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"classGes\" data-testid=\"new-location-classGes\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classGes'])|| isFormError(form.controls['classGes'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-classGes-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['classGes']) || isFormError(form.controls['classGes'])\">\r\n {{validatorsService.getError(form.controls['classGes']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Cover picture' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <img #imageBasePreview *ngIf=\"currentImage\" class=\"image-preview\" [src]=\"currentImage\">\r\n <label #imageInputContainer for=\"image\"\r\n class=\"btn btn-label-file btn-outline-primary rounded-pill imageInputContainer\">\r\n <input #imageInput type=\"file\" id=\"image\" (change)=\"handleImageInput($event.target)\" />\r\n {{ imageInputText | translate}}</label>\r\n <button *ngIf=\"currentImage && !imageToUpload\" class=\"btn btn-outline-primary rounded-pill\"\r\n (click)=\"imageToBeDeleted=true;clearImageFile()\">{{'Delete picture' | translate }}</button>\r\n <div class=\"image-name\" *ngIf=\"imageToUpload\">\r\n <p>{{ imageToUpload.name}}</p>\r\n <div (click)=\"clearImageFile()\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\" *ngIf=\"!location\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Create mission for this space' | translate}}</label>\r\n <div class=\"col-sm-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"addMissionForNewSpace\" [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div>\r\n\r\n <button data-testid=\"new-location-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\" type=\"submit\"\r\n class=\"btn btn-outline-primary rounded-pill me-3\">{{'Save' | translate}}</button>\r\n\r\n <button data-testid=\"new-location-close-btn\" type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\r\n translate}}</button>\r\n\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"new-location-form-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n\r\n </ngb-alert>\r\n </div>\r\n </form>\r\n</div>","import { Component, OnInit } from '@angular/core';\r\nimport { UntypedFormGroup } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { LevelStatus, Space, SpaceService, BaseUserService, ViewerService, NavigationService, NavigatorService, enumToArray, Visit, MenuItem, SearchObjectType } from '@smarterplan/ngx-smarterplan-core';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-locations',\r\n templateUrl: './locations.component.html',\r\n styleUrls: ['./locations.component.scss']\r\n})\r\nexport class LocationsComponent implements OnInit {\r\n\r\n createForm: UntypedFormGroup;\r\n\r\n levels: Array<LevelStatus>;\r\n\r\n imageToUpload: File;\r\n\r\n isAdding = false;\r\n\r\n filteredLocations: Space[] = [];\r\n\r\n isManager = false;\r\n\r\n isMuseumUser = true;\r\n\r\n locations: Space[] = [];\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n userSubcription: Subscription;\r\n\r\n locationIDSubscription: Subscription;\r\n\r\n /** Last filtered Locations, used when we go back on all locations from the search bar location */\r\n lastFiltredLocations: Space[] = [];\r\n\r\n constructor(\r\n private spaceService: SpaceService,\r\n private router: Router,\r\n private userService: BaseUserService,\r\n private viewerService: ViewerService,\r\n private navigationService: NavigationService,\r\n private navigatorService: NavigatorService,\r\n ) {\r\n this.levels = enumToArray(LevelStatus);\r\n this.userSubcription = this.userService.isChanged.subscribe((isConnected) => {\r\n if (isConnected) {\r\n this.refresh();\r\n }\r\n });\r\n\r\n this.locationIDSubscription =\r\n this.navigatorService.locationIDChange.subscribe((id) => {\r\n this.changeSelectedLocation(id);\r\n this.setupMenuItems();\r\n });\r\n }\r\n\r\n async ngOnInit() {\r\n if (this.userService.cu) {\r\n this.resetList();\r\n this.updateUserRights();\r\n }\r\n this.setupMenuItems();\r\n }\r\n\r\n\r\n findSpaceById(id: string): Space {\r\n return this.locations.find((loc) => loc.id === id);\r\n }\r\n\r\n /**\r\n * Update when we change the selected location in filter (search bar)\r\n * @param id for a location, if null display all last filtred location\r\n */\r\n changeSelectedLocation(id?: string) {\r\n const space = id ? this.findSpaceById(id) : null;\r\n this.filteredLocations = space ? [space] : this.lastFiltredLocations; // New selected space or last filtered location\r\n }\r\n\r\n refresh() {\r\n this.updateUserRights();\r\n this.resetList();\r\n }\r\n\r\n\r\n ngOnDestroy() {\r\n this.userSubcription.unsubscribe();\r\n this.locationIDSubscription.unsubscribe();\r\n }\r\n\r\n setupMenuItems() {\r\n this.menuItems = [{ label: \"All Locations\", url: \"/localisation\" }];\r\n if (this.isAdding) {\r\n this.menuItems.push({ label: \"New\" });\r\n }\r\n if (this.filteredLocations.length === 1) {\r\n const selectedLoc = this.filteredLocations[0];\r\n this.menuItems.push({ label: selectedLoc.name });\r\n }\r\n }\r\n\r\n updateUserRights() {\r\n this.isManager = this.userService.hasManagerRoleInAnyMission();\r\n this.isMuseumUser = this.userService.hasOnlyMuseumRole();\r\n }\r\n\r\n isManagerForSpace(spaceID: string): boolean {\r\n return (\r\n this.userService.isManager(spaceID) ||\r\n this.userService.isGuide(spaceID)\r\n );\r\n }\r\n\r\n async resetList() {\r\n this.locations = await this.spaceService.getLocationsForCurrentUser();\r\n this.filteredLocations = this.locations;\r\n this.lastFiltredLocations = this.locations;\r\n this.isAdding = false;\r\n this.changeSelectedLocation(\r\n this.navigatorService.currentNavBarLocationID,\r\n ); // Set for the current selected location\r\n this.setupMenuItems();\r\n }\r\n\r\n onAddLocation() {\r\n this.isAdding = true;\r\n this.setupMenuItems();\r\n }\r\n\r\n handleImageInput(files: FileList) {\r\n this.imageToUpload = files.item(0);\r\n }\r\n\r\n onFormChange(event: any) {\r\n this.navigatorService.locationIDChange.next(\r\n null,\r\n ); /** Remove selected location */\r\n this.isAdding = false;\r\n if (event) {\r\n this.resetList();\r\n }\r\n this.setupMenuItems();\r\n }\r\n\r\n async onVisitClick(loc: Space, visit: Visit) {\r\n if (!this.userService.userHasAccessToAllZonesInSpace(loc.id)) {\r\n // get allowed sweep for the user\r\n const allowedSweeps =\r\n await this.navigationService.getAllowedSweepsIDsForUserInSpace(\r\n loc.id,\r\n );\r\n const firstSweep = allowedSweeps[0];\r\n this.viewerService.setSweepToMove(firstSweep);\r\n }\r\n if (this.userService.isGuide(loc.id)) {\r\n this.router.navigate([\"museum\", loc.id]);\r\n } else {\r\n this.router.navigate([\"visit\", loc.id], {\r\n queryParams: { model3D: visit.model3d },\r\n });\r\n }\r\n }\r\n\r\n applyResultsSearchBar(results: Space[]) {\r\n this.filteredLocations = results || this.locations;\r\n this.lastFiltredLocations = this.filteredLocations;\r\n this.navigatorService.locationIDChange.next(null); // When we search with keyword, we would like to search on all locations\r\n }\r\n\r\n getSearchType(): SearchObjectType {\r\n return SearchObjectType.LOCATION;\r\n }\r\n\r\n getStringNoSpace(data): string {\r\n return data.replace(/\\s/g, '');\r\n }\r\n\r\n onDetailViewClick(spaceID: string) {\r\n this.navigatorService.locationIDChange.next(spaceID); // Send update for the location filter bar\r\n this.router.navigate([\"dashboard/localisation\", spaceID]);\r\n }\r\n\r\n}\r\n","<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","import { Component, OnInit } from '@angular/core';\r\nimport { UntypedFormGroup } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { MenuItem, SpaceService, BaseUserService, NavigatorService, SpaceStatus, Space } from '@smarterplan/ngx-smarterplan-core';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-detail-location',\r\n templateUrl: './detail-location.component.html',\r\n styleUrls: ['./detail-location.component.scss']\r\n})\r\nexport class DetailLocationComponent implements OnInit {\r\n\r\n space: Space;\r\n\r\n editForm: UntypedFormGroup;\r\n\r\n isEditing = false;\r\n\r\n imageToUpload: File;\r\n\r\n id: string;\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n isValidatingDpe = false;\r\n\r\n selectedDpeResult: any;\r\n\r\n gettingData = false;\r\n\r\n parsedMetadata: {\r\n geo_adresse: string;\r\n secteur_activite: string;\r\n annee_construction: string;\r\n classe_consommation_energie: string;\r\n classe_estimation_ges: string;\r\n selected: boolean;\r\n }[];\r\n\r\n guestLink: string;\r\n\r\n canArchive: boolean;\r\n\r\n destroy$ = new Subject();\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private spaceService: SpaceService,\r\n private router: Router,\r\n private userService: BaseUserService,\r\n private translate: TranslateService,\r\n private navigatorService: NavigatorService,\r\n ) {\r\n this.navigatorService.locationIDChange\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((spaceID) => {\r\n this.router.navigate([\"dashboard/localisation\", spaceID]);\r\n });\r\n\r\n this.route.params.subscribe((params) => {\r\n this.id = params.id;\r\n this.setup();\r\n });\r\n }\r\n\r\n ngOnInit() { }\r\n\r\n async setup() {\r\n this.space = await this.spaceService.getSpace(this.id);\r\n this.setupMenuItems();\r\n this.setGuestLink();\r\n this.setCanArchive();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: \"Locations\", url: \"/localisation\" },\r\n {\r\n label: this.space.name,\r\n url: `/localisation/${this.space.id}`,\r\n },\r\n ];\r\n\r\n if (this.isEditing) {\r\n this.menuItems.push({ label: \"Edit\" });\r\n } else {\r\n this.menuItems.push({ label: \"Information\" });\r\n }\r\n }\r\n\r\n onEdit() {\r\n this.isEditing = true;\r\n this.setupMenuItems();\r\n }\r\n\r\n onReturn() {\r\n // this.locationService.back()\r\n this.router.navigate([\"dashboard/localisation\"]);\r\n }\r\n\r\n reset() {\r\n this.isEditing = false;\r\n this.setupMenuItems();\r\n }\r\n\r\n async onArchive() {\r\n const message = this.translate.instant(\"confirm.archiveSpace\");\r\n if (window.confirm(message)) {\r\n await this.spaceService.softDeleteSpace(this.id);\r\n this.onReturn();\r\n }\r\n }\r\n\r\n onFormChange(event: Space) {\r\n this.isEditing = false;\r\n if (event) {\r\n this.space = event;\r\n }\r\n this.setupMenuItems();\r\n }\r\n\r\n onDpeValidate() {\r\n this.isValidatingDpe = true;\r\n this.parsedMetadata = JSON.parse(this.space.metadata);\r\n this.parsedMetadata = this.parsedMetadata.filter(\r\n (result) => result.geo_adresse,\r\n );\r\n }\r\n\r\n onSelectChange(selectedResult: any) {\r\n for (const result of this.parsedMetadata) {\r\n if (result !== selectedResult && result.selected) {\r\n result.selected = false;\r\n }\r\n }\r\n this.selectedDpeResult = selectedResult;\r\n }\r\n\r\n async onSaveResult() {\r\n if (this.selectedDpeResult) {\r\n const input = {\r\n id: this.space.id,\r\n constructionYear: this.selectedDpeResult.annee_construction,\r\n classEnergyConsumption:\r\n this.selectedDpeResult.classe_consommation_energie,\r\n classGes: this.selectedDpeResult.classe_estimation_ges,\r\n status: SpaceStatus.DPE_VALIDATED,\r\n };\r\n const updatedLoc = await this.spaceService.updateSpace(input);\r\n this.space = updatedLoc;\r\n this.isValidatingDpe = false;\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.isValidatingDpe = false;\r\n }\r\n\r\n async onErase() {\r\n await this.spaceService.updateSpace({\r\n id: this.space.id,\r\n status: SpaceStatus.DPE_VALIDATED,\r\n });\r\n this.space.status = SpaceStatus.DPE_VALIDATED;\r\n this.isValidatingDpe = false;\r\n }\r\n\r\n async onGetDpeData() {\r\n this.gettingData = true;\r\n await this.spaceService.updateSpace({\r\n id: this.space.id,\r\n status: SpaceStatus.DPE_FETCH,\r\n });\r\n\r\n // force update of location\r\n setTimeout(async () => {\r\n this.space = await this.spaceService.getSpace(this.space.id);\r\n this.gettingData = false;\r\n }, 1500);\r\n }\r\n\r\n setGuestLink() {\r\n if (this.space.guestLink) {\r\n const { origin } = document.location;\r\n this.guestLink = `${origin}/${this.space.guestLink}`;\r\n setTimeout(() => {\r\n const hyperlink = document.querySelector(\r\n \"#linkHref\",\r\n ) as HTMLLinkElement;\r\n const message = this.translate.instant(\"confirm.followLink\");\r\n hyperlink.addEventListener(\"click\", async () => {\r\n if (window.confirm(message)) {\r\n window.location.href = this.guestLink;\r\n await this.userService.logoutCurrentAndSignOutAuth();\r\n this.router.navigate([\"auth\"]);\r\n }\r\n });\r\n }, 0);\r\n }\r\n }\r\n\r\n async setCanArchive() {\r\n this.canArchive = this.userService.isSPAdmin()\r\n ? true\r\n : await this.spaceService.canArchiveSpace(this.id);\r\n }\r\n\r\n}\r\n","<div class=\"container-fluid\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\r\n </div>\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\r\n translate}}</button>\r\n <div class=\"row\" *ngIf=\"!isEditing && space\">\r\n <div class=\"col-md-5\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\r\n {{space.constructionYear ?\r\n space.constructionYear : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\r\n {{space.latitude ?\r\n space.latitude : \"No data\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\r\n space.longitude : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\r\n }} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\r\n {{space.classEnergyConsumption ?\r\n space.classEnergyConsumption : \"No data\" | translate}}\r\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\r\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\r\n {{'Get data from API DPE' | translate}}</button>\r\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\r\n style=\"cursor: pointer;\">\r\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\r\n data-height=\"25\"></span>\r\n {{'DPE data found. Click to validate' | translate}}\r\n </a>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\r\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\r\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\r\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\r\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\r\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\r\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\r\n </p>\r\n </li>\r\n\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n <hr>\r\n <div class=\"d-flex\">\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\r\n data-testid=\"location-edit-btn\">{{'Edit' |\r\n translate}}</button>\r\n <div class=\"tooltip-wrapper\"\r\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\r\n {{'Archive' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\r\n <h6>{{'Most relevant results for' | translate}} :\r\n <b>diagnostics de performance énergétique (DPE) des bâtiments tertiaires</b>\r\n </h6>\r\n <table class=\"table table-striped\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">#</th>\r\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\r\n <th scope=\"col\">{{'Address' | translate}}</th>\r\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\r\n <th scope=\"col\">{{'Construction year' | translate}}</th>\r\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\r\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\r\n <th scope=\"row\">{{ i + 1 }}</th>\r\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\r\n (change)=\"onSelectChange(result)\"></td>\r\n <td>{{result.geo_adresse}}</td>\r\n <td>{{result.secteur_activite}}</td>\r\n <td>{{ result.annee_construction }}</td>\r\n <td>{{ result.classe_consommation_energie }}</td>\r\n <td>{{ result.classe_estimation_ges }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\r\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\r\n translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\r\n {{'No match (erase data)' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </div>\r\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\r\n</div>","import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { getDocument, PDFDocumentProxy } from 'pdfjs-dist';\r\n// import { PDFDocumentProxy } from 'ng2-pdf-viewer';\r\nimport {\r\n Zone,\r\n MenuItem,\r\n Plan,\r\n Space,\r\n Navigation,\r\n PlanService,\r\n ZoneService,\r\n SpaceService,\r\n NavigationService,\r\n getMetaForImage,\r\n MatterportImportService,\r\n} from '@smarterplan/ngx-smarterplan-core';\r\nimport panzoom from 'panzoom';\r\n\r\n@Component({\r\n selector: 'lib-calibration',\r\n templateUrl: './calibration.component.html',\r\n styleUrls: ['./calibration.component.scss'],\r\n})\r\nexport class CalibrationComponent implements OnInit {\r\n /** Item to display for the navbar */\r\n menuItems: MenuItem[] = [];\r\n\r\n /** Canvas (Plan) */\r\n canvas;\r\n\r\n /** CanvasDiv (Div that contain the canvas + matterport iframe) */\r\n @ViewChild('canvasDiv') canvasDiv: ElementRef;\r\n\r\n /** Size of the canvas & matterport iframe */\r\n canvasSize: { w: number; h: number; };\r\n\r\n /** Zoom ratio of the canvas/plan */\r\n canvasZoom = 0;\r\n\r\n /** Opacity for matterport iframe */\r\n opacity: number = 50;\r\n\r\n /** Current rotation for matterport, [0-360], matterport rotation is bind to input range */\r\n rotation: number = 180;\r\n\r\n /** Previous rotation, use to calculate the deltaRotation to rotate, when user change rotation value using range input */\r\n prevRotation: number = 180;\r\n\r\n /** Current Camera Pose */\r\n cameraPose: any;\r\n\r\n /** True when the user is currently rotating with the input range, the matterport rotation events will be ignored */\r\n isRotatingRange: boolean = false;\r\n\r\n /** Rotating queue event to send to matterport */\r\n rotatingQueueEvent: number[] = [];\r\n\r\n /** True when Vertical symmetry is enabled */\r\n reflectV = false;\r\n\r\n /** True when Horizontal symmetry is enabled */\r\n reflectH = false;\r\n\r\n chosenPlan: Plan;\r\n\r\n spaceID: string;\r\n\r\n currentSpace: Space;\r\n\r\n currentZone: Zone;\r\n\r\n chosenPlanIsPdf = false;\r\n\r\n /** First Point in visit, used to determine the calibration */\r\n firstMarkVisit = { x: 0, y: 0 };\r\n\r\n /** Second Point in visit, used to determine the calibration */\r\n secondMarkVisit = { x: 0.5, y: 0.5 };\r\n\r\n /** Equivalent of 'firstMarkVisit' in canvas */\r\n firstMarkPlan: { x: number; y: number; } = { x: 0, y: 0 };\r\n\r\n /** Equivalent of 'secondMarkVisit' in canvas */\r\n secondMarkPlan: { x: number; y: number; } = { x: 0, y: 0 };\r\n\r\n /** Calibration result, (offsetX, offsetY, x, y) */\r\n calibrage: any = {};\r\n\r\n /** Is in preview mode (see scan result) */\r\n preview = false;\r\n\r\n /** Matterport is loading */\r\n loading = true;\r\n\r\n /* for pan and zoom of canvas */\r\n panzoom: any;\r\n\r\n currentNavigations: Navigation[];\r\n\r\n positions: { navID: string; planID: string; x: number; y: number; }[] = [];\r\n\r\n floors: any[] = [];\r\n\r\n currentFloor;\r\n\r\n zoomCanBeChanged: boolean = false;\r\n\r\n constructor(\r\n private matterportImportService: MatterportImportService,\r\n private planService: PlanService,\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private zoneService: ZoneService,\r\n private spaceService: SpaceService,\r\n private navigationService: NavigationService,\r\n private translate: TranslateService\r\n ) { }\r\n\r\n ngOnDestroy(): void {\r\n if (!this.loading) {\r\n this.matterportImportService.removeFrame();\r\n }\r\n }\r\n\r\n async ngOnInit(): Promise<void> {\r\n this.spaceID = this.route.snapshot.queryParams.spaceID;\r\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\r\n\r\n /** Menu nav bar */\r\n this.setupMenuItems();\r\n\r\n this.chosenPlan = this.planService.getChosenPlan();\r\n\r\n if (this.chosenPlan) {\r\n this.chosenPlanIsPdf = this.chosenPlan.annexe.includes('pdf');\r\n this.launchViewer();\r\n setTimeout(() => {\r\n this.configureCanvas().then(() => {\r\n this.panzoom = panzoom(this.canvas, {\r\n bounds: true,\r\n boundsPadding: 0,\r\n maxZoom: 2.5,\r\n minZoom: 0.1,\r\n initialZoom: 1,\r\n zoomSpeed: 0.02,\r\n });\r\n });\r\n }, 500);\r\n } else {\r\n this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);\r\n }\r\n }\r\n\r\n /** **********************************************************************************************\r\n * MENU NAV BAR\r\n *********************************************************************************************** */\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: 'Locations', url: '/localisation' },\r\n {\r\n label: this.currentSpace.name,\r\n url: `/localisation/${this.spaceID}`,\r\n },\r\n {\r\n label: 'Plans',\r\n url: `/localisation/${this.currentSpace.id}/plans`,\r\n },\r\n {\r\n label: 'Calibration',\r\n url: `/localisation/${this.currentSpace.id}/plan-calibration?spaceID=${this.currentSpace.id}`,\r\n },\r\n ];\r\n }\r\n\r\n /** **********************************************************************************************\r\n * CANVAS\r\n *********************************************************************************************** */\r\n\r\n /** Display the plan */\r\n async configureCanvas() {\r\n /** Get canvas */\r\n if (!this.canvas) {\r\n const canvas = document.querySelector('#canvas') as HTMLCanvasElement;\r\n this.canvas = canvas;\r\n }\r\n\r\n if (!this.chosenPlanIsPdf) {\r\n const image = await getMetaForImage(this.chosenPlan.filepath);\r\n /** Compute the new size for the canvas/matterport, base on the dimension of the plan, keeping the ratio */\r\n const size = this.getSizeForCanvas(image.width, image.height);\r\n\r\n /** Compute the plan zoom ratio (use for the calibration later) */\r\n this.canvasZoom = size.w / image.width;\r\n\r\n this.resizeView(size);\r\n\r\n /** Draw Plan on the canvas */\r\n this.drawImage(this.chosenPlan.filepath);\r\n } else {\r\n // TODO\r\n this.pdfToCanvas();\r\n }\r\n }\r\n\r\n /** Update size of the canvas/matterport */\r\n resizeView(size) {\r\n this.canvasDiv.nativeElement.style.width = `${size.w}px`;\r\n this.canvasDiv.nativeElement.style.height = `${size.h}px`;\r\n this.canvas.style.width = `${size.w}px`;\r\n this.canvas.style.height = `${size.h}px`;\r\n this.canvas.width = size.w;\r\n this.canvas.height = size.h;\r\n this.canvasSize = size;\r\n }\r\n\r\n /** Draw something on the canvas */\r\n drawImage(url: string, x = 0, y = 0, icone = false) {\r\n const image = new Image();\r\n const size = this.canvasSize;\r\n const context = this.canvas.getContext('2d');\r\n\r\n /** Flip the context, for symmetry */\r\n // if (this.reflectV) {\r\n // context.translate(size.w, 0);\r\n // context.scale(-1, 1);\r\n // }\r\n // if (this.reflectH) {\r\n // context.translate(0, size.h);\r\n // context.scale(1, -1);\r\n // }\r\n\r\n let imageWidth = size.w;\r\n let imageHeight = size.h;\r\n image.addEventListener('load', () => {\r\n if (icone) {\r\n imageWidth = image.width;\r\n imageHeight = image.height;\r\n }\r\n context.drawImage(\r\n image,\r\n 0,\r\n 0,\r\n image.width,\r\n image.height,\r\n x,\r\n y,\r\n imageWidth,\r\n imageHeight\r\n );\r\n });\r\n image.src = url;\r\n }\r\n\r\n /** Get the size for the canvas, based on the plan size, keeping the ratio */\r\n getSizeForCanvas(w, h) {\r\n let canvasW = this.canvasDiv.nativeElement.offsetWidth;\r\n let canvasH = this.canvasDiv.nativeElement.offsetHeight;\r\n\r\n const imageRatio = w / h;\r\n const canvasRatio = canvasW / canvasH;\r\n\r\n if (imageRatio > canvasRatio) {\r\n canvasH = canvasW / imageRatio;\r\n } else {\r\n canvasW = canvasH * imageRatio;\r\n }\r\n return { w: canvasW, h: canvasH };\r\n }\r\n\r\n /** [TODO] Convert a PDF to a Canvas */\r\n async pdfToCanvas() {\r\n const pdfjs = await import('pdfjs-dist/build/pdf');\r\n const pdfjsWorker = await import('pdfjs-dist/build/pdf.worker.entry');\r\n\r\n pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;\r\n\r\n const pdf: PDFDocumentProxy = await getDocument(this.chosenPlan.filepath)\r\n .promise;\r\n const page = await pdf.getPage(1);\r\n\r\n const viewPortParameters = { scale: 1 };\r\n const viewport = page.getViewport(viewPortParameters);\r\n\r\n this.canvas.height = viewport.height;\r\n this.canvas.width = viewport.width;\r\n\r\n const size = this.getSizeForCanvas(viewport.width, viewport.height);\r\n console.log(size);\r\n this.canvasSize = size;\r\n\r\n this.canvasZoom = size.w / viewport.width;\r\n\r\n const context = this.canvas.getContext('2d') as CanvasRenderingContext2D;\r\n const renderContext = {\r\n canvasContext: context,\r\n viewport,\r\n };\r\n const renderTask = page.render(renderContext).promise;\r\n\r\n renderTask.then(() => console.log('Page rendered'));\r\n\r\n // const res = canvas.toDataURL();\r\n // if (pdf != null) pdf.destroy();\r\n // return res;\r\n }\r\n\r\n /** User click to user Symmetry Vertical */\r\n onReflectV() {\r\n this.reflectV = !this.reflectV;\r\n this.configureCanvas();\r\n }\r\n\r\n /** User click to user Symmetry Horizontal */\r\n onReflectH() {\r\n this.reflectH = !this.reflectH;\r\n this.configureCanvas();\r\n }\r\n\r\n /** **********************************************************************************************\r\n * MATTERPORT\r\n *********************************************************************************************** */\r\n\r\n /** Launch matterport */\r\n async launchViewer() {\r\n await this.matterportImportService.initSdkForModel(this.chosenPlan.model3d);\r\n\r\n const { sdk } = this.matterportImportService;\r\n this.floors = Object.values(this.matterportImportService.floors);\r\n // console.log(this.floors);\r\n setTimeout(async () => {\r\n /** Move Floor mode */\r\n sdk.Mode.moveTo(sdk.Mode.Mode.FLOORPLAN).then(async (nextMode) => {\r\n /** Display the correct floor for the plan */\r\n try {\r\n const matterportFloor = this.chosenPlan.zone.metadata ?\r\n JSON.parse(this.chosenPlan.zone.metadata).matterportFloorSequence : null;\r\n await this.matterportImportService.moveToFloor(this.chosenPlan.zone.name, matterportFloor);\r\n\r\n /** When the user try to change the view mode we set it back to floorpan */\r\n sdk.on(sdk.Mode.Event.CHANGE_END, (oldMode, newMode) => {\r\n if (newMode !== sdk.Mode.Mode.FLOORPLAN) {\r\n sdk.Mode.moveTo(sdk.Mode.Mode.FLOORPLAN, {\r\n transition: 'transition.instant',\r\n });\r\n }\r\n });\r\n } catch {\r\n console.log('couldnot move to floor');\r\n }\r\n });\r\n\r\n /** We can display the matterport view now */\r\n this.loading = false;\r\n }, 1000);\r\n\r\n /** Update current camera pose and rotation */\r\n sdk.Camera.pose.subscribe((event) => {\r\n /** We update only if the user is not changing the rotation with the <input> range, to not override the <input> value */\r\n if (!this.isRotatingRange) {\r\n this.rotation = event.rotation.y + 180;\r\n this.prevRotation = this.rotation;\r\n this.cameraPose = event;\r\n }\r\n });\r\n }\r\n\r\n /** When the <input> range, for rotation, change */\r\n async onRotationChange() {\r\n const rotationDelta = this.rotation - this.prevRotation;\r\n this.prevRotation = this.rotation;\r\n\r\n /** Send the rotationDelta to th queue event in order to be send to matterport */\r\n this.rotatingQueueEvent.push(rotationDelta);\r\n\r\n /** Start to process the queue, if it's the first event */\r\n if (!this.isRotatingRange) {\r\n this.isRotatingRange = true;\r\n this.processRotatingQueueEvent();\r\n }\r\n }\r\n\r\n /** Process the rotating event queue, send event one by one to matterport */\r\n async processRotatingQueueEvent() {\r\n const { sdk } = this.matterportImportService;\r\n\r\n /** While the queue is not empty */\r\n while (this.rotatingQueueEvent.length > 0) {\r\n /** Rotate matterport by deltaRotation and remove event from queue */\r\n await sdk.Camera.rotate(this.rotatingQueueEvent.shift(), 0, {\r\n speed: 360,\r\n });\r\n }\r\n\r\n /** When the queue is empty, then the user is not rotating with the <input> range anymore */\r\n this.isRotatingRange = false;\r\n }\r\n\r\n /** **********************************************************************************************\r\n * USER ACTIONS\r\n *********************************************************************************************** */\r\n\r\n /** Preview calibration */\r\n async onPreview() {\r\n this.preview = true;\r\n /** Place sweeps */\r\n this.onPlaceSweeps();\r\n }\r\n\r\n async calibrate() {\r\n const [navigation] = this.currentNavigations;\r\n const position = JSON.parse(navigation.position);\r\n this.firstMarkPlan =\r\n await this.matterportImportService.sdk.Renderer.getScreenPosition({\r\n x: position.x,\r\n y: position.y,\r\n z: position.z,\r\n });\r\n this.secondMarkPlan =\r\n await this.matterportImportService.sdk.Renderer.getScreenPosition({\r\n x: position.x,\r\n y: 0,\r\n z: 0,\r\n });\r\n const deltaZVisit = 0 - position.z;\r\n let deltaXPlan = this.secondMarkPlan.x - this.firstMarkPlan.x;\r\n if (deltaXPlan === 0) {\r\n // console.log(\"we moved along Y axis on Plan\");\r\n const deltaYPlan = this.secondMarkPlan.y - this.firstMarkPlan.y;\r\n this.calibrage.nameYAxis = 'z';\r\n this.calibrage.nameXAxis = 'x';\r\n this.calibrage.offsetY = this.secondMarkPlan.y;\r\n this.calibrage.scaleY = deltaYPlan / deltaZVisit;\r\n } else {\r\n // console.log(\" we moved along X axis on Plan\");\r\n this.calibrage.nameYAxis = 'x';\r\n this.calibrage.nameXAxis = 'z';\r\n this.calibrage.offsetX = this.secondMarkPlan.x;\r\n this.calibrage.scaleX = deltaXPlan / deltaZVisit;\r\n }\r\n const thirdMarkPlan =\r\n await this.matterportImportService.sdk.Renderer.getScreenPosition({\r\n x: 0,\r\n y: 0,\r\n z: position.z,\r\n });\r\n const deltaXVisit = 0 - position.x;\r\n if (deltaXPlan === 0) {\r\n // console.log(\" we moved along X axis on Plan\");\r\n deltaXPlan = thirdMarkPlan.x - this.firstMarkPlan.x;\r\n this.calibrage.offsetX = thirdMarkPlan.x;\r\n this.calibrage.scaleX = deltaXPlan / deltaXVisit;\r\n } else {\r\n const deltaYPlan = thirdMarkPlan.y - this.firstMarkPlan.y;\r\n this.calibrage.offsetY = thirdMarkPlan.y;\r\n this.calibrage.scaleY = deltaYPlan / deltaXVisit;\r\n }\r\n\r\n /** Take considiration of pan and zoom of plan on canvas */\r\n const transformInfo = this.panzoom.getTransform();\r\n const { scale, x, y } = transformInfo;\r\n // console.log(transformInfo);\r\n this.calibrage.offsetXPlan = x;\r\n this.calibrage.offsetYPlan = y;\r\n this.calibrage.scalePlan = scale;\r\n console.log(this.calibrage);\r\n }\r\n\r\n /** Place sweeps */\r\n async onPlaceSweeps() {\r\n /** Display all scan */\r\n const zone = await this.zoneService.getZone(this.chosenPlan.zoneID);\r\n\r\n if (zone) {\r\n this.currentZone = zone;\r\n const navigations = await this.navigationService.getNavigationsForZone(\r\n this.currentZone\r\n );\r\n this.currentNavigations = navigations;\r\n await this.calibrate();\r\n if (navigations.length > 0) {\r\n for (const navigation of navigations) {\r\n const testPosition = JSON.parse(navigation.position);\r\n const positionX =\r\n this.calibrage.nameXAxis === 'x' ? testPosition.x : testPosition.z;\r\n const positionY =\r\n this.calibrage.nameYAxis === 'x' ? testPosition.x : testPosition.z;\r\n const testX =\r\n positionX * this.calibrage.scaleX + this.calibrage.offsetX;\r\n const testY =\r\n positionY * this.calibrage.scaleY + this.calibrage.offsetY;\r\n // console.log(\"test position GREEN\", testX, testY);\r\n const transformedX =\r\n (testX - this.calibrage.offsetXPlan) / this.calibrage.scalePlan; // we are undoing the pan and zoom\r\n const transformedY =\r\n (testY - this.calibrage.offsetYPlan) / this.calibrage.scalePlan;\r\n this.positions.push({\r\n navID: navigation.id,\r\n planID: this.chosenPlan.id,\r\n x: transformedX,\r\n y: transformedY,\r\n });\r\n const iconSize = 30 * this.calibrage.scalePlan;\r\n const shift = iconSize / 2;\r\n this.drawImage(\r\n 'https://api.iconify.design/mdi:adjust.svg?color=green&height=30&width=30',\r\n transformedX - shift,\r\n transformedY - shift,\r\n true\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Save calibration */\r\n async onSave() {\r\n if (this.currentZone) {\r\n /** Normalize with the zoom */\r\n // this.calibrage.offsetX /= this.canvasZoom;\r\n // this.calibrage.offsetY /= this.canvasZoom;\r\n // this.calibrage.x /= this.canvasZoom;\r\n // this.calibrage.y /= this.canvasZoom;\r\n this.calibrage.new = true;\r\n this.calibrage.imgWidth = this.canvasSize.w;\r\n this.calibrage.imgHeight = this.canvasSize.h;\r\n\r\n await this.planService.updatePlan({\r\n id: this.chosenPlan.id,\r\n calibration: JSON.stringify(this.calibrage),\r\n });\r\n await Promise.all(\r\n this.positions.map(async (position) => {\r\n const { navID } = position;\r\n delete position.navID;\r\n const nav = this.currentNavigations.find((_nav) => _nav.id === navID);\r\n let positionsDataToUpdate;\r\n if (nav.positionOnPlan) {\r\n const positionOnPlan = nav.positionOnPlan.map((entry) =>\r\n JSON.parse(entry)\r\n );\r\n const positionForCurrentPlan = positionOnPlan.find(\r\n (entry) => entry.planID === this.chosenPlan.id\r\n );\r\n if (positionForCurrentPlan) {\r\n positionOnPlan.splice(\r\n positionOnPlan.indexOf(positionForCurrentPlan),\r\n 1,\r\n position\r\n );\r\n } else {\r\n positionOnPlan.push(position);\r\n }\r\n positionsDataToUpdate = [...positionOnPlan];\r\n } else {\r\n positionsDataToUpdate = [position];\r\n }\r\n // console.log(positionsDataToUpdate);\r\n await this.navigationService.updateNavigation({\r\n id: navID,\r\n positionOnPlan: positionsDataToUpdate.map((entry) =>\r\n JSON.stringify(entry)\r\n ),\r\n });\r\n })\r\n );\r\n }\r\n this.matterportImportService.removeFrame();\r\n\r\n this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);\r\n alert(this.translate.instant('calibration.success'));\r\n }\r\n\r\n /** Reset the canvas */\r\n onReset() {\r\n this.reflectH = false;\r\n this.reflectV = false;\r\n this.preview = false;\r\n\r\n this.configureCanvas();\r\n }\r\n\r\n /** Cancel, leave */\r\n onCancel() {\r\n this.matterportImportService.removeFrame();\r\n this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);\r\n alert(this.translate.instant('calibration.canceled'));\r\n }\r\n\r\n async onFloorClick(floor) {\r\n this.currentFloor = floor;\r\n await this.matterportImportService.moveToFloor(floor.id);\r\n }\r\n\r\n onActivateZoomChange() {\r\n this.zoomCanBeChanged = !this.zoomCanBeChanged;\r\n const iframe = document.querySelector('#viewer-frame') as HTMLElement;\r\n if (iframe) {\r\n iframe.style.zIndex = this.zoomCanBeChanged ? '1' : '0';\r\n }\r\n }\r\n}\r\n","<div class=\"row mt-3\">\r\n <div class=\"col\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems'></lib-tab-navigation>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div id=\"rowCanvas\">\r\n <div #canvasDiv id=\"canvasDiv\">\r\n\r\n <div id=\"viewer-frame\" [style.pointer-events]=\"zoomCanBeChanged?'auto':'none'\">\r\n <!-- <div class=\"blur\"></div> -->\r\n </div>\r\n <canvas id=\"canvas\" [ngStyle]=\"{'opacity': (preview||loading) ? '1' : 'calc(' + opacity + '/ 100)'}\"></canvas>\r\n </div>\r\n\r\n <div class=\"calibration-tools container-fluid\" *ngIf=\"!(preview || loading)\">\r\n <h1>{{'Calibration tool' | translate}}</h1>\r\n <div class=\"tool\">\r\n <div class=\"row ms-0 me-0 legend\">\r\n <div class=\"legend-bar-indicator\" [ngStyle]=\"{'opacity': 'calc(' + (-(opacity-100)+10) + '/ 100)'}\">\r\n {{'Less' | translate}}</div>\r\n <div class=\"legend-title\">{{'Plan Opacity' | translate }}</div>\r\n <div class=\"legend-bar-indicator\" [ngStyle]=\"{'opacity': 'calc(' + (opacity+10) + '/ 100)'}\">{{'More' |\r\n translate}}</div>\r\n </div>\r\n <div class=\"row ms-0 me-0 \">\r\n <input [disabled]=\"false\" [ngModelOptions]=\"{standalone: true}\" [(ngModel)]=\"opacity\" type=\"range\"\r\n class=\"form-range\" min=\"0\" max=\"100\" value=\"50\" id=\"opacity\">\r\n </div>\r\n </div>\r\n <div class=\"tool\">\r\n <div class=\"row ms-0 me-0 \">\r\n <div class=\"label-legend\">{{'Change Visit Floor' | translate}}</div>\r\n <div ngbDropdown class=\"d-inline-block ms-3\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" ngbDropdownToggle>\r\n {{currentFloor ? currentFloor.id : ('Floor' | translate) }}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button ngbDropdownItem *ngFor=\"let floor of floors\" (click)=\"onFloorClick(floor)\">\r\n {{ floor.name.length > 0 ? floor.name : ('Floor ' + floor.id) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"tool\">\r\n <div class=\"row ms-0 me-0 \">\r\n <div class=\"tool-checkbox-container\">\r\n <div class=\"tool-checkbox-subcontainer\">\r\n <div class=\"label-legend me-3\">{{'Pan/Zoom Visit' | translate}} {{zoomCanBeChanged ? \"ON\" :\r\n \"OFF\"}}\r\n </div>\r\n <input type=\"checkbox\" (change)=\"onActivateZoomChange()\" style=\"margin-top: 5px;\">\r\n </div>\r\n <div class=\"card border-warning mb-3 mt-3\" *ngIf=\"zoomCanBeChanged\">\r\n <div class=\"card-body text-warning\">\r\n <h5 class=\"card-title\">{{\"calibration.wait-message\" | translate}}</h5>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"action\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onPreview()\"\r\n [disabled]=\"zoomCanBeChanged\">{{'Preview' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'Cancel' |\r\n translate}}</button>\r\n\r\n </div>\r\n\r\n </div>\r\n <div class=\"calibration-tools container-fluid\" *ngIf=\"preview\">\r\n <h1>{{'Validation' | translate}}</h1>\r\n <div class=\"action\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onSave()\">{{'Validate' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onReset()\">{{'Reset' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'Cancel' |\r\n translate}}</button>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"calibration-tools container-fluid\" *ngIf=\"loading\">\r\n <h3>{{\"Waiting for Matterport\" | translate}}...</h3>\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>","import { Component, OnInit } from '@angular/core';\r\nimport { UntypedFormGroup, UntypedFormBuilder, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { Zone, Space, Plan, MenuItem, SpaceService, PlanService, getMetaForImage, getSignedFile, downloadFileAsObject, downloadBlob, NavigatorService } from '@smarterplan/ngx-smarterplan-core';\r\nimport panzoom from 'panzoom';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-plans',\r\n templateUrl: './plans.component.html',\r\n styleUrls: ['./plans.component.scss']\r\n})\r\nexport class PlansComponent implements OnInit {\r\n\r\n spaceID: string;\r\n\r\n currentSpace: Space;\r\n\r\n plans: Plan[];\r\n\r\n // chosenPlan: Plan;\r\n\r\n indexDetails = -1;\r\n\r\n loading = false;\r\n\r\n uploadingPlan = false;\r\n\r\n planForm: UntypedFormGroup;\r\n\r\n isCurrentPlanForZone = false;\r\n\r\n canvas;\r\n\r\n scale: number;\r\n\r\n panzoom: any;\r\n\r\n currentZone: Zone;\r\n\r\n fileToUpload: File;\r\n\r\n chosenPlanIsPdf = false;\r\n\r\n zones: Zone[];\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n destroy$ = new Subject();\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private spaceService: SpaceService,\r\n private planService: PlanService,\r\n private fb: UntypedFormBuilder,\r\n private translate: TranslateService,\r\n private navigatorService: NavigatorService\r\n ) {\r\n this.navigatorService.locationIDChange\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((spaceID) => {\r\n this.router.navigate([\"dashboard/localisation\", spaceID, \"plans\"]);\r\n });\r\n\r\n this.route.params.subscribe((params) => {\r\n this.spaceID = params.id;\r\n this.getPlans();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (\r\n this.planService.getPlanFileCache() &&\r\n this.planService.getChosenPlan()\r\n ) {\r\n this.addPlanFromCache(\r\n this.planService.getPlanFileCache(),\r\n this.planService.getChosenPlan(),\r\n );\r\n this.planService.setPlanFileCache(null);\r\n }\r\n this.planService.setChosenPlan(null);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: \"Locations\", url: \"/localisation\" },\r\n {\r\n label: this.currentSpace.name,\r\n url: `/localisation/${this.currentSpace.id}`,\r\n },\r\n {\r\n label: \"Plans\",\r\n url: `/localisation/${this.currentSpace.id}/plans`,\r\n },\r\n ];\r\n }\r\n\r\n onGoBack() { }\r\n\r\n async onPlanClick(plan?: Plan) {\r\n if (plan) this.planService.setChosenPlan(plan);\r\n this.chosenPlanIsPdf = plan.annexe.includes(\"pdf\");\r\n if (!this.chosenPlanIsPdf) {\r\n setTimeout(() => {\r\n this.configureCanvas().then(() => {\r\n this.panzoom = panzoom(this.canvas, {\r\n bounds: true,\r\n boundsPadding: 0,\r\n maxZoom: 3.5,\r\n minZoom: 0.1,\r\n initialZoom: 0.5,\r\n });\r\n });\r\n }, 500);\r\n }\r\n }\r\n\r\n async configureCanvas() {\r\n this.uploadingPlan = true;\r\n const canvas = document.querySelector(\"#canvas\") as HTMLCanvasElement;\r\n const image = await getMetaForImage(this.getChoosenPlan().filepath);\r\n canvas.width = image.width;\r\n canvas.height = image.height;\r\n this.canvas = canvas;\r\n this.drawImage(this.getChoosenPlan().filepath);\r\n this.uploadingPlan = false;\r\n }\r\n\r\n drawImage(url: string, x = 0, y = 0) {\r\n const image = new Image();\r\n const context = this.canvas.getContext(\"2d\");\r\n const imageWidth = this.canvas.width;\r\n const imageHeight = this.canvas.height;\r\n image.addEventListener(\"load\", () => {\r\n context.drawImage(\r\n image,\r\n 0,\r\n 0,\r\n image.width,\r\n image.height,\r\n x,\r\n y,\r\n imageWidth,\r\n imageHeight,\r\n );\r\n });\r\n image.src = url;\r\n // image.crossOrigin = \"*\"; //need to download as png,\r\n // BUT: https://stackoverflow.com/questions/49503171/the-image-tag-with-crossorigin-anonymous-cant-load-success-from-s3\r\n }\r\n\r\n async getPlans() {\r\n this.loading = true;\r\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\r\n this.setupMenuItems();\r\n\r\n this.zones = this.currentSpace.zones.items;\r\n this.plans = await this.planService.getSingedPlansForSpace(this.spaceID);\r\n this.loading = false;\r\n if (this.plans.length === 1) {\r\n this.onPlanClick(this.plans[0]);\r\n }\r\n }\r\n\r\n getChoosenPlan() {\r\n return this.planService.getChosenPlan();\r\n }\r\n\r\n removeImage() {\r\n const context = this.canvas.getContext(\"2d\");\r\n context.clearRect(0, 0, 4096, 4096);\r\n }\r\n\r\n /**\r\n *\r\n */\r\n onCalibrateClick() {\r\n if (this.getChoosenPlan()) {\r\n this.router.navigate(\r\n [\"/dashboard/localisation\", this.spaceID, \"plan-calibration\"],\r\n { queryParams: { spaceID: this.spaceID } },\r\n );\r\n }\r\n }\r\n\r\n /**\r\n *\r\n */\r\n onEditClick() {\r\n if (this.getChoosenPlan()) {\r\n this.router.navigate(\r\n [\"/dashboard/localisation\", this.spaceID, \"plan-edit\"],\r\n { queryParams: { spaceID: this.spaceID } },\r\n );\r\n }\r\n }\r\n\r\n onUploadClick() {\r\n const inputFile = document.querySelector(\r\n \"#upload-file\",\r\n ) as HTMLInputElement;\r\n inputFile.click();\r\n }\r\n\r\n addPlan(target: EventTarget) {\r\n this.fileToUpload = (target as HTMLInputElement).files[0];\r\n this.planForm = this.fb.group({\r\n name: [this.fileToUpload.name, [Validators.required]],\r\n zoneID: [null, [Validators.required]],\r\n spaceID: this.spaceID,\r\n isModified: false,\r\n calibration: \"\",\r\n });\r\n }\r\n\r\n addPlanFromCache(file: File, plan: Plan) {\r\n this.fileToUpload = file;\r\n this.planForm = this.fb.group({\r\n name: [this.fileToUpload.name, [Validators.required]],\r\n zoneID: [plan ? plan.zoneID : null, [Validators.required]],\r\n spaceID: this.spaceID,\r\n isModified: !!plan,\r\n calibration:\r\n plan && plan.isModified && plan.calibration\r\n ? plan.calibration\r\n : \"\",\r\n });\r\n }\r\n\r\n async onSavePlan() {\r\n const formValue = this.planForm.value as Plan;\r\n formValue.isCurrentForZone = this.isCurrentPlanForZone;\r\n const createdPlan = await this.planService.createPlanWithAnnexe(\r\n formValue,\r\n this.fileToUpload,\r\n );\r\n const filepath = await getSignedFile(createdPlan.annexe);\r\n if (filepath) {\r\n createdPlan.filepath = filepath;\r\n }\r\n if (formValue.isCurrentForZone) {\r\n // set all other plans to not current\r\n this.planService.setAllPlansForZoneNotCurrent(\r\n createdPlan.zoneID,\r\n createdPlan.id,\r\n );\r\n }\r\n this.plans.push(createdPlan);\r\n this.planForm = null;\r\n this.fileToUpload = null;\r\n }\r\n\r\n onCancelUpload() {\r\n this.fileToUpload = null;\r\n this.planForm = null;\r\n }\r\n\r\n async onCurrentPlanClick() {\r\n await this.planService.updatePlan({\r\n id: this.getChoosenPlan().id,\r\n isCurrentForZone: this.getChoosenPlan().isCurrentForZone,\r\n });\r\n if (this.getChoosenPlan().isCurrentForZone) {\r\n this.planService.setAllPlansForZoneNotCurrent(\r\n this.getChoosenPlan().zoneID,\r\n this.getChoosenPlan().id,\r\n );\r\n }\r\n }\r\n\r\n async onDownloadClick() {\r\n const signedFile = await downloadFileAsObject(\r\n this.getChoosenPlan().annexe,\r\n );\r\n if (signedFile) {\r\n // @ts-ignore\r\n downloadBlob(signedFile.Body, this.getChoosenPlan().name);\r\n }\r\n }\r\n\r\n async onDownloadAsPng() {\r\n const canvas = document.querySelector(\"#canvas\") as HTMLCanvasElement;\r\n canvas.toBlob(function (blob) {\r\n downloadBlob(blob, \"plan-as-png.png\");\r\n });\r\n }\r\n\r\n async onRemoveClick() {\r\n const message = this.translate.instant(\"confirm.deletePlan\");\r\n if (window.confirm(message)) {\r\n await this.planService.deletePlan(this.getChoosenPlan());\r\n this.removeImage();\r\n this.planService.setChosenPlan(null);\r\n this.getPlans();\r\n }\r\n }\r\n}\r\n","<div class=\"container-fluid\" *ngIf=\"currentSpace\" class=\"dashboard-tab\">\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...</span>\r\n </div>\r\n </div>\r\n <div class=\"mt-3\" *ngIf=\"!plans && !loading\">\r\n <h4 style=\"font-weight: bold;\">{{'No imported plans' | translate }}</h4>\r\n <p>{{'For import from 3D visit: go Virtual Visits => Import Images' | translate}}</p>\r\n </div>\r\n <div class=\"row ms-1\">\r\n <div ngbDropdown class=\"d-inline-block me-3\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" ngbDropdownToggle>{{getChoosenPlan() ?\r\n getChoosenPlan().name: ('Choose Plan' | translate) }}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button ngbDropdownItem *ngFor=\"let plan of plans\" (click)=\"onPlanClick(plan)\">{{plan.name }}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"d-inline-block\" ngbDropdown #myDrop=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownManual\" ngbDropdownToggle>{{'Choose action' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownManual\">\r\n <button (click)=\"onCalibrateClick()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">{{'Calibrate' |\r\n translate}}</button>\r\n <button (click)=\"onEditClick()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">{{'Edit plan' |\r\n translate}}\r\n </button>\r\n <button (click)=\"onUploadClick()\" ngbDropdownItem>{{'Upload new plan' | translate}}</button>\r\n <button (click)=\"onDownloadClick()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">{{'Download plan' |\r\n translate}}</button>\r\n <button (click)=\"onRemoveClick()\" ngbDropdownItem\r\n [disabled]=\"!getChoosenPlan() || getChoosenPlan().isImportedMatterport\">{{'Delete plan' |\r\n translate}}</button>\r\n <!-- <button (click)=\"onDownloadAsPng()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">\r\n {{'Download plan as PNG' | translate}}</button> -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row mt-3 ms-0\">\r\n <h4 *ngIf=\"fileToUpload\">{{'New plan' | translate }}</h4>\r\n <input class=\"hidden\" type=\"file\" id=\"upload-file\" name=\"upload-file\" accept=\"image/png, image/jpeg, .pdf, .svg\"\r\n ngf-max-size=\"6MB\" (change)=\"addPlan($event.target)\">\r\n </div>\r\n <div class=\"col-md-6 mt-3\" *ngIf=\"planForm\">\r\n <form (ngSubmit)=\"onSavePlan()\" [formGroup]=\"planForm\">\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3\">{{'Name' | translate}} </label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3\">{{'Zone' | translate}} </label>\r\n <div class=\"col-sm-9\">\r\n <select class=\"form-control\" formControlName=\"zoneID\">\r\n <option *ngFor=\"let zone of zones\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3\">{{'Set as current plan for zone' | translate}}</label>\r\n <div class=\"col-sm-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isCurrentPlanForZone\" [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div>\r\n <button [disabled]=\"planForm.invalid\" type='submit' class=\"btn btn-label-file rounded-pill\">{{'Save' |\r\n translate}}</button>\r\n <button class=\"btn btn-label-file rounded-pill ms-3\" type=\"button\" (click)=\"onCancelUpload()\">{{'Cancel' |\r\n translate}}</button>\r\n </form>\r\n </div>\r\n <ul class=\"col-md-6 list-group list-group-flush\" *ngIf=\"getChoosenPlan()\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate }} : {{getChoosenPlan().name}} </li>\r\n <li class=\"list-group-item bg-transparent\"> {{'Plan is ' | translate }} :\r\n {{getChoosenPlan().calibration ? ('Calibrated' | translate) : ('Not calibrated' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Attributed to zone ' | translate }} :\r\n {{getChoosenPlan().zone ? getChoosenPlan().zone.name : 'None'}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Is current plan for zone ' | translate }} :\r\n <input type=\"checkbox\" [(ngModel)]=\"getChoosenPlan().isCurrentForZone\" (change)=\"onCurrentPlanClick()\">\r\n </li>\r\n\r\n </ul>\r\n\r\n <div class=\"row mt-4\">\r\n <div class=\"col-md-10\">\r\n <embed *ngIf=\"getChoosenPlan() && chosenPlanIsPdf\" [src]=\"getChoosenPlan().filepath | safeUrl\"\r\n type=\"application/pdf\" frameBorder=\"0\" scrolling=\"auto\" height=\"650px;\" width=\"100%\" />\r\n <div *ngIf=\"!chosenPlanIsPdf\" class=\"row\" style=\"height: 500px; overflow: hidden;\" id=\"canvasDiv\">\r\n <canvas id=\"canvas\" width=\"4096px\" height=\"4096px\">\r\n <!-- <img *ngIf=\"chosenPlan\" id=\"plan-image\" [src]=\"chosenPlan.filepath\" style=\"width: 100%;\"> -->\r\n </canvas>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, Input, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-chevron',\r\n templateUrl: './chevron.component.html',\r\n styleUrls: ['./chevron.component.scss']\r\n})\r\nexport class ChevronComponent implements OnInit {\r\n\r\n @Input() conditionShowing = false;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n}\r\n","<div style=\"height: 30px; width: 30px;\">\r\n <span class=\"icon-container\" >\r\n <div [class]=\"conditionShowing ? 'icon-img-up' : 'icon-img-down'\"></div>\r\n </span>\r\n</div>\r\n","import { Component, OnInit, ViewChild } from '@angular/core';\r\nimport {\r\n UntypedFormGroup,\r\n UntypedFormBuilder,\r\n Validators,\r\n AbstractControl,\r\n} from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { NgbModal, ModalDismissReasons } from '@ng-bootstrap/ng-bootstrap';\r\nimport {\r\n Node,\r\n Visit,\r\n MenuItem,\r\n MatterportImportService,\r\n CaptureService,\r\n NodeService,\r\n SpaceService,\r\n VisitService,\r\n CaptureViewer,\r\n Capture,\r\n ValidatorsService,\r\n NavigatorService,\r\n} from '@smarterplan/ngx-smarterplan-core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-visits',\r\n templateUrl: './visits.component.html',\r\n styleUrls: ['./visits.component.scss'],\r\n})\r\nexport class VisitsComponent implements OnInit {\r\n spaceId: string;\r\n\r\n visitIndexDetails = -1;\r\n\r\n visitForm: UntypedFormGroup;\r\n\r\n isEditing: boolean = false;\r\n\r\n visitSubmitted: boolean = false;\r\n\r\n captureDate: number;\r\n\r\n currentSpace = { zones: [] } as any;\r\n\r\n visits: Visit[] = [];\r\n\r\n closeResult: string;\r\n\r\n @ViewChild('content', { static: false }) private content;\r\n\r\n modalReference: any;\r\n\r\n canCancelImport = false;\r\n\r\n imagesProcessed: number = 0;\r\n\r\n totalImages: number = 0;\r\n\r\n imagesUploaded: number = 0;\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n errorForm: boolean = false;\r\n\r\n isProcessing = false;\r\n\r\n destroy$ = new Subject();\r\n\r\n constructor(\r\n private fb: UntypedFormBuilder,\r\n private matterportImportService: MatterportImportService,\r\n private captureService: CaptureService,\r\n private nodeService: NodeService,\r\n private spaceService: SpaceService,\r\n private route: ActivatedRoute,\r\n private modalService: NgbModal,\r\n private visitService: VisitService,\r\n public validatorsService: ValidatorsService,\r\n private translate: TranslateService,\r\n private navigatorService: NavigatorService,\r\n private router: Router,\r\n ) {\r\n this.matterportImportService.importingImages.pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n this.canCancelImport = true;\r\n });\r\n this.matterportImportService.sweepProcessedCount.pipe(takeUntil(this.destroy$)).subscribe((count) => {\r\n this.imagesProcessed = count + 1;\r\n });\r\n this.matterportImportService.totalSweepsCount.pipe(takeUntil(this.destroy$)).subscribe((count) => {\r\n this.totalImages = count;\r\n });\r\n\r\n this.navigatorService.locationIDChange\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((spaceID) => {\r\n this.router.navigate([\"dashboard/localisation\", spaceID, \"visits\"]);\r\n });\r\n\r\n this.route.params.subscribe((params) => {\r\n this.spaceId = params.id;\r\n this.resetVisits();\r\n });\r\n }\r\n\r\n async ngOnInit(): Promise<void> {\r\n this.spaceId = this.route.snapshot.paramMap.get('id');\r\n await this.resetVisits();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n\r\n /*\r\n Visit = {\r\n captureID: string,\r\n model3d: string,\r\n takenAt: number,\r\n spaceID: string,\r\n viewer: CaptureViewer,\r\n surface: number,\r\n node: Node,\r\n name?: string | null\r\n }\r\n */\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: 'Locations', url: '/localisation' },\r\n {\r\n label: this.currentSpace.name,\r\n url: `/localisation/${this.currentSpace.id}`,\r\n },\r\n {\r\n label: 'Virtual visits',\r\n url: `/localisation/${this.currentSpace.id}/visits`,\r\n },\r\n ];\r\n }\r\n\r\n onGoBack() {\r\n this.onCancel();\r\n }\r\n\r\n async resetVisits() {\r\n this.visits = [];\r\n this.currentSpace = await this.spaceService.getSpace(this.spaceId);\r\n this.setupMenuItems();\r\n await this.visitService\r\n .getVisitsForSpaceForUser(this.spaceId)\r\n .then((visits) => {\r\n if (visits) {\r\n this.visits = visits;\r\n }\r\n });\r\n }\r\n\r\n initVisitForm(input: Visit = null) {\r\n if (input) {\r\n this.visitForm = this.fb.group({\r\n captureID: input.captureID,\r\n nodeID: input.node.id,\r\n name: [input.name, [Validators.required]],\r\n model3D: [input.model3d, [Validators.required]],\r\n viewer: input.viewer ? input.viewer : CaptureViewer.MATTERPORT,\r\n surface: input.surface ? input.surface : null,\r\n });\r\n this.captureDate = input.takenAt;\r\n } else {\r\n this.visitForm = this.fb.group({\r\n model3D: [null, [Validators.required]],\r\n viewer: CaptureViewer.MATTERPORT,\r\n surface: null,\r\n name: [null, [Validators.required]],\r\n });\r\n }\r\n }\r\n\r\n async onToggleDetail(index) {\r\n this.visitIndexDetails = index === this.visitIndexDetails ? -1 : index;\r\n this.imagesUploaded = await this.matterportImportService.getUploadedImageCount(this.visits[index].model3d);\r\n }\r\n\r\n onAddVisit() {\r\n this.initVisitForm();\r\n this.menuItems.push({ label: 'New' });\r\n }\r\n\r\n onEdit(visit) {\r\n this.initVisitForm(visit);\r\n this.isEditing = true;\r\n this.menuItems.push({ label: visit.name });\r\n }\r\n\r\n async onSubmitVisit() {\r\n this.visitSubmitted = true;\r\n if (!this.visitForm.valid) {\r\n this.errorForm = true;\r\n return;\r\n }\r\n this.errorForm = false;\r\n const formValue = this.visitForm.value;\r\n const capture = {\r\n viewer: formValue.viewer,\r\n takenAt: this.captureDate,\r\n surface: formValue.surface,\r\n spaceID: this.currentSpace.id,\r\n } as Capture;\r\n\r\n if (this.isEditing) {\r\n capture.id = formValue.captureID;\r\n await this.captureService.updateCapture(capture);\r\n const node = {\r\n id: formValue.nodeID,\r\n model3D: formValue.model3D,\r\n metadata: formValue.name,\r\n } as Node;\r\n await this.nodeService.updateNode(node);\r\n } else {\r\n let createdNode;\r\n await this.captureService.createCapture(capture).then(async (res) => {\r\n if (res) {\r\n const node = {\r\n model3D: formValue.model3D,\r\n captureID: res.id,\r\n metadata: formValue.name,\r\n } as Node;\r\n createdNode = await this.nodeService.createNode(node);\r\n }\r\n });\r\n this.launchImport(\r\n formValue.model3D,\r\n formValue.surface,\r\n createdNode,\r\n false\r\n )\r\n .then((success) => {\r\n this.modalReference.close('import ended with success');\r\n })\r\n .catch((e) => {\r\n this.modalReference.close(`Error while import: ${e}`);\r\n alert(`Error while import: ${e} ${JSON.stringify(e)}`);\r\n this.onDelete({\r\n node: createdNode,\r\n captureID: createdNode.captureID,\r\n } as Visit, false);\r\n });\r\n }\r\n await this.resetVisits();\r\n this.onCancel();\r\n }\r\n\r\n get model3D(): AbstractControl {\r\n return this.visitForm.get('model3D');\r\n }\r\n\r\n get name(): AbstractControl {\r\n return this.visitForm.get('name');\r\n }\r\n\r\n onCancel() {\r\n this.visitSubmitted = false;\r\n this.visitForm = null;\r\n this.isEditing = false;\r\n this.canCancelImport = false;\r\n this.totalImages = 0;\r\n this.imagesProcessed = 0;\r\n this.errorForm = false;\r\n this.setupMenuItems();\r\n }\r\n\r\n async onDelete(visit: Visit, needPermission = true) {\r\n const message = this.translate.instant('confirm.deleteVisit');\r\n // eslint-disable-next-line no-alert\r\n if (window.confirm(message) || !needPermission) {\r\n console.log(this.visitIndexDetails);\r\n this.isProcessing = true;\r\n await this.visitService.deleteVisit(visit, this.spaceId);\r\n await this.resetVisits();\r\n this.isProcessing = false;\r\n }\r\n }\r\n\r\n private getDismissReason(reason: any): string {\r\n if (reason === ModalDismissReasons.ESC) {\r\n return 'by pressing ESC';\r\n }\r\n if (reason === ModalDismissReasons.BACKDROP_CLICK) {\r\n return 'by clicking on a backdrop';\r\n }\r\n return `with: ${reason}`;\r\n }\r\n\r\n async launchImport(\r\n model3D,\r\n surface,\r\n node,\r\n imagesOnly = false,\r\n overrideExisting = false,\r\n ) {\r\n this.modalReference = this.modalService.open(this.content, {\r\n ariaLabelledBy: \"modal-basic-title\",\r\n });\r\n this.modalReference.result.then(\r\n (result) => {\r\n this.closeResult = `Closed with: ${result}`;\r\n console.log(this.closeResult);\r\n this.cancelImport();\r\n },\r\n (error) => {\r\n this.closeResult = `Dismissed ${this.getDismissReason(error)}`;\r\n console.log(this.closeResult);\r\n this.cancelImport();\r\n },\r\n );\r\n try {\r\n await this.matterportImportService.initSdkForModel(model3D);\r\n\r\n await this.matterportImportService.importData(\r\n this.spaceId,\r\n surface,\r\n imagesOnly,\r\n node,\r\n overrideExisting\r\n );\r\n\r\n this.modalReference.close();\r\n\r\n } catch (error) {\r\n console.log(error);\r\n Promise.reject(error);\r\n }\r\n }\r\n\r\n private cancelImport() {\r\n this.matterportImportService.abandon();\r\n this.onCancel();\r\n this.resetVisits();\r\n }\r\n\r\n onImportImages(visit: Visit, overrideExisting) {\r\n this.launchImport(visit.model3d, null, visit.node.id, true, overrideExisting);\r\n }\r\n\r\n isFormError(control) {\r\n return control && control.invalid && this.errorForm;\r\n }\r\n}\r\n","<div class=\"container-fluid\" class=\"dashboard-tab\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\r\n </div>\r\n\r\n <div class=\"row main-form-container\">\r\n <div class=\"col-md-6 form-container\">\r\n <ul class=\"list-group list-group-flush\" *ngIf=\"!visitForm\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let visit of visits; index as index\">\r\n <div class=\"d-flex justify-content-between align-items-center\" (click)=\"onToggleDetail(index)\">\r\n {{visit.name ? visit.name : visit.model3d }}\r\n <lib-chevron [conditionShowing]=\"index==visitIndexDetails\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"index==visitIndexDetails\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}} : {{ visit.name ?\r\n visit.name : \"Not provided\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'3D Model' | translate}} : {{ visit.model3d }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Surface' | translate}}, m<sup>2</sup>: {{\r\n visit.surface ?\r\n visit.surface : 'Not provided' | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Viewer' | translate}} : {{ visit.viewer }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Date of capture' | translate}} : {{\r\n visit.takenAt | timeDateString | async}}\r\n <li class=\"list-group-item bg-transparent\">{{'Images are imported' | translate}} : {{\r\n imagesUploaded }}\r\n </li>\r\n </ul>\r\n \r\n <lib-loader *ngIf=\"isProcessing\"></lib-loader>\r\n\r\n <div class=\"action-button-container mt-3\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onImportImages(visit, true)\" [disabled]=\"isProcessing\">{{'Import all images' |\r\n translate}}</button>\r\n <button type=\"button\" *ngIf=\"imagesUploaded > 0\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onImportImages(visit, false)\" [disabled]=\"isProcessing\">{{'Import from image' |\r\n translate}} {{imagesUploaded}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" [disabled]=\"isProcessing\"\r\n (click)=\"onEdit(visit)\">{{'Edit' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" [disabled]=\"isProcessing\"\r\n (click)=\"onDelete(visit)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n <div *ngIf=\"visitForm\">\r\n <form (ngSubmit)=\"onSubmitVisit()\" [formGroup]=\"visitForm\">\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Reference 3D model' | translate}} *</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" [readonly]=\"isEditing\"\r\n [class.is-invalid]=\"model3D.invalid && visitSubmitted\" required\r\n formControlName=\"model3D\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-name-invalid\" [dismissible]=\"false\" type=\"danger\" \r\n *ngIf=\"validatorsService.isControlError(visitForm.controls['name']) \r\n || isFormError(visitForm.controls['name'])\">\r\n {{validatorsService.getError(visitForm.controls['name']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n <div *ngIf=\"isEditing\" class=\"text-danger\">\r\n {{'Cannot change 3D model reference. Please add new model.' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Viewer' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"viewer\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Surface' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"surface\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Capture Date' | translate}}</label>\r\n <div class=\"input-group\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"captureDate\" ngbDatepicker\r\n #d1=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\"\r\n type=\"button\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill me-2\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\r\n translate}}</button>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"new-location-form-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n \r\n </ngb-alert>\r\n </div>\r\n </form>\r\n </div>\r\n <div *ngIf=\"!visitForm\">\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onAddVisit()\">{{'Add 3D visit' |\r\n translate}}</button>\r\n </div>\r\n </div>\r\n <div id=\"viewer-frame\" style=\"width: 100%; aspect-ratio: 2/1;\"></div>\r\n </div>\r\n <ng-template #content let-modal>\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\" id=\"modal-basic-title\">{{'Importing Data' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n {{'Please do not leave or refresh this page...' | translate}}\r\n <div *ngIf=\"totalImages != 0\">Imported {{imagesProcessed}} out of {{totalImages}} images.</div>\r\n <div class=\"d-flex justify-content-center\">\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>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-outline-dark\" [disabled]=\"!canCancelImport\"\r\n (click)=\"modal.close('Cancel click')\">{{'Cancel import of images' | translate}}</button>\r\n </div>\r\n </ng-template>\r\n</div>","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-carousel',\r\n templateUrl: './carousel.component.html',\r\n styleUrls: ['./carousel.component.scss']\r\n})\r\nexport class CarouselComponent implements OnInit {\r\n\r\n @Input() images;\r\n\r\n @Output() currentScan = new EventEmitter<number>();\r\n\r\n dataEvent: string;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n this.currentScan.emit(0);\r\n }\r\n\r\n onSlide(event) {\r\n this.dataEvent = JSON.stringify(event);\r\n const imageIndex = Number.parseInt(\r\n event.current.replace(\"slideId_\", \"\"),\r\n 10,\r\n );\r\n this.currentScan.emit(imageIndex);\r\n }\r\n\r\n}\r\n","<ngb-carousel [interval]=\"5000\" *ngIf=\"images && images.length > 1\" (slide)=\"onSlide($event)\">\r\n <ng-template *ngFor=\"let image of images; let i = index\" ngbSlide [id]=\"'slideId_' + i\">\r\n <div class=\"picsum-img-wrapper\">\r\n <img [src]=\"image.path\" alt=\"Scan\" class=\"d-block w-100\">\r\n </div>\r\n <div class=\"carousel-caption\">\r\n <h3>{{image.title}}</h3>\r\n <p>{{image.description}}</p>\r\n </div>\r\n </ng-template>\r\n</ngb-carousel>\r\n\r\n<img *ngIf=\"images.length === 1\" [src]=\"images[0].path\" alt=\"Scan\" class=\"d-block w-100\">\r\n","export type Rectangle = {\r\n top: number;\r\n left: number;\r\n width: number;\r\n height: number;\r\n};\r\n\r\nexport enum SweepState {\r\n ADDED,\r\n REMOVED,\r\n DISABLED,\r\n OCCUPIED,\r\n STARTPOINT\r\n}\r\n\r\nexport function isInPolygon(p: { x: any; y: any; }, polygon: string | any[]): boolean {\r\n\r\n let isInside = false;\r\n let minX = polygon[0].x;\r\n let maxX = polygon[0].x;\r\n let minY = polygon[0].y;\r\n let maxY = polygon[0].y;\r\n for (let n = 1; n < polygon.length; n++) {\r\n const q = polygon[n];\r\n minX = Math.min(q.x, minX);\r\n maxX = Math.max(q.x, maxX);\r\n minY = Math.min(q.y, minY);\r\n maxY = Math.max(q.y, maxY);\r\n }\r\n\r\n if (p.x < minX || p.x > maxX || p.y < minY || p.y > maxY) {\r\n return false;\r\n }\r\n\r\n for (\r\n let index = 0, index_ = polygon.length - 1;\r\n index < polygon.length;\r\n index_ = index++\r\n ) {\r\n if (\r\n polygon[index].y > p.y !== polygon[index_].y > p.y &&\r\n p.x <\r\n ((polygon[index_].x - polygon[index].x) *\r\n (p.y - polygon[index].y)) /\r\n (polygon[index_].y - polygon[index].y) +\r\n polygon[index].x\r\n ) {\r\n isInside = !isInside;\r\n }\r\n }\r\n return isInside;\r\n}\r\n\r\nexport function rotate(point: { x: any; y: any; }, center: { x: any; y: any; }, angle: number) {\r\n let xM;\r\n let yM;\r\n let x;\r\n let y;\r\n angle *= Math.PI / 180;\r\n xM = point.x - center.x;\r\n yM = point.y - center.y;\r\n x = xM * Math.cos(angle) + yM * Math.sin(angle) + center.x;\r\n y = -xM * Math.sin(angle) + yM * Math.cos(angle) + center.y;\r\n return { x: Math.round(x), y: Math.round(y) };\r\n}\r\n\r\n/**\r\n * Check if an HtmlElement is inside a selection\r\n * @param button HTMLElement\r\n * @param selection\r\n * @returns true if the element is inside the selection, false otherwise\r\n */\r\nexport function buttonIsInSelection(\r\n button: HTMLButtonElement,\r\n selection: Rectangle,\r\n): boolean {\r\n const bounds = button.getBoundingClientRect();\r\n return (\r\n bounds.bottom > selection.top &&\r\n bounds.top < selection.top + selection.height &&\r\n bounds.right > selection.left &&\r\n bounds.left < selection.left + selection.width\r\n );\r\n}\r\n\r\n/**\r\n * Styles the button that represents a sweep on the plan: green-added to zone, red -not added, gray - disabled, orange - occupied\r\n * @param button HTMLButtonElement, button on the plan, \r\n * @param isAdded boolean, if the sweep added to the zone\r\n * @param isOccupied boolean, if the sweep added to any other zone (but not current)\r\n */\r\nexport function styleButton(button: HTMLButtonElement, state: SweepState) {\r\n switch (state) {\r\n case SweepState.ADDED:\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\r\n break;\r\n case SweepState.DISABLED:\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=black&height=17&width=17\")`;\r\n button.style.cursor = \"auto\";\r\n break;\r\n case SweepState.OCCUPIED:\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`;\r\n break;\r\n case SweepState.STARTPOINT:\r\n button.style.backgroundImage = `url('https://api.iconify.design/ic/baseline-flag-circle.svg?color=white&width=17&height=17')`;\r\n break;\r\n case SweepState.REMOVED:\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\r\n break;\r\n default:\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\r\n break;\r\n }\r\n // if (disabled) {\r\n // button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=#636363&height=17&width=17\")`;\r\n // button.style.cursor = \"auto\";\r\n // } else if (isOccupied) {\r\n // button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`;\r\n // } else {\r\n // button.style.backgroundImage = isAdded\r\n // ? `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`\r\n // : `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\r\n // }\r\n button.style.backgroundColor = \"transparent\";\r\n button.style.position = \"absolute\";\r\n button.style.border = \"none\";\r\n button.style.width = \"17px\";\r\n button.style.height = \"17px\";\r\n button.disabled = false;\r\n button.type = \"button\";\r\n}\r\n\r\n/**\r\n * Check if sweep (button) is chosen; it is reprsented by image style \"mdi:adjust\"\r\n * @param button HTMLElement\r\n * @returns boolean, if button was selected\r\n */\r\nexport function buttonIsChosen(button: HTMLElement): boolean {\r\n return button.style.backgroundImage.includes(\"adjust\");\r\n}\r\n\r\n/**\r\n * Visually change the state of a scan button, a selected button is blue\r\n * @param button HTMLElement\r\n * @param selected if true the button will be blue, otherwise it will red or green\r\n */\r\nexport function setVisuallySelected(button: HTMLElement, selected: boolean) {\r\n if (selected) {\r\n /** Color in blue */\r\n button.style.backgroundImage = button.style.backgroundImage\r\n .replace(\"red\", \"blue\")\r\n .replace(\"green\", \"blue\");\r\n } else {\r\n /** Get back in red or green */\r\n const color = buttonIsChosen(button) ? \"green\" : \"red\";\r\n button.style.backgroundImage = button.style.backgroundImage.replace(\r\n \"blue\",\r\n color,\r\n );\r\n }\r\n}","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\r\nimport { Rectangle } from '../../../../helper.service';\r\n\r\n@Component({\r\n selector: 'lib-selection',\r\n templateUrl: './selection.component.html',\r\n styleUrls: ['./selection.component.scss']\r\n})\r\nexport class SelectionComponent implements OnInit {\r\n constructor(){}\r\n\r\n /**Emit a new selection */\r\n @Output() onSelectionChanged = new EventEmitter<Rectangle>();\r\n\r\n /**Zone wich you can use a selection inside, must have the class \".selectZone\" */\r\n selectionableZone : HTMLElement;\r\n\r\n /**HtmlElement use to display the selected zone (blue) */\r\n selectionElement : HTMLElement;\r\n\r\n isMousedown : boolean = false;\r\n\r\n selection = {startX: 0, startY: 0, endX: 0, endY: 0};\r\n\r\n selectionRectangle : Rectangle = {top : 0, left: 0, width: 0, height: 0};\r\n\r\n ngOnInit(): void {\r\n this.selectionableZone = document.querySelector(\".selectZone\");\r\n\r\n this.selectionElement = document.querySelector(\"#selection\");\r\n\r\n this.selectionableZone.addEventListener(\"mousedown\",this.mousedown.bind(this));\r\n\r\n this.selectionableZone.addEventListener(\"mousemove\",this.mousemove.bind(this));\r\n\r\n this.selectionableZone.addEventListener(\"mouseup\",this.mouseup.bind(this));\r\n }\r\n \r\n /**\r\n * Update the current selection\r\n * Will update the selectionRectangle and Selection HTML element\r\n * @param shouldEmit if true an event will be emitted through onSelectionChanged (true by default)\r\n */\r\n updateSelectionElement(shouldEmit=true){\r\n this.selectionRectangle.width = Math.abs(this.selection.endX - this.selection.startX);\r\n this.selectionRectangle.height = Math.abs(this.selection.endY - this.selection.startY);\r\n this.selectionRectangle.top = Math.min(this.selection.endY, this.selection.startY);\r\n this.selectionRectangle.left = Math.min(this.selection.endX, this.selection.startX);\r\n\r\n this.selectionElement.style.top = `${this.selectionRectangle.top}px`;\r\n this.selectionElement.style.left = `${this.selectionRectangle.left}px`;\r\n this.selectionElement.style.width = `${this.selectionRectangle.width}px`;\r\n this.selectionElement.style.height = `${this.selectionRectangle.height}px`;\r\n\r\n if(shouldEmit){\r\n this.onSelectionChanged.emit(this.selectionRectangle);\r\n }\r\n }\r\n\r\n /**\r\n * Trigger when mouse is press down on selectionableZone\r\n * @param event \r\n */\r\n mousedown(event : MouseEvent){\r\n if(event.button !== 2){ /**Selection with the right click, so ignore all other event */\r\n return;\r\n }\r\n this.isMousedown = true;\r\n this.selection = {startY : event.clientY, startX : event.clientX, endX:event.clientX, endY:event.clientY};\r\n this.updateSelectionElement(); \r\n }\r\n\r\n /**\r\n * Trigger when mouse is release on selectionableZone\r\n * @param event \r\n */\r\n mouseup(event : MouseEvent){\r\n this.isMousedown = false;\r\n this.selection = {startX :0, startY : 0, endX:0, endY:0};\r\n this.updateSelectionElement(false); \r\n }\r\n\r\n /**\r\n * Trigger when mouse is moving on selectionableZone\r\n * @param event \r\n */\r\n mousemove(event : MouseEvent){\r\n if(this.isMousedown){\r\n this.selection.endX = event.clientX;\r\n this.selection.endY = event.clientY;\r\n this.updateSelectionElement();\r\n }\r\n }\r\n\r\n}\r\n","<ng-content></ng-content>\r\n\r\n<div id=\"selection\"></div>","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-radio-button',\r\n templateUrl: './radio-button.component.html',\r\n styleUrls: ['./radio-button.component.scss']\r\n})\r\nexport class RadioButtonComponent implements OnInit {\r\n\r\n @Input() label: string;\r\n\r\n @Output() isCheckedEvent = new EventEmitter<boolean>();\r\n\r\n isChecked: boolean;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n this.isChecked = false;\r\n }\r\n\r\n onChecked() {\r\n this.isCheckedEvent.emit(this.isChecked);\r\n }\r\n\r\n}\r\n","<div class=\"checkboxContainer\">\r\n <div class=\"switchContainer\">\r\n <label class=\"switch switch-success\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isChecked\" (change)=\"onChecked()\">\r\n <span class=\"slider round\"></span>\r\n </label>\r\n </div>\r\n <span class=\"label right\">{{label | translate}}</span>\r\n</div>","import { Component, OnInit, Input, OnChanges } from '@angular/core';\r\nimport { TranslateService } from \"@ngx-translate/core\";\r\n\r\n@Component({\r\n selector: 'lib-plan-legend',\r\n templateUrl: './plan-legend.component.html',\r\n styleUrls: ['./plan-legend.component.scss']\r\n})\r\nexport class PlanLegendComponent implements OnInit {\r\n @Input() isAudioZone?:boolean = false;\r\n\r\n buttonsToRender = [];\r\n\r\n colorToText = {};\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n ) {}\r\n\r\n async ngOnInit() {\r\n this.render()\r\n }\r\n\r\n async render() {\r\n this.buttonsToRender = [\r\n {\r\n url: `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`,\r\n text: this.translate.instant(\"legend.green\")\r\n },\r\n {\r\n url: `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`,\r\n text: this.translate.instant(\"legend.red\")\r\n }\r\n ]\r\n if (this.isAudioZone) {\r\n let audioPoints = [{\r\n url: `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=black&height=17&width=17\")`,\r\n text: this.translate.instant(\"legend.black\")\r\n },\r\n {\r\n url: `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`,\r\n text: this.translate.instant(\"legend.orange\")\r\n }]\r\n this.buttonsToRender = this.buttonsToRender.concat(audioPoints)\r\n }\r\n }\r\n\r\n //styleButton(element, SweepState.DISABLED);\r\n\r\n}\r\n","<div class=\"mt-3 ms-3\" class=\"legendContainer\">\r\n <h5>{{\"legend.title\" | translate}}</h5>\r\n <div class=\"legendBox\">\r\n <div class=\"legendRow\" *ngFor=\"let elemnt of buttonsToRender\">\r\n <button class=\"legendIcon\" [ngStyle] = \"{'background-image': elemnt.url}\"></button>\r\n <span>{{elemnt.text}}</span>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { getCoefficientsForImage, getMetaForImage, Navigation, NavigationService, Plan, Zone, showScanPointsOnPlanInDiv, ZoneService, PlanService } from '@smarterplan/ngx-smarterplan-core';\r\nimport panzoom, { PanZoom } from 'panzoom';\r\nimport { buttonIsInSelection, isInPolygon, Rectangle, rotate, setVisuallySelected, styleButton, SweepState } from '../../../../helper.service';\r\n\r\n@Component({\r\n selector: 'lib-sweep-plan-selection',\r\n templateUrl: './sweep-plan-selection.component.html',\r\n styleUrls: ['./sweep-plan-selection.component.scss']\r\n})\r\nexport class SweepPlanSelectionComponent implements OnInit {\r\n\r\n plans: Plan[];\r\n\r\n @Input() spaceID: string;\r\n\r\n @Input() chosenScansOnPlan: string[] = [];\r\n\r\n /** if comming from Edit Plan SVG Zone creation */\r\n @Input() newZoneData: any;\r\n\r\n navIDsZoneEdit: string[] = [];\r\n\r\n // sweeps belonging to any audio zone\r\n @Input() occupiedSweeps: string[] = [];\r\n\r\n // sweeps unavailable (cannot be chosen)\r\n @Input() unavailableSweeps: string[] = [];\r\n\r\n // if choosing sweeps for audio zone\r\n @Input() editingAudioZone: boolean = false;\r\n\r\n @Input() inputZone: Zone;\r\n\r\n @Input() multipleFloors: boolean = false;\r\n\r\n chosenPlan: Plan;\r\n\r\n /** panZoom element for adding scans */\r\n panZoom: PanZoom;\r\n\r\n /** divPlan (use By panZoom) */\r\n divPlan: HTMLElement;\r\n\r\n /** all scan buttons Element */\r\n buttonElements: HTMLButtonElement[] = [];\r\n\r\n /** Scan buttons that are in the current selection */\r\n buttonsInSelection: HTMLButtonElement[] = [];\r\n\r\n @Output() sweepsSelected = new EventEmitter<{ sweeps: string[]; startSweepID: string; }>();\r\n\r\n isSettingStartSweep = false;\r\n\r\n startSweepID: string;\r\n\r\n chosenSweepsPerFloor = new Map<string, string[]>(); // map matching floorID to sweeps selected\r\n\r\n inputSweepsPerFloor = new Map<string, string[]>(); // map matching floorID to sweeps selected for zone in edition\r\n\r\n selectionChanged = false;\r\n\r\n constructor(\r\n private zoneService: ZoneService,\r\n private navigationService: NavigationService,\r\n private planService: PlanService,\r\n private translate: TranslateService,\r\n ) { }\r\n\r\n async ngOnInit() {\r\n await this.getPlans();\r\n this.setSweepsOfInputZone();\r\n }\r\n\r\n ngOnChanges() {\r\n if (this.chosenPlan) {\r\n this.setSweepsOfInputZone();\r\n this.chosenScansOnPlan = [];\r\n this.clearDivPlan();\r\n this.addScanPoints();\r\n }\r\n }\r\n\r\n setSweepsOfInputZone() {\r\n this.navIDsZoneEdit = this.inputZone ? this.inputZone.sweepIDs : [];\r\n if (this.multipleFloors) {\r\n this.plans.forEach((plan) => {\r\n if (!this.inputSweepsPerFloor.get(plan.zoneID)) {\r\n this.inputSweepsPerFloor.set(plan.zoneID,\r\n this.navIDsZoneEdit.filter((sweep) => plan.zone.sweepIDs.includes(sweep)));\r\n }\r\n });\r\n } else {\r\n if (this.inputZone) {\r\n //filter plans only for the parent Zone\r\n this.plans = this.plans.filter((p) => p.zoneID === this.inputZone.parentID);\r\n }\r\n }\r\n }\r\n\r\n async getPlans() {\r\n this.plans = await this.planService.getSingedPlansForSpace(\r\n this.spaceID,\r\n );\r\n }\r\n\r\n async onPlanClick(plan: Plan) {\r\n const switchPlan = () => {\r\n this.selectionChanged = false;\r\n this.chosenPlan = plan;\r\n this.chosenScansOnPlan = [];\r\n this.clearDivPlan();\r\n this.addScanPoints();\r\n };\r\n if (this.selectionChanged) {\r\n const message = this.translate.instant(\"confirm.cancelModifZoneSweeps\");\r\n if (window.confirm(message)) {\r\n switchPlan();\r\n }\r\n } else {\r\n switchPlan();\r\n }\r\n }\r\n\r\n async addScanPoints() {\r\n let wasModified = false;\r\n if (this.multipleFloors) {\r\n // check if we have already validated buttons for this floor\r\n if (this.chosenSweepsPerFloor.get(this.chosenPlan.zoneID)) {\r\n this.chosenScansOnPlan = this.chosenSweepsPerFloor.get(this.chosenPlan.zoneID);\r\n wasModified = true;\r\n }\r\n }\r\n this.divPlan = document.querySelector(\"#planDiv\") as HTMLElement;\r\n const zoneOfPlan = await this.zoneService.getZone(\r\n this.chosenPlan.zoneID,\r\n );\r\n const navigations = await this.navigationService.getNavigationsForZone(\r\n zoneOfPlan,\r\n );\r\n if (this.newZoneData) await this.setScanByDraw(navigations);\r\n this.buttonElements = await showScanPointsOnPlanInDiv(\r\n this.chosenPlan,\r\n this.divPlan,\r\n navigations,\r\n );\r\n for (const element of this.buttonElements) {\r\n if (this.unavailableSweeps && this.unavailableSweeps.includes(element.id)) {\r\n styleButton(element, SweepState.DISABLED);\r\n } else {\r\n\r\n if (wasModified) {\r\n if (this.chosenScansOnPlan.includes(element.id)) {\r\n styleButton(element, SweepState.ADDED);\r\n } else {\r\n styleButton(element, SweepState.REMOVED);\r\n }\r\n } else {\r\n if (\r\n this.navIDsZoneEdit.length > 0 &&\r\n this.navIDsZoneEdit.includes(element.id)) {\r\n styleButton(element, SweepState.ADDED);\r\n if (!this.chosenScansOnPlan.includes(element.id)) {\r\n this.chosenScansOnPlan.push(element.id);\r\n }\r\n } else if (this.occupiedSweeps && this.occupiedSweeps.includes(element.id)) {\r\n styleButton(element, SweepState.OCCUPIED);\r\n } else {\r\n styleButton(element, SweepState.REMOVED);\r\n }\r\n }\r\n\r\n //start point should be last condition \r\n if (this.inputZone && this.inputZone.startSweepID === element.id) {\r\n console.log(\"setting start point\");\r\n styleButton(element, SweepState.STARTPOINT);\r\n }\r\n element.addEventListener(\"click\", (event) =>\r\n this.onButtonScanClicked(event.target as HTMLElement),\r\n );\r\n }\r\n }\r\n this.panZoom = panzoom(this.divPlan, {\r\n bounds: true,\r\n boundsPadding: 0,\r\n maxZoom: 3.5,\r\n beforeMouseDown(e: MouseEvent) {\r\n return (\r\n e.button === 2\r\n ); /** Ignore event for right click (use for selecting) */\r\n },\r\n });\r\n if (this.multipleFloors) {\r\n this.chosenSweepsPerFloor.set(this.chosenPlan.zoneID, [...this.chosenScansOnPlan]);\r\n }\r\n }\r\n\r\n /** Function if we are coming for svg editor workflow */\r\n setScanByDraw(navigations: any[]): Promise<void> {\r\n return new Promise(async (resolve) => {\r\n const rect = {\r\n width: this.newZoneData.width,\r\n height: this.newZoneData.height,\r\n };\r\n const img = await getMetaForImage(this.chosenPlan.filepath);\r\n const { coeffX, coeffY } = getCoefficientsForImage(img, rect);\r\n\r\n const draw = this.newZoneData.elements;\r\n\r\n draw.map(async (element: any) => {\r\n switch (element.nodeName) {\r\n case \"rect\":\r\n await this.setScanInRect(\r\n img,\r\n coeffX,\r\n coeffY,\r\n element,\r\n navigations,\r\n );\r\n break;\r\n\r\n case \"ellipse\":\r\n await this.setScanInCircle(\r\n img,\r\n coeffX,\r\n coeffY,\r\n element,\r\n navigations,\r\n );\r\n break;\r\n\r\n case \"path\":\r\n await this.setScanInPolygon(\r\n img,\r\n coeffX,\r\n coeffY,\r\n element,\r\n navigations,\r\n );\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n\r\n resolve();\r\n });\r\n }\r\n\r\n async setScanInRect(img: any, coeffX: number, coeffY: number,\r\n element: { angle: any; cx: any; cy: any; x: number; width: any; y: number; height: any; }, navigations: any[]) {\r\n const calibrage = JSON.parse(this.chosenPlan.calibration);\r\n navigations.map((navigation) => {\r\n const positionsOnPlan = navigation.positionOnPlan.map((entry) =>\r\n JSON.parse(entry),\r\n );\r\n const positionOnPlan = positionsOnPlan.find(\r\n (data) => data.planID === this.chosenPlan.id,\r\n );\r\n if (positionOnPlan) {\r\n const realWidth = img.width / coeffX;\r\n const realHeight = img.height / coeffY;\r\n const navY = (positionOnPlan.y * realHeight) / calibrage.imgHeight;\r\n const navX = (positionOnPlan.x * realWidth) / calibrage.imgWidth;\r\n if (\r\n navX > element.x &&\r\n navX < element.x + element.width &&\r\n navY > element.y &&\r\n navY < element.y + element.height &&\r\n !this.navIDsZoneEdit.includes(navigation.id)\r\n ) {\r\n this.navIDsZoneEdit.push(navigation.id);\r\n }\r\n }\r\n\r\n // old calibration:\r\n // const position = JSON.parse(navigation.position);\r\n // let navX = (calibrage.offsetX + position.x * calibrage.x) / coeffX;\r\n // let navY = (calibrage.offsetY + position.z * calibrage.y) / coeffY;\r\n // if (element.angle) {\r\n // const rotatePos = rotate(\r\n // { x: navX, y: navY },\r\n // { x: element.cx, y: element.cy },\r\n // element.angle,\r\n // );\r\n // navX = rotatePos.x;\r\n // navY = rotatePos.y;\r\n // }\r\n /**\r\n * TODO calculer la rotation du rectangle\r\n */\r\n // if (\r\n // navX > element.x &&\r\n // navX < element.x + element.width &&\r\n // navY > element.y &&\r\n // navY < element.y + element.height &&\r\n // !this.navIDsZoneEdit.includes(navigation.id)\r\n // ) {\r\n // this.navIDsZoneEdit.push(navigation.id);\r\n // }\r\n });\r\n } // EO\r\n\r\n async setScanInCircle(img: any, coeffX: number, coeffY: number,\r\n element: { angle: any; cx: number; cy: number; rx: number; ry: number; }, navigations: Navigation[]) {\r\n const calibrage = JSON.parse(this.chosenPlan.calibration);\r\n navigations.map(navigation => {\r\n const positionsOnPlan = navigation.positionOnPlan.map((entry) =>\r\n JSON.parse(entry),\r\n );\r\n const positionOnPlan = positionsOnPlan.find(\r\n (data) => data.planID === this.chosenPlan.id,\r\n );\r\n if (positionOnPlan) {\r\n const realWidth = img.width / coeffX;\r\n const realHeight = img.height / coeffY;\r\n let navY = (positionOnPlan.y * realHeight) / calibrage.imgHeight;\r\n let navX = (positionOnPlan.x * realWidth) / calibrage.imgWidth;\r\n if (element.angle) {\r\n const rotatePos = rotate(\r\n { x: navX, y: navY },\r\n { x: element.cx, y: element.cy },\r\n element.angle,\r\n );\r\n navX = rotatePos.x;\r\n navY = rotatePos.y;\r\n }\r\n\r\n const valueX =\r\n Math.pow(navX - element.cx, 2) / Math.pow(element.rx, 2);\r\n const valueY =\r\n Math.pow(navY - element.cy, 2) / Math.pow(element.ry, 2);\r\n const result = valueX + valueY;\r\n if (result <= 1 && !this.navIDsZoneEdit.includes(navigation.id)) {\r\n this.navIDsZoneEdit.push(navigation.id);\r\n }\r\n }\r\n\r\n // old calibration\r\n // const position = JSON.parse(navigation.position);\r\n // let navX = (calibrage.offsetX + position.x * calibrage.x) / coeffX;\r\n // let navY = (calibrage.offsetY + position.z * calibrage.y) / coeffY;\r\n // if (element.angle) {\r\n // const rotatePos = rotate(\r\n // { x: navX, y: navY },\r\n // { x: element.cx, y: element.cy },\r\n // element.angle,\r\n // );\r\n // navX = rotatePos.x;\r\n // navY = rotatePos.y;\r\n // }\r\n\r\n // const valueX =\r\n // Math.pow(navX - element.cx, 2) / Math.pow(element.rx, 2);\r\n // const valueY =\r\n // Math.pow(navY - element.cy, 2) / Math.pow(element.ry, 2);\r\n // const result = valueX + valueY;\r\n // if (result <= 1 && !this.navIDsZoneEdit.includes(navigation.id)) {\r\n // this.navIDsZoneEdit.push(navigation.id);\r\n // }\r\n });\r\n } // EO\r\n\r\n async setScanInPolygon(img: any, coeffX: number, coeffY: number, element: { segList: any; }, navigations: any[]) {\r\n const calibrage = JSON.parse(this.chosenPlan.calibration);\r\n navigations.map(async (navigation) => {\r\n\r\n const positionsOnPlan = navigation.positionOnPlan.map((entry) =>\r\n JSON.parse(entry),\r\n );\r\n const positionOnPlan = positionsOnPlan.find(\r\n (data) => data.planID === this.chosenPlan.id,\r\n );\r\n if (positionOnPlan) {\r\n const realWidth = img.width / coeffX;\r\n const realHeight = img.height / coeffY;\r\n let navY = (positionOnPlan.y * realHeight) / calibrage.imgHeight;\r\n let navX = (positionOnPlan.x * realWidth) / calibrage.imgWidth;\r\n\r\n const p = {\r\n x: navX,\r\n y: navY,\r\n };\r\n if (\r\n isInPolygon(p, element.segList) &&\r\n !this.navIDsZoneEdit.includes(navigation.id)\r\n ) {\r\n this.navIDsZoneEdit.push(navigation.id);\r\n }\r\n }\r\n\r\n // old calibration\r\n // const position = JSON.parse(navigation.position);\r\n // const p = {\r\n // x: (calibrage.offsetX + position.x * calibrage.x) / coeffX,\r\n // y: (calibrage.offsetY + position.z * calibrage.y) / coeffY,\r\n // };\r\n // if (element.angle) {\r\n // p = this.rotate(\r\n // p,\r\n // { x: element.cx, y: element.cy },\r\n // element.angle,\r\n // );\r\n // }\r\n // if (\r\n // isInPolygon(p, element.segList) &&\r\n // !this.navIDsZoneEdit.includes(navigation.id)\r\n // ) {\r\n // this.navIDsZoneEdit.push(navigation.id);\r\n // }\r\n });\r\n }\r\n\r\n clearDivPlan() {\r\n if (this.divPlan) this.divPlan.innerHTML = \"\";\r\n }\r\n\r\n\r\n /**\r\n * Trigger each by the selectionComponent when selection change\r\n * Update the current selected scan buttons\r\n * @param selection new selection\r\n */\r\n onSelectionChanged(selection: Rectangle) {\r\n const unselectedButtons: HTMLButtonElement[] = [];\r\n const newSelectedButtons = [];\r\n\r\n /** For each button, decide whether will be add to selected list or unselected list */\r\n for (const button of this.buttonElements) {\r\n const isSelected = buttonIsInSelection(button, selection);\r\n if (this.buttonsInSelection.includes(button)) {\r\n /** If the button is already in the selected list, we check if it should be unselect */\r\n if (!isSelected) {\r\n unselectedButtons.push(button);\r\n }\r\n } else if (isSelected) {\r\n newSelectedButtons.push(button);\r\n }\r\n }\r\n\r\n /** Visually Update unselected list */\r\n for (const button of unselectedButtons) {\r\n setVisuallySelected(button, false);\r\n }\r\n\r\n /** Visually Update selected list */\r\n for (const button of newSelectedButtons) {\r\n setVisuallySelected(button, true);\r\n }\r\n\r\n /** Remove unselected list */\r\n this.buttonsInSelection = this.buttonsInSelection.filter((button) => {\r\n return !unselectedButtons.includes(button);\r\n });\r\n /** Add new selected buttons */\r\n this.buttonsInSelection = [\r\n ...this.buttonsInSelection,\r\n ...newSelectedButtons,\r\n ];\r\n }\r\n\r\n\r\n\r\n /**\r\n * Trigger when the user click to add the selected scans\r\n */\r\n onSelectionAdd() {\r\n for (const button of this.buttonsInSelection) {\r\n if (!this.chosenScansOnPlan.includes(button.id)) {\r\n this.onButtonScanClicked(button);\r\n }\r\n }\r\n\r\n this.onSelectionChanged({ top: 0, left: 0, width: 0, height: 0 });\r\n }\r\n\r\n /**\r\n * Trigger when the user click to remove the selected scans\r\n */\r\n onSelectionRemove() {\r\n for (const button of this.buttonsInSelection) {\r\n if (this.chosenScansOnPlan.includes(button.id)) {\r\n this.onButtonScanClicked(button);\r\n }\r\n }\r\n this.onSelectionChanged({ top: 0, left: 0, width: 0, height: 0 });\r\n }\r\n\r\n /**\r\n * Trigger when the user click to select all scans\r\n */\r\n onSelectAll() {\r\n this.buttonsInSelection = [...this.buttonElements];\r\n for (const button of this.buttonsInSelection) {\r\n setVisuallySelected(button, true);\r\n }\r\n }\r\n\r\n /**\r\n * Trigger when the user change the size of the scan points\r\n * @param event\r\n */\r\n onChangeScanSize(event: any) {\r\n const factor = event.target.value;\r\n\r\n for (const button of this.buttonElements) {\r\n button.style.transform = `scale(${factor})`;\r\n }\r\n }\r\n\r\n /**\r\n * When a button representing a scan is clicked\r\n * @param button\r\n */\r\n onButtonScanClicked(button: HTMLElement) {\r\n this.selectionChanged = true;\r\n if (this.isSettingStartSweep) {\r\n if (this.startSweepID === button.id) {\r\n // we deselect the starting point\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\r\n this.startSweepID = null;\r\n return;\r\n }\r\n button.style.backgroundImage = `url('https://api.iconify.design/ic/baseline-flag-circle.svg?color=white&width=17&height=17')`;\r\n if (!this.chosenScansOnPlan.includes(button.id)) {\r\n this.chosenScansOnPlan.push(button.id);\r\n }\r\n if (this.startSweepID) {\r\n // we are changing start sweep\r\n const btnChanged = this.buttonElements.find((btn) => btn.id === this.startSweepID);\r\n btnChanged.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\r\n }\r\n this.startSweepID = button.id;\r\n return;\r\n }\r\n if (!this.chosenScansOnPlan.includes(button.id)) {\r\n // add to selection\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\r\n this.chosenScansOnPlan.push(button.id);\r\n } else {\r\n // remove from selection\r\n if (this.occupiedSweeps.includes(button.id) && !this.navIDsZoneEdit.includes(button.id)) {\r\n // the sweep belongs to another zone => set orange\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`;\r\n } else {\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\r\n }\r\n const index = this.chosenScansOnPlan.indexOf(button.id);\r\n this.chosenScansOnPlan.splice(index, 1);\r\n }\r\n }\r\n\r\n onSaveSelection() {\r\n if (this.multipleFloors) {\r\n // rassemble all sweeps per floors\r\n let finalSweeps = [];\r\n Array.from(this.inputSweepsPerFloor.keys()).forEach(floorID => {\r\n if (this.chosenSweepsPerFloor.get(floorID)) {\r\n // the sweeps for this floor were modified, we take them\r\n finalSweeps = [...finalSweeps, ...this.chosenSweepsPerFloor.get(floorID)];\r\n } else {\r\n // was not modified, we take the previous values\r\n finalSweeps = [...finalSweeps, ...this.inputSweepsPerFloor.get(floorID)];\r\n }\r\n });\r\n // console.log(\"final sweeps\", finalSweeps);\r\n this.sweepsSelected.emit({ \"sweeps\": finalSweeps, \"startSweepID\": this.startSweepID });\r\n } else {\r\n this.sweepsSelected.emit({ \"sweeps\": this.chosenScansOnPlan, \"startSweepID\": this.startSweepID });\r\n }\r\n }\r\n\r\n onCancel() {\r\n if (this.selectionChanged) {\r\n const message = this.translate.instant(\"confirm.cancelModifZoneSweeps\");\r\n if (window.confirm(message)) {\r\n this.sweepsSelected.emit(null);\r\n }\r\n } else {\r\n this.sweepsSelected.emit(null);\r\n }\r\n }\r\n\r\n /**\r\n * Adds current selection of sweeps for current floor (plan) for multifloor zone.\r\n * It has to be saved anyway with onSaveSelection!\r\n */\r\n onValidateForFloor() {\r\n if (this.multipleFloors) {\r\n this.chosenSweepsPerFloor.set(this.chosenPlan.zoneID, [...this.chosenScansOnPlan]);\r\n this.selectionChanged = false;\r\n }\r\n }\r\n}\r\n","<div ngbDropdown class=\"sp-row d-inline-block\">\r\n <div class=\"col-sm-3\" *ngIf=\"plans\">\r\n <button type=\"button\" class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\"\r\n ngbDropdownToggle>{{chosenPlan ?\r\n chosenPlan.name : ('Choose Plan' | translate) }}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button type=\"button\" ngbDropdownItem *ngFor=\"let plan of plans\" (click)=\"onPlanClick(plan)\"\r\n [disabled]=\"!plan.calibration\">{{ plan.name }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"sp-row\">\r\n <lib-selection class=\"col-md-8\" (onSelectionChanged)=\"onSelectionChanged($event)\">\r\n <lib-plan-legend [isAudioZone]=\"editingAudioZone\" *ngIf=\"buttonElements.length > 0\"></lib-plan-legend>\r\n <div class=\"selectZone\" oncontextmenu=\"return false;\">\r\n <div class=\"sp-row\">\r\n <div style=\"overflow: hidden;width:100%;\">\r\n <div style=\"height: 400px; width: 100%;\" id=\"planDiv\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </lib-selection>\r\n \r\n <div class=\"col-md-4 scanTool\" *ngIf=\"buttonElements.length > 0\">\r\n <div class=\"sp-row d-inline-block\">\r\n <h2>{{'selectTool.title' | translate}}</h2>\r\n <div class=\"protip\">{{'selectTool.tip' | translate}}.</div>\r\n </div>\r\n \r\n <div class=\"sp-row\">\r\n <div class=\"col-3\" style=\"padding:0px\">\r\n <label class=\"tool-label\" for=\"scanSize\">{{'selectTool.size' | translate}}</label>\r\n </div>\r\n <div class=\"col-9\">\r\n <input type=\"range\" class=\"form-range\" min=\"0.001\" max=\"5\" step=\"0.01\" value=\"1\"\r\n id=\"scanSize\" (input)=\"onChangeScanSize($event)\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"sp-row\">\r\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onSelectAll()\">{{'selectTool.selectAll' | translate}}</button>\r\n </div>\r\n \r\n <div *ngIf=\"buttonsInSelection.length > 0\" class=\"edit-selected\">\r\n <span class=\"tool-label\">{{'selectTool.edit' | translate}} : </span>\r\n <div class=\"sp-row\">\r\n <button class=\"btn rounded-pill btn-primary ms-3 me-2\" (click)=\"onSelectionAdd()\">{{'selectTool.add' | translate}}</button>\r\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onSelectionRemove()\">{{'selectTool.undo' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sp-row\">\r\n <div *ngIf=\"multipleFloors\"> \r\n {{ chosenSweepsPerFloor.get(chosenPlan.zoneID) ? chosenSweepsPerFloor.get(chosenPlan.zoneID).length : \"0\"}} {{'scan points selected on this floor' | translate}} \r\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onValidateForFloor()\" [disabled]=\"!selectionChanged\">{{'Update selection for this floor' | translate}}</button>\r\n </div>\r\n <div *ngIf=\"!multipleFloors\">\r\n {{ chosenScansOnPlan.length }} {{'scan points chosen' | translate}} \r\n </div>\r\n </div>\r\n <div *ngIf=\"!editingAudioZone\" class=\"sp-row\">\r\n <lib-radio-button label=\"{{ 'selectTool.chooseStartPoint' | translate }}\" (isCheckedEvent)=\"isSettingStartSweep=!isSettingStartSweep\"></lib-radio-button>\r\n </div>\r\n <div class=\"sp-row\">\r\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onSaveSelection()\">{{'selectTool.saveSelection' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'selectTool.cancelSelection' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n \r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport {\r\n UntypedFormGroup,\r\n UntypedFormBuilder,\r\n Validators,\r\n AbstractControl,\r\n ValidatorFn,\r\n ValidationErrors,\r\n} from '@angular/forms';\r\nimport {\r\n Zone,\r\n Plan,\r\n Layer,\r\n ZoneService,\r\n LayerService,\r\n BaseUserService,\r\n NavigationService,\r\n} from '@smarterplan/ngx-smarterplan-core';\r\n@Component({\r\n selector: 'lib-add-zone',\r\n templateUrl: './add-zone.component.html',\r\n styleUrls: ['./add-zone.component.scss'],\r\n})\r\nexport class AddZoneComponent implements OnInit {\r\n @Input() zoneEdit: Zone;\r\n\r\n @Input() spaceID: string;\r\n\r\n @Input() images360: { path: string; filename: string }[];\r\n\r\n @Input() navigationIDs: string[];\r\n\r\n @Input() zones: Zone[];\r\n\r\n @Input() newZoneDataFromEditor: any;\r\n\r\n @Output() updatedZone = new EventEmitter<any>();\r\n\r\n @Input() chosenPlan: Plan;\r\n\r\n @Input() isMuseumVisit: boolean = false;\r\n\r\n @Input() defaultZone: Zone;\r\n\r\n parentZones: Zone[] = [];\r\n\r\n carouselIsVisible = false;\r\n\r\n zoneForm: UntypedFormGroup;\r\n\r\n isSubmitted = false;\r\n\r\n currentScanShowing: number;\r\n\r\n chosenScans: number[] = [];\r\n\r\n layers: Layer[];\r\n\r\n fromPlan: boolean = false;\r\n\r\n chosenScansOnPlan: string[] = [];\r\n\r\n currentOrgId: string;\r\n\r\n zoneInitialNavCount = 0;\r\n\r\n zoneIsMatterportFloor = false;\r\n\r\n multipleFloors = false;\r\n\r\n constructor(\r\n private fb: UntypedFormBuilder,\r\n private zoneService: ZoneService,\r\n private layerService: LayerService,\r\n private userService: BaseUserService,\r\n private navigationService: NavigationService\r\n ) { }\r\n\r\n async ngOnInit() {\r\n this.parentZones = this.zones.filter(\r\n (zone) => zone.layer && zone.layer.name === 'FLOOR'\r\n );\r\n if (!this.defaultZone) {\r\n this.defaultZone = this.getDefaultZone();\r\n }\r\n this.parentZones.unshift(this.defaultZone);\r\n await this.updateLayers();\r\n this.initZoneForm();\r\n }\r\n\r\n async updateLayers() {\r\n this.currentOrgId = this.userService.currentOrganisation(this.spaceID).id;\r\n const layers = await this.layerService.getLayerForOrganisation(\r\n this.currentOrgId\r\n );\r\n // filter out layers created by the system\r\n this.layers = layers.filter(\r\n (l) => l.name !== 'BUILDING' && l.name !== 'FLOOR'\r\n );\r\n }\r\n\r\n async initZoneForm() {\r\n if (this.zoneEdit) {\r\n if (this.zoneEdit.metadata) {\r\n const metadata = JSON.parse(this.zoneEdit.metadata);\r\n this.zoneIsMatterportFloor = metadata.hasOwnProperty(\r\n 'matterportFloorSequence'\r\n );\r\n }\r\n const isVirtual = this.zoneService.zoneIsVirtual(this.zoneEdit);\r\n if (!isVirtual) {\r\n await this.loadNavigations();\r\n }\r\n this.isMuseumVisit = this.zoneEdit.isMuseumVisitZone === true;\r\n this.multipleFloors = this.zoneEdit.isMultipleFloorZone === true;\r\n this.zoneForm = this.fb.group({\r\n id: this.zoneEdit.id,\r\n name: [this.zoneEdit.name, [Validators.required]],\r\n code_ref: this.zoneEdit.code_ref ? this.zoneEdit.code_ref : null,\r\n layerID: this.zoneEdit.layer ? this.zoneEdit.layer.id : null,\r\n surface: this.zoneEdit.surface ? this.zoneEdit.surface : 0,\r\n parentID: this.zoneEdit.parentID,\r\n parent: { value: this.zoneEdit.parent.name, disabled: true },\r\n newLayer: [null, [this.layerNameValidator()]],\r\n isMuseumVisitZone: this.isMuseumVisit,\r\n startSweepID: this.zoneEdit.startSweepID,\r\n });\r\n this.onChangeMultipleFloors();\r\n } else {\r\n this.zoneForm = this.fb.group({\r\n name: [\r\n this.newZoneDataFromEditor ? this.newZoneDataFromEditor.name : '',\r\n [Validators.required],\r\n ],\r\n code_ref: null,\r\n layerID: null,\r\n surface: 0,\r\n parentID: this.defaultZone.id,\r\n newLayer: [null, [this.layerNameValidator()]],\r\n isMuseumVisitZone: this.isMuseumVisit,\r\n startSweepID: null,\r\n });\r\n }\r\n }\r\n\r\n async onSubmitZone() {\r\n this.isSubmitted = true;\r\n if (!this.zoneForm.valid) {\r\n return;\r\n }\r\n const formValue = this.zoneForm.getRawValue(); //because we need values of disables controls as well\r\n if (formValue.newLayer) {\r\n await this.createLayer(formValue.newLayer).then((layer) => {\r\n formValue.layerID = layer.id;\r\n });\r\n }\r\n\r\n const zoneInput = {\r\n name: formValue.name,\r\n surface: Math.round(formValue.surface * 100) / 100,\r\n spaceID: this.spaceID,\r\n layerID: formValue.layerID,\r\n parentID: formValue.parentID,\r\n isMuseumVisitZone: this.isMuseumVisit,\r\n isMultipleFloorZone: this.multipleFloors,\r\n sweepIDs: [],\r\n startSweepID: formValue.startSweepID,\r\n } as Zone;\r\n\r\n if (formValue.code_ref) {\r\n zoneInput.code_ref = formValue.code_ref;\r\n }\r\n\r\n try {\r\n this.zoneForm = null;\r\n this.isSubmitted = false;\r\n if (this.zoneEdit) {\r\n const zoneUpdate = zoneInput;\r\n zoneUpdate.sweepIDs = this.zoneEdit.sweepIDs;\r\n zoneUpdate.id = formValue.id;\r\n await this.setSweepsAndNodeForZoneInput(zoneUpdate);\r\n await this.zoneService.updateZone(zoneUpdate);\r\n this.zoneEdit = null;\r\n this.updatedZone.emit(zoneUpdate.id);\r\n } else {\r\n await this.setSweepsAndNodeForZoneInput(zoneInput);\r\n if (!zoneInput.parentID) {\r\n // set building as parent\r\n zoneInput.parentID = this.defaultZone.id;\r\n }\r\n await this.zoneService.create(zoneInput).then((zoneCreated) => {\r\n this.updatedZone.emit(zoneCreated.id);\r\n });\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.isSubmitted = false;\r\n this.zoneForm = null;\r\n this.chosenScansOnPlan = [];\r\n this.chosenScans = [];\r\n this.updatedZone.emit(false);\r\n }\r\n\r\n get name(): AbstractControl {\r\n return this.zoneForm.get('name');\r\n }\r\n\r\n get newLayer(): AbstractControl {\r\n return this.zoneForm.get('newLayer');\r\n }\r\n\r\n toggleCarousel() {\r\n this.carouselIsVisible = true;\r\n this.chosenScansOnPlan = [];\r\n }\r\n\r\n togglePlan() {\r\n this.fromPlan = true;\r\n this.chosenScans = [];\r\n }\r\n\r\n onAddScan() {\r\n if (!this.chosenScans.includes(this.currentScanShowing)) {\r\n // console.log(\"adding scan\", this.currentScanShowing);\r\n this.chosenScans.push(this.currentScanShowing);\r\n } else {\r\n alert('Scan already added!');\r\n }\r\n }\r\n\r\n onRemoveScanImage(scan: any) {\r\n const index = this.chosenScans.indexOf(scan);\r\n this.chosenScans.splice(index, 1);\r\n }\r\n\r\n onRemoveScanPlan(scan: any) {\r\n const index = this.chosenScansOnPlan.indexOf(scan);\r\n this.chosenScansOnPlan.splice(index, 1);\r\n }\r\n\r\n async setSweepsAndNodeForZoneInput(zoneInput: Zone) {\r\n if (\r\n this.chosenScans.length > 0 &&\r\n this.chosenScans.length !== this.zoneInitialNavCount &&\r\n !this.fromPlan\r\n ) {\r\n // if we chose scans from the carousel\r\n const sweepIDs: string[] = [];\r\n this.chosenScans.map(async (scan) => {\r\n const imageUuid = this.images360[scan].filename.split('_')[0];\r\n const sweepID = this.navigationIDs.find((nav) => {\r\n return nav.includes(imageUuid);\r\n });\r\n if (sweepID) {\r\n sweepIDs.push(sweepID);\r\n }\r\n });\r\n zoneInput.sweepIDs = sweepIDs;\r\n } else {\r\n // we are not coming from gallery choice\r\n if (this.chosenScansOnPlan.length > 0) {\r\n zoneInput.sweepIDs = this.chosenScansOnPlan;\r\n }\r\n }\r\n\r\n if (zoneInput.sweepIDs && zoneInput.sweepIDs.length > 0) {\r\n const navForSweep =\r\n await this.navigationService.getNavigationsForMatterportIDForSpace(\r\n zoneInput.sweepIDs[0],\r\n this.spaceID\r\n );\r\n zoneInput.nodeIDs = [navForSweep[0].nodeID];\r\n }\r\n }\r\n\r\n async createLayer(name: string): Promise<Layer> {\r\n return this.layerService.createLayerForOrganisation(\r\n name,\r\n this.currentOrgId\r\n );\r\n }\r\n\r\n async loadNavigations(): Promise<any> {\r\n if (this.zoneEdit.sweepIDs.length > 0) {\r\n this.zoneInitialNavCount = this.zoneEdit.sweepIDs.length;\r\n const navList: number[] = [];\r\n const scansZoneEdit: string[] = [];\r\n await Promise.all(\r\n this.zoneEdit.sweepIDs.map(async (sweepID: string) => {\r\n scansZoneEdit.push(sweepID);\r\n const index = this.images360.findIndex((im) => {\r\n return im.filename.includes(sweepID.slice(0, 8));\r\n });\r\n if (index !== -1) {\r\n navList.push(index);\r\n }\r\n })\r\n );\r\n this.chosenScans = navList;\r\n this.chosenScansOnPlan = scansZoneEdit;\r\n return Promise.resolve();\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n // iniPlanForDraw() {\r\n // this.togglePlan();\r\n // setTimeout(() => {\r\n // this.onPlanClick();\r\n // }, 500);\r\n // }\r\n\r\n /**\r\n * Adds all sweeps of the space\r\n */\r\n onAddAll() {\r\n const defaultZone = this.getDefaultZone();\r\n if (defaultZone) {\r\n this.chosenScansOnPlan = defaultZone.sweepIDs;\r\n this.zoneForm.get('parentID').setValue(defaultZone.id);\r\n this.zoneForm.get('parentID').disable();\r\n this.multipleFloors = true;\r\n }\r\n }\r\n\r\n getDefaultZone(): Zone {\r\n return this.zones.find(\r\n (zone) =>\r\n zone.layer &&\r\n zone.layer.name === 'BUILDING' &&\r\n zone.sweepIDs &&\r\n zone.sweepIDs.length > 0\r\n );\r\n }\r\n /**\r\n * Multiple floors\r\n */\r\n onChangeMultipleFloors() {\r\n if (this.multipleFloors) {\r\n const defaultZone = this.getDefaultZone();\r\n if (defaultZone) {\r\n this.zoneForm.get('parentID').setValue(defaultZone.id);\r\n this.zoneForm.get('parentID').disable();\r\n }\r\n } else {\r\n this.zoneForm.get('parentID').enable();\r\n }\r\n }\r\n\r\n onSelectedSweepsFromPlan(result: { sweeps: string[]; startSweepID: string }) {\r\n if (result) {\r\n if (result.sweeps) {\r\n this.chosenScansOnPlan = result.sweeps;\r\n }\r\n if (result.startSweepID) {\r\n this.zoneForm.controls.startSweepID.setValue(result.startSweepID);\r\n }\r\n }\r\n this.fromPlan = false;\r\n }\r\n\r\n layerNameValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n const forbidden = this.layers\r\n .map((l) => l.name.toLowerCase())\r\n .includes(control.value.toLowerCase());\r\n return forbidden ? { forbiddenName: { value: control.value } } : null;\r\n };\r\n }\r\n}\r\n","<div class=\"main-container\" *ngIf=\"zoneForm\">\r\n <div class=\"col-7\">\r\n <form (ngSubmit)=\"onSubmitZone()\" [formGroup]=\"zoneForm\">\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" required formControlName=\"name\">\r\n <!-- <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'codeRef' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"code_ref\">\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\" *ngIf=\"!isMuseumVisit && !zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Type of zone' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <select class=\"form-control\" formControlName=\"layerID\">\r\n <option value=\"null\" selected disabled hidden> {{ zoneEdit && zoneEdit.layer ?\r\n zoneEdit.layer.name : 'Choose type'}}</option>\r\n <option *ngFor=\"let layer of layers\" [value]=\"layer.id\">\r\n {{ layer.name }}\r\n </option>\r\n </select>\r\n <p class=\"mt-1 new-type-text\">{{'or add new type of zone' | translate }}</p>\r\n <input type=\"text\" class=\"form-control new-type-input\" formControlName=\"newLayer\">\r\n <div *ngIf=\"newLayer.invalid && (newLayer.dirty || newLayer.touched)\" class=\"text-danger\">\r\n <div *ngIf=\"newLayer.errors?.['forbiddenName']\">\r\n {{'Layer exists already' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--If Editing Zone possibility to assign it to museum itinerary-->\r\n <div class=\"mb-3 row\" *ngIf=\"zoneEdit && !zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{ 'Museum Itinerary' | translate }}</label>\r\n <div class=\"col-sm-10\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"isMuseumVisit\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" *ngIf=\"!zoneEdit || zoneEdit.isMultipleFloorZone\">\r\n <label class=\"col-sm-2 col-form-label\">{{ 'Multiple Floors' | translate }}</label>\r\n <div class=\"col-sm-10\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"multipleFloors\"\r\n [disabled]=\"zoneEdit !== undefined && zoneEdit !== null\" (change)=\"onChangeMultipleFloors()\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n <div class='text-danger' *ngIf=\"zoneEdit\">\r\n {{'cannotChangeMultifloor' | translate}}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Surface' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"surface\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Parent zone' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input *ngIf=\"zoneEdit\" type=\"text\" class=\"form-control\" formControlName=\"parent\">\r\n <div class=\"text-danger\" *ngIf=\"zoneEdit\">\r\n {{'cannotChangeParent' | translate}}\r\n </div>\r\n <select *ngIf=\"!zoneEdit\" class=\"form-control\" formControlName=\"parentID\">\r\n <option *ngFor=\"let zone of parentZones\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" style=\"max-height: 200px; overflow: auto;\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Scan Points' | translate}}</label>\r\n <!-- <p class=\"col-sm-2\" *ngIf=\"zoneEdit\">{{ zoneEdit.sweepIDs.length }} scans</p> -->\r\n <p class=\"col\" *ngIf=\"chosenScansOnPlan.length === 0 && chosenScans.length === 0\">\r\n {{'No scan points chosen' | translate}}</p>\r\n <div class=\"col-sm-5\" *ngIf=\"chosenScansOnPlan && chosenScansOnPlan.length > 0\">\r\n <p>{{ chosenScansOnPlan.length }} {{'scan points chosen' | translate}}</p>\r\n <!-- <div *ngFor=\"let scan of chosenScansOnPlan\">\r\n <div class=\"row\">\r\n <p class=\"me-2\">{{ scan | slice:0:8 }}</p>\r\n <div (click)=\"onRemoveScanPlan(scan)\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <div class=\"col-sm-5\" *ngIf=\"carouselIsVisible && chosenScans && chosenScans.length > 0\">\r\n <p>{{ chosenScans.length }} {{'scan points chosen' | translate}}</p>\r\n <div *ngFor=\"let scan of chosenScans\">\r\n <div class=\"row\">\r\n <p class=\"me-2\">{{ images360[scan].filename }}</p>\r\n <div (click)=\"onRemoveScanImage(scan)\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3 mt-3\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <div class=\"col\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\r\n (click)=\"togglePlan()\">{{'Choose scan points on plan' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"toggleCarousel()\"\r\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\r\n {{'Choose scan points from gallery' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAll()\"\r\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\r\n {{'add-all-scans' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'No visible scan points' | translate}}</label>\r\n <div class=\"col-sm-3\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"noScanPoints\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div> -->\r\n\r\n <div *ngIf=\"carouselIsVisible\" class=\"mb-2\">\r\n <lib-carousel *ngIf=\"images360 && images360.length > 0\" [images]=\"images360\"\r\n (currentScan)=\"currentScanShowing=$event\"></lib-carousel>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2 mt-3\"\r\n (click)=\"onAddScan()\">{{'Add to zone' | translate}}</button>\r\n </div>\r\n <div class=\"mt-3\">\r\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\"\r\n [disabled]=\"fromPlan || !zoneForm.valid\">{{'Save' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\r\n <lib-sweep-plan-selection style=\"width: 100%;\" [newZoneData]=\"newZoneDataFromEditor\" [spaceID]=\"spaceID\"\r\n [multipleFloors]=\"multipleFloors\" [inputZone]=\"zoneEdit\"\r\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\r\n </div>\r\n</div>","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { UntypedFormGroup, UntypedFormBuilder, Validators } from '@angular/forms';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { ZoneService, LayerService, BaseUserService, NavigationService, Layer, Zone, CommentType, CommentService, Comment, filterUniqueArrayByID } from '@smarterplan/ngx-smarterplan-core';\r\n\r\n\r\n@Component({\r\n selector: 'lib-add-audio-zone',\r\n templateUrl: './add-audio-zone.component.html',\r\n styleUrls: ['./add-audio-zone.component.scss'],\r\n})\r\nexport class AddAudioZoneComponent implements OnInit {\r\n\r\n @Input() spaceID: string;\r\n\r\n @Output() updatedZone = new EventEmitter<any>();\r\n\r\n @Input() defaultZone: Zone;\r\n\r\n @Input() zones: Zone[];\r\n\r\n @Input() parentZone: Zone;\r\n\r\n isSubmitted = false;\r\n\r\n fromPlan: boolean = false;\r\n\r\n chosenScansOnPlan: string[] = [];\r\n\r\n currentOrgId: string;\r\n\r\n audioLayer: Layer;\r\n\r\n commentForm: UntypedFormGroup;\r\n\r\n fileToUpload: File;\r\n\r\n audiosForSpace: Comment[];\r\n\r\n isAddingAudio = false;\r\n\r\n chosenAudio: Comment;\r\n\r\n audioZones: Zone[];\r\n\r\n @Input() currentAudioZone: Zone;\r\n\r\n scansModified = false;\r\n\r\n occupiedSweeps: string[] = [];\r\n\r\n unavailableSweeps: string[] = [];\r\n\r\n working = false;\r\n\r\n audioUploaded = false;\r\n\r\n constructor(\r\n private fb: UntypedFormBuilder,\r\n private zoneService: ZoneService,\r\n private layerService: LayerService,\r\n private userService: BaseUserService,\r\n private navigationService: NavigationService,\r\n private commentService: CommentService,\r\n private translate: TranslateService,\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (this.currentAudioZone) {\r\n // we are editing zone\r\n this.chosenAudio = this.currentAudioZone.audio;\r\n this.chosenScansOnPlan = this.currentAudioZone.sweepIDs;\r\n this.parentZone = this.currentAudioZone.parent;\r\n }\r\n this.setup();\r\n }\r\n\r\n async setup() {\r\n const mission = this.userService.currentMission(this.spaceID);\r\n this.currentOrgId = mission.organisationID;\r\n let layers = await this.layerService.getLayerForOrganisation(\r\n this.currentOrgId,\r\n );\r\n this.audioLayer = layers.find((layer) => layer.name === \"AUDIO\");\r\n if (!this.audioLayer) {\r\n // first time creating Audio Zone \r\n this.audioLayer = await this.layerService.createLayerForOrganisation(\"AUDIO\", this.currentOrgId);\r\n }\r\n if (!this.parentZone) {\r\n this.parentZone = this.defaultZone;\r\n }\r\n this.audioZones = this.zones.filter((zone) => zone.audioID && zone.parentID === this.parentZone.id);\r\n this.occupiedSweeps = this.audioZones.flatMap((zone) => zone.sweepIDs);\r\n // unavailable sweeps: sweeps that do not belong to parent zone\r\n this.unavailableSweeps = this.defaultZone.sweepIDs.filter((sweep) => !this.parentZone.sweepIDs.includes(sweep));\r\n await this.getAudios();\r\n this.commentForm = this.fb.group({\r\n title: [null, Validators.required],\r\n spaceID: this.spaceID,\r\n type: CommentType.AUDIO,\r\n ownerID: mission.id,\r\n });\r\n }\r\n\r\n async onSubmit() {\r\n this.isSubmitted = true;\r\n this.working = true;\r\n if (this.currentAudioZone) {\r\n await this.zoneService.updateZone({\r\n id: this.currentAudioZone.id,\r\n sweepIDs: this.chosenScansOnPlan,\r\n });\r\n await this.removeTakenSweepsFromOtherZones();\r\n this.updatedZone.emit(this.currentAudioZone.id);\r\n this.working = false;\r\n } else {\r\n const zoneInput = {\r\n name: `${this.parentZone.name} - ${this.chosenAudio.title}`,\r\n surface: 0,\r\n spaceID: this.spaceID,\r\n layerID: this.audioLayer.id,\r\n parentID: this.parentZone.id,\r\n isMuseumVisitZone: false,\r\n isMultipleFloorZone: this.parentZone.isMultipleFloorZone,\r\n audioID: this.chosenAudio.id,\r\n } as Zone;\r\n try {\r\n await this.setSweepsAndNodeForZoneInput(zoneInput);\r\n await this.zoneService\r\n .create(zoneInput)\r\n .then(async (zoneCreated) => {\r\n this.currentAudioZone = zoneCreated;\r\n await this.removeTakenSweepsFromOtherZones();\r\n this.updatedZone.emit(zoneCreated.id);\r\n });\r\n this.working = false;\r\n } catch (error) {\r\n console.error(error);\r\n this.working = false;\r\n }\r\n }\r\n }\r\n\r\n async setSweepsAndNodeForZoneInput(zoneInput: Zone) {\r\n if (this.chosenScansOnPlan.length > 0) {\r\n zoneInput.sweepIDs = this.chosenScansOnPlan;\r\n }\r\n if (zoneInput.sweepIDs && zoneInput.sweepIDs.length > 0) {\r\n const navForSweep =\r\n await this.navigationService.getNavigationsForMatterportIDForSpace(\r\n zoneInput.sweepIDs[0],\r\n this.spaceID,\r\n );\r\n zoneInput.nodeIDs = [navForSweep[0].nodeID];\r\n }\r\n }\r\n\r\n onCancel() {\r\n if (this.scansModified) {\r\n const message = this.translate.instant(\"confirm.cancelEditZone\");\r\n if (!window.confirm(message)) {\r\n return;\r\n }\r\n }\r\n this.commentForm = null;\r\n this.chosenScansOnPlan = [];\r\n this.updatedZone.emit(false);\r\n }\r\n\r\n togglePlan() {\r\n this.fromPlan = true;\r\n }\r\n\r\n onSelectedSweepsFromPlan(result: { \"sweeps\": string[]; \"startSweepID\": string; }) {\r\n if (result && result.sweeps) {\r\n this.chosenScansOnPlan = result.sweeps;\r\n this.scansModified = true;\r\n }\r\n this.fromPlan = false;\r\n }\r\n\r\n handleFileInput(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n this.fileToUpload = (target.files as FileList)[0];\r\n }\r\n\r\n async onUploadAudio() {\r\n this.working = true;\r\n const commentInput = this.commentForm.value;\r\n try {\r\n const newAudio = await this.commentService.createCommentWithFile(\r\n commentInput,\r\n this.fileToUpload,\r\n );\r\n this.audiosForSpace.push(newAudio);\r\n this.isAddingAudio = false;\r\n this.working = false;\r\n this.audioUploaded = true;\r\n } catch (e) {\r\n this.working = false;\r\n this.audioUploaded = false;\r\n console.log(e);\r\n }\r\n\r\n }\r\n\r\n async getAudios() {\r\n const attachments = await this.commentService.getCommentsBySpaceID(this.spaceID);\r\n if (attachments) {\r\n this.audiosForSpace = attachments.filter((attachment) => attachment.type === CommentType.AUDIO);\r\n }\r\n }\r\n\r\n onCancelAudioUpload() {\r\n this.commentForm = null;\r\n this.isAddingAudio = false;\r\n this.fileToUpload = null;\r\n }\r\n\r\n onChooseAudio(audio: Comment) {\r\n this.chosenAudio = audio;\r\n this.currentAudioZone = this.audioZones.find((zone) => zone.audioID === this.chosenAudio.id);\r\n if (this.currentAudioZone) {\r\n this.chosenScansOnPlan = this.currentAudioZone.sweepIDs;\r\n } else {\r\n this.chosenScansOnPlan = [];\r\n }\r\n }\r\n\r\n /**\r\n * Removes newly selected sweeps for current zone (they are in chosenScansOnPlan) from other audio zones. \r\n * Rule: one sweep = one audio.\r\n */\r\n async removeTakenSweepsFromOtherZones() {\r\n await Promise.all(this.audioZones.map(async (zone) => {\r\n if (zone.id !== this.currentAudioZone.id) {\r\n const newSweeps = zone.sweepIDs.filter((sweepID) => !this.chosenScansOnPlan.includes(sweepID));\r\n if (newSweeps.length !== zone.sweepIDs.length) {\r\n await this.zoneService.updateZone({ id: zone.id, sweepIDs: newSweeps });\r\n }\r\n }\r\n }));\r\n }\r\n\r\n /**\r\n * Delete audio as Comment, all its audio Zones and file from S3 (using lambda function)\r\n */\r\n async onDeleteAudio() {\r\n const message = this.translate.instant(\"confirm.deleteAudio\");\r\n if (window.confirm(message)) {\r\n await this.commentService.deleteComment(this.chosenAudio.id);\r\n const index = this.audiosForSpace.indexOf(this.chosenAudio);\r\n this.audiosForSpace.splice(index, 1);\r\n\r\n // delete all zones with this comment audio\r\n const audioZonesToDelete = this.zones.filter((z) => z.audioID === this.chosenAudio.id);\r\n await Promise.all(audioZonesToDelete.map(async (zone) => {\r\n await this.zoneService.deleteZone(zone.id);\r\n const indexZone = this.audioZones.indexOf(this.currentAudioZone);\r\n if (indexZone !== -1) {\r\n this.audioZones.slice(indexZone, 1);\r\n }\r\n }));\r\n this.currentAudioZone = null;\r\n this.chosenAudio = null;\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"main-container\">\r\n <div class=\"col-lg-6 col-md-6 col-sm-7\" *ngIf=\"isAddingAudio\">\r\n <form (ngSubmit)=\"onUploadAudio()\" [formGroup]=\"commentForm\">\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" required formControlName=\"title\">\r\n </div>\r\n </div>\r\n <div>\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\r\n {{'Choose File' | translate}}</label>\r\n <p *ngIf=\"fileToUpload\">{{ fileToUpload.name}}</p>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n \r\n <div class=\"mt-3\">\r\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || working\">{{'Upload' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancelAudioUpload()\" class=\"btn btn-outline-primary rounded-pill me-2\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <ngb-alert type=\"success\" [dismissible]=\"true\" *ngIf=\"!working && audioUploaded\" (closed)=\"audioUploaded=false\">\r\n {{ 'add-audio.success' | translate }} !\r\n </ngb-alert>\r\n <div class=\"col-7\" *ngIf=\"!isAddingAudio && audiosForSpace\">\r\n \r\n <div class=\"instruction-row\" >\r\n <p>1.</p>\r\n <div ngbDropdown class=\"d-inline-block\">\r\n <div>\r\n <button type=\"button\" class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\"\r\n ngbDropdownToggle>{{chosenAudio ?\r\n chosenAudio.title : ('choose-audio' | translate) }}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button type=\"button\" ngbDropdownItem *ngFor=\"let audio of audiosForSpace\" \r\n (click)=\"onChooseAudio(audio)\">{{ audio.title }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <p>{{'or' | translate}}</p>\r\n <button (click)=\"isAddingAudio=true\" class=\"btn btn-primary rounded-pill me-2\"> {{'add-audio.add' | translate}}</button>\r\n </div>\r\n <div class=\"instruction-row\">\r\n <p>2.</p>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"togglePlan()\" [disabled]=\"!chosenAudio\">\r\n {{'Choose scan points on plan' | translate}}</button>\r\n\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onDeleteAudio()\" [disabled]=\"!chosenAudio\">\r\n {{'Delete audio' | translate}}</button>\r\n \r\n </div>\r\n <div class=\"instruction-row\" *ngIf=\"chosenAudio\">\r\n <p>{{ chosenScansOnPlan.length }} {{'scans-chosen-audio' | translate}}</p>\r\n </div>\r\n\r\n <div class=\"mt-3\">\r\n <button class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || !this.chosenAudio\" (click)=\"onSubmit()\">{{'Save' | translate}}</button>\r\n <button (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </div>\r\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\r\n <lib-sweep-plan-selection style=\"width: 100%;\" [inputZone]=\"currentAudioZone\" [spaceID]=\"spaceID\" \r\n [occupiedSweeps]=\"occupiedSweeps\" [unavailableSweeps]=\"unavailableSweeps\" [editingAudioZone]=\"true\"\r\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\r\n </div>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { Zone, ZoneService } from '@smarterplan/ngx-smarterplan-core';\r\n\r\n@Pipe({\r\n name: 'countAudioSweeps'\r\n})\r\nexport class CountAudioSweepsPipe implements PipeTransform {\r\n constructor(private zoneService: ZoneService) { }\r\n\r\n async transform(zone: Zone): Promise<number> {\r\n let childrenAudioZones = await this.zoneService.getZonesByParentZone(zone.id);\r\n if (childrenAudioZones.length > 0) {\r\n childrenAudioZones = childrenAudioZones.filter((zone) => zone.audioID);\r\n if (childrenAudioZones.length > 0) {\r\n return childrenAudioZones.flatMap((z) => z.sweepIDs).length;\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n}\r\n","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport {\r\n MenuItem, ZoneService, SpaceService, VisitService,\r\n NavigationService, BaseUserService, PlanService, wait, Navigation, showScanPointsOnPlanInDiv, Plan, Space, Zone, SpModule, NavigatorService\r\n} from '@smarterplan/ngx-smarterplan-core';\r\nimport panzoom from \"panzoom\";\r\nimport { Subject, takeUntil } from 'rxjs';\r\n@Component({\r\n selector: 'lib-zones',\r\n templateUrl: './zones.component.html',\r\n styleUrls: ['./zones.component.scss']\r\n})\r\nexport class ZonesComponent implements OnInit {\r\n\r\n lotIndexDetails = -1;\r\n\r\n currentSpace: Space;\r\n\r\n @Output() updatedZone = new EventEmitter<boolean>();\r\n\r\n plans: Plan[];\r\n\r\n zoneForEdit: Zone;\r\n\r\n isEditingZone = false;\r\n\r\n captureDate: number;\r\n\r\n spaceID: string;\r\n\r\n navigations: string[];\r\n\r\n images360: any[];\r\n\r\n carouselIsVisible = false;\r\n\r\n planIsVisible = false;\r\n\r\n currentPlan: Plan;\r\n\r\n currentZone: Zone;\r\n\r\n loadingPlan = false;\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n isMuseumVisit = false;\r\n\r\n isMuseumModule = false;\r\n\r\n allZones: Zone[];\r\n\r\n floorZones: Zone[] = [];\r\n\r\n zonesMap: Map<string, Zone[]> = new Map();\r\n\r\n floorDetails: number = -1;\r\n\r\n defaultZone: Zone;\r\n\r\n defaultShowing = false;\r\n\r\n isAddingAudioTrack = false;\r\n\r\n parentZoneForAudio: Zone;\r\n\r\n destroy$ = new Subject();\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private zoneService: ZoneService,\r\n private spaceService: SpaceService,\r\n private visitService: VisitService,\r\n private navigationService: NavigationService,\r\n private userService: BaseUserService,\r\n private planService: PlanService,\r\n private translate: TranslateService,\r\n private navigatorService: NavigatorService,\r\n private router: Router,\r\n ) {\r\n // listen to the change of location via navigation bar dropdown\r\n this.navigatorService.locationIDChange\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((spaceID) => {\r\n this.router.navigate([\"dashboard/localisation\", spaceID, \"zones\"]).catch(e => console.log(e.message));\r\n });\r\n\r\n this.route.params.subscribe((params) => {\r\n this.spaceID = params.id;\r\n this.resetZones().catch(e => console.log(e.message));\r\n });\r\n }\r\n\r\n async ngOnInit() {\r\n this.isMuseumModule = this.userService.getSpModule() === SpModule.MUSEUM;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: \"Locations\", url: \"/localisation\" },\r\n {\r\n label: this.currentSpace.name,\r\n url: `/localisation/${this.spaceID}`,\r\n },\r\n {\r\n label: \"Zones\",\r\n url: `/localisation/${this.currentSpace.id}/zones`,\r\n },\r\n ];\r\n }\r\n\r\n onGoBack() {\r\n this.editCompleted(null);\r\n }\r\n\r\n ngOnChanges() {\r\n this.resetZones().catch(e => console.log(e.message));\r\n }\r\n\r\n async resetZones() {\r\n this.isMuseumVisit = false;\r\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\r\n this.setupMenuItems();\r\n\r\n this.allZones = await this.zoneService.getZonesBySpace(this.spaceID);\r\n this.defaultZone = this.allZones.find(\r\n (zone) => zone.layer && zone.layer.name === \"BUILDING\" && zone.sweepIDs,\r\n );\r\n\r\n this.floorZones = this.allZones.filter(\r\n (zone) => zone.layer && zone.layer.name === \"FLOOR\",\r\n );\r\n // sort alphabetically\r\n this.floorZones.sort((a, b) => a.name.localeCompare(b.name));\r\n // we add only children zones that are not Floors\r\n if (!!this.defaultZone) {\r\n this.zonesMap.set(this.defaultZone.id, this.allZones.filter((zone) => zone.parentID === this.defaultZone.id && !this.floorZones.includes(zone)));\r\n }\r\n for (const floor of this.floorZones) {\r\n const zonesForFloor = this.allZones.filter((zone) => zone.parentID === floor.id);\r\n this.zonesMap.set(\r\n floor.id,\r\n zonesForFloor.sort((a, b) => a.name.localeCompare(b.name)),\r\n );\r\n }\r\n this.resetNavigations();\r\n this.images360 = await this.visitService.loadImagesForSpace(\r\n this.currentSpace,\r\n );\r\n this.plans = await this.planService.getPlansWithZonesForSpace(\r\n this.spaceID,\r\n );\r\n this.plans = this.plans.filter((plan) => plan.isCurrentForZone);\r\n this.onPlansLoaded().catch(e => console.log(e.message));\r\n }\r\n\r\n resetNavigations() {\r\n this.navigations = [];\r\n const zonesWithSweeps = this.allZones.filter((zone) => zone.sweepIDs);\r\n this.navigations = [\r\n ...new Set(zonesWithSweeps.flatMap((zone) => zone.sweepIDs)),\r\n ];\r\n }\r\n\r\n async onPlansLoaded(): Promise<void> {\r\n if (this.planIsVisible && this.currentZone) {\r\n this.preparePlan().catch(e=>console.log(e.message));\r\n }\r\n }\r\n\r\n /**\r\n * onToggleDetail folds/unfolds details for a zone\r\n * @param index\r\n * @param zone\r\n */\r\n async onToggleDetail(index: number, zone: Zone) {\r\n this.lotIndexDetails = index === this.lotIndexDetails ? -1 : index;\r\n if (this.lotIndexDetails === -1) {\r\n this.currentZone = null;\r\n this.planIsVisible = false;\r\n return;\r\n }\r\n this.currentZone = zone;\r\n this.planIsVisible = true;\r\n if (!this.plans) {\r\n return; // wait until the plans are set\r\n }\r\n if (this.loadingPlan) {\r\n // another plan is already loading\r\n await wait(1000);\r\n }\r\n this.preparePlan().catch(e=>console.log(e.message));\r\n }\r\n\r\n onToggleDetailFloor(index: number, floor: Zone) {\r\n this.defaultShowing = false;\r\n this.floorDetails = index === this.floorDetails ? -1 : index;\r\n if (this.floorDetails === -1) {\r\n this.currentZone = null;\r\n this.planIsVisible = false;\r\n return;\r\n }\r\n this.currentZone = floor;\r\n this.planIsVisible = true;\r\n if (!this.plans) {\r\n console.log(\"plans not ready\");\r\n return; // wait until the plans are set\r\n }\r\n this.preparePlan().catch(e => console.log(e.message));\r\n }\r\n\r\n onToggleDefaultZone() {\r\n this.defaultShowing = !this.defaultShowing;\r\n this.currentZone = this.defaultShowing ? this.defaultZone : null;\r\n }\r\n\r\n async preparePlan() {\r\n this.loadingPlan = true;\r\n this.currentPlan = null;\r\n if (this.currentZone.virtual) {\r\n this.currentPlan = null;\r\n this.loadingPlan = false;\r\n return;\r\n }\r\n this.currentPlan = await this.planService.getCalibratedPlanForZone(\r\n this.currentZone,\r\n );\r\n if (this.currentPlan) {\r\n const scans = await this.navigationService.getNavigationsForZone(\r\n this.currentZone,\r\n );\r\n await this.showScanPointsOnPlan(scans);\r\n }\r\n this.loadingPlan = false;\r\n }\r\n\r\n toggleCarousel() {\r\n this.carouselIsVisible = true;\r\n }\r\n\r\n onEdit(zone: Zone) {\r\n this.zoneForEdit = zone;\r\n if (this.zoneForEdit.layer && this.zoneForEdit.layer.name === \"AUDIO\") {\r\n this.isAddingAudioTrack = true;\r\n } else {\r\n this.isEditingZone = true;\r\n }\r\n\r\n this.menuItems.push({\r\n label: `${zone.name}`,\r\n });\r\n }\r\n\r\n onAddLot() {\r\n this.isMuseumVisit = false;\r\n this.isEditingZone = true;\r\n this.menuItems.push({\r\n label: \"New\",\r\n });\r\n }\r\n\r\n onAddMuseumZone() {\r\n this.isMuseumVisit = true;\r\n this.isEditingZone = true;\r\n this.menuItems.push({\r\n label: \"New Museum Itinerary\",\r\n });\r\n }\r\n\r\n onAddAudioZone(parentZone: Zone) {\r\n this.parentZoneForAudio = parentZone;\r\n this.isAddingAudioTrack = true;\r\n this.menuItems.push({\r\n label: parentZone.name,\r\n });\r\n this.menuItems.push({\r\n label: \"add-audio.add\",\r\n });\r\n }\r\n\r\n async onDelete(zone: Zone) {\r\n const message = this.translate.instant(\"confirm.deleteZone\");\r\n // eslint-disable-next-line no-alert\r\n if (window.confirm(message)) {\r\n const childrenZones = await this.zoneService.getZonesByParentZone(zone.id);\r\n await Promise.all(childrenZones.map(async (childZone) => {\r\n await this.zoneService.deleteZone(childZone.id);\r\n this.allZones.splice(this.allZones.indexOf(childZone), 1);\r\n }));\r\n await this.zoneService.deleteZone(zone.id);\r\n this.allZones.splice(this.allZones.indexOf(zone), 1);\r\n // remove current zone from its parent list\r\n if (zone.parentID && Array.from(this.zonesMap.keys()).includes(zone.parentID)) {\r\n const zonesForParent = this.zonesMap.get(zone.parentID);\r\n zonesForParent.splice(zonesForParent.indexOf(zone), 1);\r\n this.zonesMap.set(zone.parentID, zonesForParent);\r\n }\r\n // we send update of location in order to force update of list of zones in nav bar\r\n this.navigatorService.locationIDChange.next(this.spaceID);\r\n }\r\n }\r\n\r\n editCompleted(event: any) {\r\n this.lotIndexDetails = -1;\r\n this.currentPlan = null;\r\n this.isEditingZone = false;\r\n this.isAddingAudioTrack = false;\r\n this.zoneForEdit = null;\r\n this.planIsVisible = false;\r\n this.carouselIsVisible = false;\r\n this.setupMenuItems();\r\n if (event) {\r\n this.resetZones().catch(e=> console.log(e.message));\r\n // we send update of location in order to force update of list of zones in nav bar\r\n this.navigatorService.locationIDChange.next(this.spaceID);\r\n }\r\n\r\n }\r\n\r\n async showScanPointsOnPlan(navigations: Navigation[]) {\r\n if (this.currentPlan) {\r\n const divPlan = document.querySelector(\"#planDiv\") as HTMLElement;\r\n await showScanPointsOnPlanInDiv(this.currentPlan, divPlan, navigations);\r\n panzoom(divPlan, {\r\n bounds: true,\r\n boundsPadding: 0,\r\n maxZoom: 3.5,\r\n });\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"container-fluid\" *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=\"row\" *ngIf=\"!isEditingZone && !isAddingAudioTrack\">\r\n <div class=\"col-md-6\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item default-zone-line-item\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\" *ngIf=\"defaultZone\">\r\n {{defaultZone.name}}\r\n <div class=\"default-zone-label\">{{ \"whole space\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"defaultShowing\" (click)=\"onToggleDefaultZone()\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"defaultShowing\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}:\r\n {{defaultZone.layer ? defaultZone.layer.name : \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"defaultZone.surface\">\r\n {{'Surface' | translate}}, m<sup>2</sup>: {{defaultZone.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!defaultZone.virtual\">{{'Scan Points' | translate}}:\r\n {{defaultZone.sweepIDs ? defaultZone.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n </ul>\r\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\r\n <div *ngIf=\"pair.key == defaultZone.id\">\r\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-flush list-group-item-action\"\r\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\r\n {{lot.name}}\r\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\"\r\n (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\r\n\r\n </div>\r\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\r\n translate}}: {{lot.layer ? lot.layer.name :\r\n \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">\r\n {{'Surface' | translate}},m<sup>2</sup>: {{lot.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\r\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\r\n {{'Zone not visible in 3D visit' | translate}}</li>\r\n </ul>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\r\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\r\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\r\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n\r\n <li class=\"list-group-item\" *ngFor=\"let floor of floorZones; index as index\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\r\n {{floor.name}}\r\n <!-- <small>({{ lot.metadata ? ('Calibrated' | translate) : ('Not calibrated' | translate)}})</small> -->\r\n <div class=\"museum-label\" *ngIf=\"floor.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"index==floorDetails\"\r\n (click)=\"onToggleDetailFloor(index, floor)\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"index==floorDetails\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}: {{floor.layer ?\r\n floor.layer.name :\r\n \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.surface\">{{'Surface' | translate}}, m<sup>2</sup>:\r\n {{floor.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!floor.virtual\">{{'Scan Points' | translate}}:\r\n {{floor.sweepIDs ? floor.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.virtual\">{{'Zone not visible in 3D visit' |\r\n translate}}</li>\r\n </ul>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onEdit(floor)\">{{'Edit' |\r\n translate}}</button>\r\n\r\n <!-- List of children zones -->\r\n\r\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\r\n <div *ngIf=\"pair.key == floor.id\">\r\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-flush list-group-item-action\"\r\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\r\n <div><span *ngIf=\"lot.code_ref\">{{lot.code_ref}}_</span>{{lot.name}}</div>\r\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\"\r\n (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\r\n\r\n </div>\r\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\r\n translate}}: {{lot.layer ? lot.layer.name :\r\n \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">{{'Surface' | translate}},\r\n m<sup>2</sup>:\r\n {{lot.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\r\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual && lot.isMuseumVisitZone\">\r\n {{'Scan Points with audio' | translate}}: {{ lot | countAudioSweeps | async}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\r\n {{'Zone not visible in 3D visit' | translate}}</li> dist\r\n </ul>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\r\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\r\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\r\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n\r\n <div>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddLot()\">{{'Add zone' |\r\n translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddMuseumZone()\" *ngIf=\"isMuseumModule\">\r\n {{'Add museum itinerary' | translate}}</button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"planIsVisible\">\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loadingPlan\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n <div class=\"row\" style=\"overflow: hidden; flex-direction: column;\">\r\n <div *ngIf=\"currentPlan\">\r\n <lib-plan-legend [isAudioZone]=\"false\"></lib-plan-legend>\r\n <div class=\"planContainer\">\r\n <div class=\"mt-3 ms-3\" style=\"height: 500px; width: 100%;\" id=\"planDiv\"></div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!currentPlan && plans && !loadingPlan && currentZone\">\r\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"!currentZone.virtual && !currentZone.isMultipleFloorZone\">\r\n {{ 'Plan is not calibrated' | translate}}\r\n </div>\r\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.virtual\">\r\n {{ 'No scan points chosen' | translate}}\r\n </div>\r\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.isMultipleFloorZone\">\r\n {{ 'The zone is on several floors' | translate}}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"isEditingZone\">\r\n <lib-add-zone [zoneEdit]=\"zoneForEdit\" [spaceID]=\"spaceID\" [images360]=\"images360\" [navigationIDs]=\"navigations\"\r\n [zones]=\"allZones\" [defaultZone]=\"defaultZone\" (updatedZone)=\"editCompleted($event)\"\r\n [isMuseumVisit]=\"isMuseumVisit\"></lib-add-zone>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"isAddingAudioTrack\">\r\n <lib-add-audio-zone [spaceID]=\"spaceID\" [defaultZone]=\"defaultZone\" [parentZone]=\"parentZoneForAudio\"\r\n [zones]=\"allZones\" [currentAudioZone]=\"zoneForEdit\" (updatedZone)=\"editCompleted($event)\"></lib-add-audio-zone>\r\n </div>\r\n</div>","import { Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Space, Visit, MenuItem, SpaceService, VisitService, NodeService, InventoryStatus, NavigatorService } from '@smarterplan/ngx-smarterplan-core';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-images',\r\n templateUrl: './images.component.html',\r\n styleUrls: ['./images.component.scss']\r\n})\r\nexport class ImagesComponent implements OnInit {\r\n\r\n images: Array<any>;\r\n\r\n spaceID: string;\r\n\r\n currentSpace: Space;\r\n\r\n currentVisit: Visit;\r\n\r\n currentImages: Array<any>;\r\n\r\n loading = false;\r\n\r\n currentScanID: string;\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n destroy$ = new Subject();\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private spaceService: SpaceService,\r\n private visitService: VisitService,\r\n private nodeService: NodeService,\r\n private navigatorService: NavigatorService,\r\n private router: Router,\r\n ) {\r\n this.navigatorService.locationIDChange\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((spaceID) => {\r\n this.router.navigate([\"dashboard/localisation\", spaceID, \"images\"]);\r\n });\r\n\r\n this.route.params.subscribe((params) => {\r\n this.spaceID = params.id;;\r\n this.loadImages();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: \"Locations\", url: \"/localisation\" },\r\n {\r\n label: this.currentSpace.name,\r\n url: `/localisation/${this.spaceID}`,\r\n },\r\n { label: \"360° Images\" },\r\n ];\r\n\r\n if (this.currentVisit) {\r\n this.menuItems.push({ label: this.currentVisit.name });\r\n }\r\n }\r\n\r\n onGoBack() {\r\n this.currentVisit = null;\r\n this.currentImages = null;\r\n this.setupMenuItems();\r\n }\r\n\r\n async loadImages() {\r\n this.loading = true;\r\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\r\n this.setupMenuItems();\r\n this.images = await this.visitService.loadImagesForSpace(\r\n this.currentSpace,\r\n );\r\n if (this.currentSpace.visits.length === 1) {\r\n this.setVisit(this.currentSpace.visits[0]);\r\n }\r\n this.loading = false;\r\n }\r\n\r\n setVisit(visit) {\r\n this.currentVisit = visit;\r\n this.currentImages = this.images.filter((im) => {\r\n return im.visit === visit;\r\n });\r\n this.setupMenuItems();\r\n }\r\n\r\n setCurrentScan(id) {\r\n this.currentScanID = id;\r\n }\r\n\r\n async onInventoryClick() {\r\n const { node } = this.currentVisit;\r\n const { filename } = this.currentImages[this.currentScanID]; // 110ee452_sweep.jpeg\r\n // check if node has already errors of inventory\r\n const missingFilesErrors = [\r\n InventoryStatus.ERROR_FILE_JSON_NOT_EXIST,\r\n InventoryStatus.ERROR_FILE_MODEL_NOT_EXIST,\r\n InventoryStatus.ERROR_FILE_OBJ_NOT_EXIST,\r\n ];\r\n if (\r\n node.inventoryStatus &&\r\n missingFilesErrors.includes(node.inventoryStatus)\r\n ) {\r\n alert(\r\n \"Files missing for this visit's inventory. Contact your administrator.\",\r\n );\r\n } else {\r\n await this.nodeService.updateNode({\r\n id: node.id,\r\n inventoryStatus: InventoryStatus.TO_RUN_ONE_IMAGE,\r\n navigationForInventory: filename.split(\"_\")[0],\r\n });\r\n alert(\r\n \"Automatic AI Inventory started! Detected equipments will appear soon in the visit.\",\r\n );\r\n }\r\n }\r\n\r\n}\r\n","<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>","import { Component, HostListener, NgZone, OnInit, ViewChild } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { getDocument, PDFDocumentProxy } from \"pdfjs-dist\";\r\n// import { PDFDocumentProxy } from \"ng2-pdf-viewer\";\r\nimport { Zone, Plan, Space, MenuItem, PlanService, ZoneService, VisitService, SpaceService, sortAlphabeticallyOnName, downloadFileAsObject } from '@smarterplan/ngx-smarterplan-core';\r\n\r\n@Component({\r\n selector: 'lib-edit-plan',\r\n templateUrl: './edit-plan.component.html',\r\n styleUrls: ['./edit-plan.component.scss']\r\n})\r\nexport class EditPlanComponent implements OnInit {\r\n\r\n @ViewChild(\"dialog\") dialog!: any;\r\n\r\n @ViewChild(\"dialogZone\") dialogZone!: any;\r\n\r\n @ViewChild(\"preparing\") loadingModal: any;\r\n\r\n spaceID: string;\r\n\r\n chosenPlan: Plan;\r\n\r\n editedPlan: Plan;\r\n\r\n loading: boolean = false;\r\n\r\n svgEditor;\r\n\r\n svgEditorIframe;\r\n\r\n navigations: string[];\r\n\r\n zones: Zone[];\r\n\r\n isNewZone: boolean = false;\r\n\r\n newZoneData;\r\n\r\n editorUrl;\r\n\r\n editedZone: Zone;\r\n\r\n images360;\r\n\r\n\r\n /**\r\n * Options for svgEditor\r\n */\r\n private config: any = {\r\n noStorageOnLoad: true,\r\n forceStorage: true,\r\n // imgPath: \"/assets/editor/images/\",\r\n // extPath: \"/assets/editor/extensions/\",\r\n // langPath: \"/assets/editor/locale/\",\r\n // canvgPath: \"/assets/editor/canvg/\",\r\n // jspdfPath: \"/assets/editor/jspdf/\",\r\n // jGraduatePath: \"/assets/editor/jgraduate/images/\",\r\n // extIconsPath: \"/assets/editor/extensions/\",\r\n // stylesheets: [\r\n // \"/assets/editor/jgraduate/css/jGraduate.css\",\r\n // \"/assets/editor/spinbtn/jQuery.SpinButton.css\",\r\n // \"/assets/editor/jgraduate/css/jPicker.css\",\r\n // \"/assets/editor/svg-editor.css\",\r\n // ],\r\n dimensions: [10000, 10000],\r\n showlayers: true,\r\n noDefaultExtensions: true,\r\n basePath: \"/assets/editor/\",\r\n customExportImage: true,\r\n extensions: [\r\n \"ext-connector\",\r\n // \"ext-eyedropper\",\r\n // \"ext-grid\",\r\n // \"ext-markers\",\r\n // \"ext-overview_window\",\r\n // \"ext-spi-library\",\r\n // \"ext-spi-icon\",\r\n \"ext-sp-zone\",\r\n // \"ext-arrows\",\r\n // \"ext-sp-css\",\r\n // \"ext-placemark\",\r\n ],\r\n };\r\n\r\n currentSpace: Space;\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n constructor(\r\n private planService: PlanService,\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private modalService: NgbModal,\r\n private zoneService: ZoneService,\r\n private visitService: VisitService,\r\n private spaceService: SpaceService,\r\n private translate: TranslateService,\r\n private ngZone: NgZone,\r\n ) {\r\n this.chosenPlan = this.planService.getChosenPlan();\r\n }\r\n\r\n async ngOnInit() {\r\n this.editorUrl = \"/assets/editor/main.html\";\r\n this.spaceID = this.route.snapshot.queryParams.spaceID;\r\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\r\n this.setupMenuItems();\r\n if (this.spaceID && !this.planService.getChosenPlan()) {\r\n this.router.navigate([\r\n \"/dashboard/localisation\",\r\n this.spaceID,\r\n \"plans\",\r\n ]);\r\n } else if (!this.spaceID && !this.planService.getChosenPlan()) {\r\n this.router.navigate([\"/dashboard/localisation\"]);\r\n }\r\n }\r\n\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: \"Locations\", url: \"/localisation\" },\r\n {\r\n label: this.currentSpace.name,\r\n url: `/localisation/${this.spaceID}`,\r\n },\r\n {\r\n label: \"Plans\",\r\n url: `/localisation/${this.currentSpace.id}/plans`,\r\n },\r\n {\r\n label: \"Edit\",\r\n url: `/localisation/${this.currentSpace.id}/plan-edit?spaceID=${this.currentSpace.id}`,\r\n },\r\n ];\r\n }\r\n\r\n @HostListener(\"window:message\", [\"$event\"])\r\n async switchAction(event) {\r\n if (event.origin === window.location.origin) {\r\n switch (event.data.message) {\r\n case \"save\":\r\n this.onSave(event.data.redirect);\r\n break;\r\n case \"close\":\r\n this.onCancel();\r\n break;\r\n case \"new-zone\":\r\n const modalReference = this.modalService.open(\r\n this.loadingModal,\r\n );\r\n const svg = unescape(\r\n encodeURIComponent(\r\n this.svgEditor.svgCanvas.getSvgString(),\r\n ),\r\n );\r\n\r\n const base64 = `data:image/svg+xml;base64,${window.btoa(\r\n svg,\r\n )}`;\r\n const currentSpace = await this.spaceService.getSpace(\r\n this.spaceID,\r\n );\r\n\r\n this.images360 = await this.visitService.loadImagesForSpace(\r\n currentSpace,\r\n );\r\n\r\n this.editedPlan = { ...this.chosenPlan };\r\n this.editedPlan.filepath = base64;\r\n this.newZoneData = event.data.zoneData;\r\n if (this.newZoneData.elements.length === 0) {\r\n modalReference.close();\r\n alert(this.translate.instant(\"edition.no-zone\"));\r\n break;\r\n }\r\n this.zones = await this.zoneService.getZonesBySpace(\r\n this.spaceID,\r\n );\r\n // this.zones = sortAlphabeticallyOnName(this.zones);\r\n // console.log(\"zones\", this.zones);\r\n // this.editedZone = this.zones.find(\r\n // (z) => z.name === this.newZoneData.name,\r\n // );\r\n this.resetNavigations();\r\n modalReference.close();\r\n this.modalService.open(this.dialogZone);\r\n\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n\r\n async resetNavigations() {\r\n this.navigations = [];\r\n const defaultZone = this.zones.find((zone) => !zone.parentID);\r\n if (defaultZone.sweepIDs.length > 0) {\r\n this.navigations = defaultZone.sweepIDs;\r\n }\r\n }\r\n\r\n async onLoad(svgEditor) {\r\n if (svgEditor.contentWindow.SvgEditor) {\r\n this.svgEditorIframe = svgEditor;\r\n this.svgEditor = new svgEditor.contentWindow.SvgEditor();\r\n\r\n await this.svgEditor.init();\r\n await this.svgEditor.setConfig(this.config, {\r\n allowInitialUserOverride: true,\r\n });\r\n\r\n if (this.chosenPlan && this.chosenPlan.extension === \"svg\") {\r\n this.loadSvg();\r\n }\r\n if (this.chosenPlan && this.chosenPlan.extension === \"pdf\") {\r\n this.loadPdf();\r\n }\r\n if (!this.chosenPlan.calibration || !this.chosenPlan.isModified) {\r\n setTimeout(() => {\r\n this.svgEditorIframe.contentWindow.postMessage(\r\n { action: \"disable-zone\" },\r\n \"*\",\r\n );\r\n }, 1000);\r\n }\r\n\r\n this.svgEditor.svgCanvas.setMode('ext-panning');\r\n this.svgEditor.bottomPanel.changeZoom(50)\r\n }\r\n }\r\n\r\n async onSave(redirect: boolean) {\r\n const imgBlob = await new Blob(\r\n [this.svgEditor.svgCanvas.getSvgString()],\r\n {\r\n type: \"image/svg+xml\",\r\n },\r\n );\r\n const [name] = this.chosenPlan.name.split(\".\");\r\n const imgFile: File = new File([imgBlob], `${name}-edited.svg`, {\r\n type: \"image/svg+xml\",\r\n lastModified: Date.now(),\r\n });\r\n this.planService.setPlanFileCache(imgFile);\r\n if (this.chosenPlan.isModified) {\r\n this.ngZone.run(() =>\r\n this.modalService.open(this.dialog));\r\n } else {\r\n this.ngZone.run(() =>\r\n this.router.navigate([\r\n \"/dashboard/localisation\",\r\n this.spaceID,\r\n \"plans\",\r\n ]));\r\n }\r\n }\r\n\r\n async updateSvg() {\r\n const newUrl = await this.planService.updatePlanFile();\r\n await this.planService.updatePlan({\r\n id: this.chosenPlan.id,\r\n annexe: newUrl,\r\n });\r\n this.planService.setPlanFileCache(null);\r\n this.ngZone.run(() =>\r\n this.router.navigate([\r\n \"/dashboard/localisation\",\r\n this.spaceID,\r\n \"plans\",\r\n ]));\r\n }\r\n\r\n async newSvg() {\r\n this.ngZone.run(() =>\r\n this.router.navigate([\r\n \"/dashboard/localisation\",\r\n this.spaceID,\r\n \"plans\",\r\n ]));\r\n }\r\n\r\n async onCancel() {\r\n if (window.confirm(this.translate.instant(\"edition.cancel-alert\"))) {\r\n this.ngZone.run(() =>\r\n this.router.navigate([\r\n \"/dashboard/localisation\",\r\n this.spaceID,\r\n \"plans\",\r\n ]));\r\n alert(this.translate.instant(\"edition.cancel\"));\r\n }\r\n }\r\n\r\n async loadSvg() {\r\n const svgRequest: any = await downloadFileAsObject(\r\n this.chosenPlan.annexe,\r\n );\r\n if (svgRequest) {\r\n const svgBlob = await svgRequest.Body;\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n this.svgEditor.loadFromDataURI(reader.result);\r\n };\r\n reader.readAsDataURL(svgBlob);\r\n }\r\n }\r\n\r\n async loadPdf() {\r\n this.svgEditorIframe.contentWindow.postMessage(\r\n { action: \"disable-zone\" },\r\n \"*\",\r\n );\r\n const canvas = document.querySelector(\r\n \"#canvas4pdf\",\r\n ) as HTMLCanvasElement;\r\n const context = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\r\n\r\n const pdfjs = await import(\"pdfjs-dist/build/pdf\");\r\n const pdfjsWorker = await import(\"pdfjs-dist/build/pdf.worker.entry\");\r\n\r\n pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;\r\n\r\n const pdf: PDFDocumentProxy = await getDocument(\r\n this.chosenPlan.filepath,\r\n ).promise;\r\n const page = await pdf.getPage(1);\r\n\r\n const viewPortParameters = { scale: 1.5 };\r\n const viewport = page.getViewport(viewPortParameters);\r\n this.svgEditor.svgCanvas.setResolution(viewport.width, viewport.height);\r\n\r\n canvas.height = viewport.height;\r\n canvas.width = viewport.width;\r\n const renderContext = {\r\n canvasContext: context,\r\n viewport,\r\n };\r\n const renderTask = page.render(renderContext).promise;\r\n renderTask.then(() => {\r\n const newImage = this.svgEditor.svgCanvas.addSVGElementFromJson({\r\n element: \"image\",\r\n attr: {\r\n x: 0,\r\n y: 0,\r\n width: viewport.width,\r\n height: viewport.height,\r\n id: this.svgEditor.svgCanvas.getNextId(),\r\n style: \"pointer-events:inherit\",\r\n },\r\n });\r\n this.svgEditor.svgCanvas.setHref(\r\n newImage,\r\n canvas.toDataURL(\"image/png\"),\r\n );\r\n\r\n this.svgEditor.svgCanvas.renameCurrentLayer(this.translate.instant(\"edition.plan-base\"));\r\n this.svgEditor.svgCanvas.createLayer(this.translate.instant(\"edition.personalization\"));\r\n });\r\n }\r\n\r\n async onLoadImg(img: any) {\r\n this.svgEditorIframe.contentWindow.postMessage(\r\n { action: \"disable-zone\" },\r\n \"*\",\r\n );\r\n const imgRequest: any = await downloadFileAsObject(\r\n this.chosenPlan.annexe,\r\n );\r\n if (imgRequest) {\r\n const imgBlob = await imgRequest.Body;\r\n const imgWidth = img.naturalWidth;\r\n const imgHeight = img.naturalHeight;\r\n // await this.svgEditor.setConfig({\r\n // dimensions: [imgWidth, imgHeight],\r\n // });\r\n this.svgEditor.svgCanvas.setResolution(imgWidth, imgHeight);\r\n\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n const newImage = this.svgEditor.svgCanvas.addSVGElementFromJson(\r\n {\r\n element: \"image\",\r\n attr: {\r\n x: 0,\r\n y: 0,\r\n width: imgWidth,\r\n height: imgHeight,\r\n id: this.svgEditor.svgCanvas.getNextId(),\r\n style: \"pointer-events:inherit\",\r\n },\r\n },\r\n );\r\n this.svgEditor.svgCanvas.setHref(newImage, reader.result);\r\n this.svgEditor.svgCanvas.renameCurrentLayer(this.translate.instant(\"edition.plan-base\"));\r\n this.svgEditor.svgCanvas.createLayer(this.translate.instant(\"edition.personalization\"));\r\n };\r\n reader.readAsDataURL(imgBlob);\r\n }\r\n }\r\n\r\n onNewZone(event) {\r\n this.isNewZone = false;\r\n if (event) {\r\n this.svgEditorIframe.contentWindow.postMessage(\r\n { action: \"rename-layer\", name: event },\r\n \"*\",\r\n );\r\n } else {\r\n this.svgEditorIframe.contentWindow.postMessage(\r\n { action: \"cancel-layer\" },\r\n \"*\",\r\n );\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"row mt-3\">\r\n <div class=\"col\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems'></lib-tab-navigation>\r\n </div>\r\n </div>\r\n</div>\r\n<lib-add-zone *ngIf=\"isNewZone\" [images360]=\"images360\" [spaceID]=\"spaceID\" [navigationIDs]=\"navigations\"\r\n [zoneEdit]=\"editedZone\" [zones]=\"zones\" (updatedZone)=\"onNewZone($event)\" [chosenPlan]=\"editedPlan\"\r\n [newZoneDataFromEditor]=\"newZoneData\"></lib-add-zone>\r\n<iframe *ngIf=\"editorUrl\" #svgEditor [src]=\"editorUrl | safeUrl\" frameborder=\"0\"\r\n style=\"height:100%;width:100%;min-height:550px;max-height:750px\" (load)=\"onLoad(svgEditor)\"></iframe>\r\n<!-- chosenPlan && -->\r\n<!-- ./../../../../../../assets/svgeditor/index.html -->\r\n\r\n<img #imgPng *ngIf=\"chosenPlan && chosenPlan.extension !== 'svg' && svgEditor\" [src]=\"chosenPlan.filepath\"\r\n (load)=\"onLoadImg(imgPng)\" style=\"display: none;\">\r\n\r\n<canvas id=\"canvas4pdf\" style=\"display: none;\"></canvas>\r\n\r\n<ng-template #dialog let-modal>\r\n\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n {{'save plan edited' | translate}}\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"newSvg();modal.close('Close click')\">{{'Yes' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"updateSvg();modal.close('Close click')\">{{'No' |\r\n translate}}</button>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #dialogZone let-modal>\r\n\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n {{'confirm.new-zone-from-plan' | translate}}\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-outline-dark\"\r\n (click)=\"isNewZone = true;modal.close('Close click')\">{{'Validate' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"modal.close('Close click')\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #preparing let-modal>\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">{{'Processing' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-template>","import { NgModule } from \"@angular/core\";\r\nimport { Routes, RouterModule } from \"@angular/router\";\r\nimport { CalibrationComponent } from \"./components/plans/calibration/calibration.component\";\r\nimport { DetailLocationComponent } from \"./components/detail-location/detail-location.component\";\r\nimport { EditPlanComponent } from \"./components/plans/edit-plan/edit-plan.component\";\r\nimport { ImagesComponent } from \"./components/images/images.component\";\r\nimport { LocationsComponent } from \"./components/locations/locations.component\";\r\nimport { PlansComponent } from \"./components/plans/plans.component\";\r\nimport { VisitsComponent } from \"./components/visits/visits.component\";\r\nimport { ZonesComponent } from \"./components/zones/zones.component\";\r\n\r\nconst routes: Routes = [\r\n {\r\n path: \"\",\r\n component: LocationsComponent,\r\n },\r\n {\r\n path: \":id\",\r\n children: [\r\n { path: \"\", component: DetailLocationComponent },\r\n { path: \"zones\", component: ZonesComponent },\r\n { path: \"visits\", component: VisitsComponent },\r\n { path: \"plans\", component: PlansComponent },\r\n {\r\n path: \"plan-calibration\",\r\n component: CalibrationComponent,\r\n },\r\n {\r\n path: \"plan-edit\",\r\n component: EditPlanComponent,\r\n },\r\n { path: \"images\", component: ImagesComponent },\r\n ],\r\n },\r\n ];\r\n \r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule],\r\n})\r\nexport class LocationsRoutingModule { }","import { NgModule } from '@angular/core';\r\nimport { LocationsComponent } from './components/locations/locations.component';\r\nimport { DetailLocationComponent } from './components/detail-location/detail-location.component';\r\nimport { CalibrationComponent } from './components/plans/calibration/calibration.component';\r\nimport { PlansComponent } from './components/plans/plans.component';\r\nimport { VisitsComponent } from './components/visits/visits.component';\r\nimport { ZonesComponent } from './components/zones/zones.component';\r\nimport { ImagesComponent } from './components/images/images.component';\r\nimport { EditPlanComponent } from './components/plans/edit-plan/edit-plan.component';\r\nimport { LocationsRoutingModule } from './ngx-smarterplan-location-routing.module';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TabNavigationComponent } from './components/tab-navigation/tab-navigation.component';\r\nimport { MapComponent } from './components/locations/map/map.component';\r\nimport { LeafletModule } from '@asymmetrik/ngx-leaflet';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { MapPopupComponent } from './components/locations/map/map-popup/map-popup.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormLocationComponent } from './components/form-location/form-location.component';\r\nimport { NgbAlertModule, NgbModule } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { ClipboardModule } from \"@angular/cdk/clipboard\";\r\nimport { ChevronComponent } from './components/chevron/chevron.component';\r\nimport { AddZoneComponent } from './components/zones/add-zone/add-zone.component';\r\nimport { SelectionComponent } from './components/zones/add-zone/selection/selection.component';\r\nimport { CarouselComponent } from './components/carousel/carousel.component';\r\nimport { NgxSmarterplanCoreModule } from '@smarterplan/ngx-smarterplan-core';\r\nimport { PdfViewerModule } from 'ng2-pdf-viewer';\r\nimport { SweepPlanSelectionComponent } from './components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component';\r\nimport { AddAudioZoneComponent } from './components/zones/add-audio-zone/add-audio-zone.component';\r\nimport { RadioButtonComponent } from './radio-button/radio-button.component';\r\nimport { PlanLegendComponent } from './components/plan-legend/plan-legend.component';\r\nimport { CountAudioSweepsPipe } from './pipes/count-audio-sweeps.pipe';\r\n\r\n@NgModule({\r\n declarations: [\r\n LocationsComponent,\r\n DetailLocationComponent,\r\n CalibrationComponent,\r\n PlansComponent,\r\n VisitsComponent,\r\n ZonesComponent,\r\n ImagesComponent,\r\n EditPlanComponent,\r\n TabNavigationComponent,\r\n MapComponent,\r\n MapPopupComponent,\r\n FormLocationComponent,\r\n ChevronComponent,\r\n AddZoneComponent,\r\n SelectionComponent,\r\n CarouselComponent,\r\n SweepPlanSelectionComponent,\r\n AddAudioZoneComponent,\r\n RadioButtonComponent,\r\n PlanLegendComponent,\r\n CountAudioSweepsPipe,\r\n ],\r\n imports: [\r\n PdfViewerModule,\r\n ClipboardModule,\r\n NgbModule,\r\n NgbAlertModule,\r\n CommonModule,\r\n TranslateModule.forChild({\r\n extend: true\r\n }),\r\n LeafletModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n NgxSmarterplanCoreModule,\r\n LocationsRoutingModule,\r\n ],\r\n exports: [MapComponent, TabNavigationComponent]\r\n})\r\nexport class NgxSmarterplanLocationsModule { }\r\n","/*\r\n * Public API Surface of ngx-smarterplan-locations\r\n */\r\n\r\nexport * from './lib/ngx-smarterplan-locations.service';\r\nexport * from './lib/ngx-smarterplan-locations.module';\r\n\r\n// Components\r\n\r\nexport * from './lib/components/locations/map/map.component';\r\nexport * from './lib/components/tab-navigation/tab-navigation.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1","i3","i5","i5.TabNavigationComponent","i6.MapComponent","i7.FormLocationComponent","i8","i4","i6","i7","i8.TabNavigationComponent","i9.FormLocationComponent","i7.TabNavigationComponent","i8.ChevronComponent","i5.SelectionComponent","i6.RadioButtonComponent","i7.PlanLegendComponent","i4.CarouselComponent","i5.SweepPlanSelectionComponent","i6.SweepPlanSelectionComponent","i6.ChevronComponent","i7.AddZoneComponent","i8.AddAudioZoneComponent","i9.PlanLegendComponent","i10.CountAudioSweepsPipe","i6.CarouselComponent","i6.TabNavigationComponent"],"mappings":"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"}
1
+ {"version":3,"file":"smarterplan-ngx-smarterplan-locations.mjs","sources":["../../../projects/ngx-smarterplan-locations/src/lib/ngx-smarterplan-locations.service.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/tab-navigation/tab-navigation.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/tab-navigation/tab-navigation.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/map/map-popup/map-popup.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/map/map-popup/map-popup.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/map/map.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/map/map.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/form-location/form-location.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/form-location/form-location.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/locations.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/locations.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/detail-location/detail-location.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/detail-location/detail-location.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/calibration/calibration.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/calibration/calibration.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/plans.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/plans.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/chevron/chevron.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/chevron/chevron.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/visits/visits.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/visits/visits.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/carousel/carousel.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/carousel/carousel.component.html","../../../projects/ngx-smarterplan-locations/src/lib/helper.service.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/selection/selection.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/selection/selection.component.html","../../../projects/ngx-smarterplan-locations/src/lib/radio-button/radio-button.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/radio-button/radio-button.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/plan-legend/plan-legend.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/plan-legend/plan-legend.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/add-zone.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/add-zone.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-audio-zone/add-audio-zone.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-audio-zone/add-audio-zone.component.html","../../../projects/ngx-smarterplan-locations/src/lib/pipes/count-audio-sweeps.pipe.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/zones.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/zones.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/images/images.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/images/images.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/edit-plan/edit-plan.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/edit-plan/edit-plan.component.html","../../../projects/ngx-smarterplan-locations/src/lib/ngx-smarterplan-location-routing.module.ts","../../../projects/ngx-smarterplan-locations/src/lib/ngx-smarterplan-locations.module.ts","../../../projects/ngx-smarterplan-locations/src/public-api.ts","../../../projects/ngx-smarterplan-locations/src/smarterplan-ngx-smarterplan-locations.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NgxSmarterplanLocationsService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { MenuItem } from '@smarterplan/ngx-smarterplan-core';\r\n\r\n@Component({\r\n selector: 'lib-tab-navigation',\r\n templateUrl: './tab-navigation.component.html',\r\n styleUrls: ['./tab-navigation.component.scss']\r\n})\r\nexport class TabNavigationComponent {\r\n\r\n @Output() onGoBack = new EventEmitter<void>();\r\n\r\n @Input() menuItems: MenuItem[] = [];\r\n\r\n constructor(private router: Router) { }\r\n\r\n onClick(url: string, parameter: any, index: number) {\r\n if (index === this.menuItems.length - 1) {\r\n return;\r\n }\r\n if (url) {\r\n const newURL = `/dashboard${url}`;\r\n if (this.router.url !== newURL) {\r\n console.log('new url', newURL);\r\n this.router.navigate([newURL]);\r\n } else {\r\n this.onGoBack.emit(parameter);\r\n }\r\n } else {\r\n this.onGoBack.emit(parameter);\r\n }\r\n }\r\n\r\n}\r\n","<span class=\"menu\">\r\n <span *ngFor=\"let item of menuItems; let index = index;\">\r\n <span class=\"item\" [ngClass]=\"{'current':index === menuItems.length - 1}\"\r\n (click)=\"onClick(item.url,item.back, index)\">{{item.label | translate}}</span> <span\r\n *ngIf=\"index !== menuItems.length - 1\" class=\"separator\">></span>\r\n </span>\r\n</span>\r\n","import { Component, NgZone, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { Marker } from 'leaflet';\r\nimport { Space, Visit } from '@smarterplan/ngx-smarterplan-core';\r\n\r\n@Component({\r\n selector: 'lib-map-popup',\r\n templateUrl: './map-popup.component.html',\r\n styleUrls: ['./map-popup.component.scss']\r\n})\r\nexport class MapPopupComponent implements OnInit {\r\n\r\n space: Space;\r\n\r\n marker: Marker;\r\n\r\n popuparea: HTMLElement;\r\n\r\n isOnPopup = false;\r\n\r\n isMuseumUser = true;\r\n\r\n constructor(private router: Router, private ngZone: NgZone) { }\r\n\r\n ngOnInit() {\r\n this.marker.on(\"click\", () => this.onClickVisitFirst());\r\n\r\n this.marker.on(\"mouseover\", () => {\r\n this.isOnPopup = true;\r\n if (!this.marker.isPopupOpen()) {\r\n this.openPopup();\r\n }\r\n });\r\n }\r\n\r\n openPopup() {\r\n this.marker.openPopup();\r\n\r\n this.isOnPopup = false;\r\n this.popuparea = document.querySelector(\".leaflet-popup\");\r\n\r\n this.popuparea.addEventListener(\"mouseleave\", () => {\r\n this.closePopup();\r\n });\r\n this.popuparea.addEventListener(\"mouseover\", () => {\r\n this.isOnPopup = true;\r\n });\r\n this.marker.on(\"mouseout\", () => {\r\n this.closePopup();\r\n });\r\n }\r\n\r\n closePopup() {\r\n this.isOnPopup = false;\r\n /** We want to wait to avoid glitch */\r\n setTimeout(() => {\r\n if (!this.isOnPopup) {\r\n this.marker.closePopup();\r\n }\r\n }, 100);\r\n }\r\n\r\n onClickVisitFirst() {\r\n if (this.space.visits.length === 0) {\r\n console.log(\"No space to visit !\");\r\n } else {\r\n this.onVisitClick(this.space.visits[0]);\r\n }\r\n }\r\n\r\n async onVisitClick(visit: Visit) {\r\n this.ngZone.run(() => {\r\n this.router.navigate([\"visit\", this.space.id], {\r\n queryParams: { model3D: visit.model3d },\r\n });\r\n });\r\n }\r\n\r\n}\r\n","<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'\">➤ {{ visit.name ? visit.name : space.name}}</span>\r\n </div>\r\n</div>\r\n","import { Component, Injector, Input, NgZone, OnChanges, SimpleChanges, ViewContainerRef } from '@angular/core';\r\nimport { Space } from '@smarterplan/ngx-smarterplan-core';\r\nimport {\r\n latLng,\r\n marker,\r\n tileLayer,\r\n Map,\r\n latLngBounds,\r\n point,\r\n Marker,\r\n icon,\r\n} from \"leaflet\";\r\nimport { MapPopupComponent } from './map-popup/map-popup.component';\r\nimport { Router } from '@angular/router';\r\n\r\n\r\nconst iconRetinaUrl = \"assets/marker-icon-2x.png\";\r\nconst iconUrl = \"assets/marker-icon.png\";\r\nconst shadowUrl = \"assets/marker-shadow.png\";\r\nconst iconDefault = icon({\r\n iconRetinaUrl,\r\n iconUrl,\r\n shadowUrl,\r\n iconSize: [25, 41],\r\n iconAnchor: [12, 41],\r\n popupAnchor: [1, -34],\r\n tooltipAnchor: [16, -28],\r\n shadowSize: [41, 41],\r\n});\r\nMarker.prototype.options.icon = iconDefault;\r\n@Component({\r\n selector: 'lib-map',\r\n templateUrl: './map.component.html',\r\n styleUrls: ['./map.component.scss']\r\n})\r\nexport class MapComponent implements OnChanges {\r\n\r\n constructor(private viewContainerRef: ViewContainerRef) { }\r\n\r\n @Input() spaces: Space[];\r\n\r\n options = {\r\n layers: [\r\n tileLayer(\"http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\", {\r\n maxZoom: 18,\r\n attribution: \"...\",\r\n }),\r\n ],\r\n zoom: 5.5,\r\n center: latLng(47.06394, 2.77736),\r\n };\r\n\r\n layers: any[] = [];\r\n\r\n map: any;\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes.spaces) {\r\n const nm = [];\r\n const bd = [];\r\n if (!changes.spaces.currentValue) {\r\n return;\r\n }\r\n // Filtering out spaces without lat/longitudes\r\n for (const s of changes.spaces.currentValue as Space[]) {\r\n if (s.latitude === null || s.longitude === null) {\r\n console.log(\r\n `${s.name} has not coordinates for ${s.addresses}`,\r\n );\r\n continue;\r\n }\r\n // We use the popup system from leaflet, as it packs a few improvements\r\n // on using bootstrap: autoclose other popups, closing option.\r\n const m = marker([s.latitude, s.longitude]);\r\n\r\n m.bindPopup(this.createPopupComponent(s, m));\r\n\r\n nm.push(m);\r\n bd.push(latLng(s.latitude, s.longitude));\r\n }\r\n // Note how we set the layers in one assignment, in order to have leaflet\r\n // detects the change correctly\r\n // We also set the bounds afterward, for the map to be properly zoomed and\r\n // centered\r\n this.layers = nm;\r\n if (this.map && bd.length > 0) {\r\n this.map.fitBounds(latLngBounds(bd), {\r\n padding: point(48, 48),\r\n maxZoom: 12,\r\n animate: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n onMapReady(map: Map) {\r\n this.map = map;\r\n }\r\n\r\n createPopupComponent(space: Space, marker: Marker) {\r\n const comp = this.viewContainerRef.createComponent(MapPopupComponent);\r\n comp.instance.space = space;\r\n comp.instance.marker = marker;\r\n comp.changeDetectorRef.detectChanges();\r\n return comp.location.nativeElement;\r\n }\r\n\r\n}\r\n","<div [leafletLayers]=\"layers\" [leafletOptions]=\"options\" (leafletMapReady)=\"onMapReady($any($event))\" id=\"map\" leaflet\r\n style=\"height: 500px; margin-top: 30px; z-index: 195\"></div>","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { UntypedFormGroup, UntypedFormBuilder, Validators, AbstractControl } from '@angular/forms';\r\nimport { Space, LevelStatus, SpaceService, PropertyService, BaseUserService, MissionService, enumToArray, uploadFileToS3, Layer, PropertyType, getSignedImageUrlForSpace, LayerService, deleteFromS3 } from '@smarterplan/ngx-smarterplan-core';\r\nimport { ValidatorsService, textValidator, noEmptyValidator, floatValidator } from \"@smarterplan/ngx-smarterplan-core\";\r\n\r\n@Component({\r\n selector: 'lib-form-location',\r\n templateUrl: './form-location.component.html',\r\n styleUrls: ['./form-location.component.scss']\r\n})\r\nexport class FormLocationComponent implements OnInit {\r\n\r\n form: UntypedFormGroup;\r\n\r\n @ViewChild(\"imageInputContainer\")\r\n imageInputContainer: ElementRef;\r\n\r\n @ViewChild(\"imageInput\")\r\n imageInput: ElementRef;\r\n\r\n @ViewChild(\"imageBasePreview\")\r\n imageBasePreview: ElementRef;\r\n\r\n @Input()\r\n location: Space;\r\n\r\n imageToUpload: any;\r\n\r\n isSubmitted = false;\r\n\r\n levels: Array<LevelStatus>;\r\n\r\n addMissionForNewSpace = true;\r\n\r\n imageInputText: string;\r\n\r\n currentImage: string;\r\n\r\n imageToBeDeleted: boolean = false;\r\n\r\n errorForm: boolean = false;\r\n\r\n @Output() onChange = new EventEmitter<Space | null>();\r\n\r\n constructor(\r\n private spaceService: SpaceService,\r\n private propertyService: PropertyService,\r\n private userService: BaseUserService,\r\n private fb: UntypedFormBuilder,\r\n private missionService: MissionService,\r\n private layerService: LayerService,\r\n public validatorsService: ValidatorsService\r\n ) {\r\n this.levels = enumToArray(LevelStatus);\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.location) {\r\n this.initEditForm();\r\n } else {\r\n this.initForm();\r\n }\r\n this.handleInputImageText();\r\n }\r\n\r\n initForm() {\r\n this.form = this.fb.group({\r\n name: [\"\", [Validators.required, Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n addresses: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n latitude: [null, [Validators.maxLength(255), noEmptyValidator(), floatValidator()]],\r\n longitude: [null, [Validators.maxLength(255), noEmptyValidator(), floatValidator()]],\r\n level: LevelStatus.LOW,\r\n classGes: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n classEnergyConsumption: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n constructionYear: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n });\r\n }\r\n\r\n initEditForm() {\r\n this.form = this.fb.group({\r\n id: this.location.id,\r\n name: [this.location.name, [Validators.required, Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n addresses: [this.location.addresses, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n latitude: [this.location.latitude, [Validators.maxLength(255), floatValidator()]],\r\n longitude: [this.location.longitude, [Validators.maxLength(255), floatValidator()]],\r\n level: this.location.level,\r\n classGes: [this.location.classGes, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n classEnergyConsumption: [this.location.classEnergyConsumption, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n constructionYear: [this.location.constructionYear, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\r\n });\r\n }\r\n\r\n handleImageInput(target: EventTarget) {\r\n this.imageToUpload = (target as HTMLInputElement).files[0];\r\n if (this.imageToUpload) {\r\n this.imageInputContainer.nativeElement.style.display = \"none\";\r\n const reader = new FileReader();\r\n reader.addEventListener(\"load\", () => {\r\n this.currentImage = reader.result as string;\r\n });\r\n reader.readAsDataURL(this.imageToUpload);\r\n }\r\n }\r\n\r\n async uploadImage(spaceID: string) {\r\n if (this.imageToUpload) {\r\n uploadFileToS3(\"locations/\", this.imageToUpload, spaceID).then(\r\n async (url) => {\r\n if (url) {\r\n await this.spaceService.updateSpace({\r\n id: spaceID,\r\n annexes: url,\r\n });\r\n }\r\n },\r\n );\r\n } else if (this.imageToBeDeleted) {\r\n await this.spaceService.updateSpace({\r\n id: spaceID,\r\n annexes: null,\r\n });\r\n await deleteFromS3(this.location.annexes);\r\n }\r\n }\r\n\r\n clearImageFile() {\r\n this.imageToUpload = null;\r\n this.currentImage = null;\r\n this.imageInputContainer.nativeElement.style.display = \"flex\";\r\n this.imageInput.nativeElement.value = \"\";\r\n this.imageInputText = \"Add picture\";\r\n }\r\n\r\n async getLayerByName(name: string): Promise<Layer> {\r\n const currentOrgId = this.userService.currentOrganisation().id;\r\n const layers = await this.layerService.getLayerByNameForOrganisation(\r\n name,\r\n currentOrgId,\r\n );\r\n if (layers) {\r\n return layers[0];\r\n }\r\n // create then\r\n return this.layerService.createLayerForOrganisation(name, currentOrgId);\r\n }\r\n\r\n async onSubmit() {\r\n this.isSubmitted = true;\r\n if (!this.form.valid) {\r\n this.errorForm = true;\r\n return;\r\n }\r\n try {\r\n this.errorForm = false;\r\n let space;\r\n if (this.location) {\r\n this.changeCommaToDot();\r\n space = await this.spaceService.updateSpace(this.form.value);\r\n if (space) {\r\n await this.uploadImage(space.id);\r\n this.location = space;\r\n this.onChange.emit(space);\r\n }\r\n } else {\r\n this.changeCommaToDot();\r\n const spaceInput = this.form.value as Space;\r\n const currentOrgID = this.userService.currentOrganisation().id;\r\n spaceInput.organisationID = currentOrgID;\r\n let layer = await this.getLayerByName(\"BUILDING\");\r\n if (!layer) {\r\n layer = await this.layerService.createLayerForOrganisation(\r\n \"BUILDING\",\r\n currentOrgID,\r\n );\r\n }\r\n space = await this.spaceService.createSpace(\r\n spaceInput,\r\n layer,\r\n );\r\n\r\n const missions = this.userService.getManagerMissions();\r\n if (space && missions.length > 0) {\r\n const exampleMission = missions[0];\r\n await this.uploadImage(space.id);\r\n try {\r\n await this.propertyService.createProperty({\r\n type: PropertyType.PROPERTY,\r\n spaceID: space.id,\r\n organisationID: currentOrgID,\r\n });\r\n } catch (e) {\r\n console.log(\"API Service does not have Property requests\");\r\n }\r\n\r\n // add directly a mission for this space\r\n if (this.addMissionForNewSpace) {\r\n await this.missionService.create({\r\n spaceID: space.id,\r\n userID: exampleMission.userID,\r\n role: exampleMission.role,\r\n level: exampleMission.level,\r\n organisationID: exampleMission.organisationID,\r\n orderedOrganisationID:\r\n exampleMission.organisationID,\r\n });\r\n }\r\n this.onChange.emit(space);\r\n } else {\r\n this.onChange.emit(null);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n this.onChange.emit(null);\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.form.reset();\r\n this.onChange.emit(null);\r\n }\r\n\r\n get name(): AbstractControl {\r\n return this.form.get(\"name\");\r\n }\r\n\r\n changeCommaToDot() {\r\n const updatedSpace = this.form.value;\r\n if (\r\n updatedSpace.latitude &&\r\n updatedSpace.latitude.toString().includes(\",\")\r\n ) {\r\n updatedSpace.latitude = updatedSpace.latitude\r\n .toString()\r\n .replace(\",\", \".\");\r\n Number.parseFloat(updatedSpace.latitude);\r\n }\r\n if (\r\n updatedSpace.longitude &&\r\n updatedSpace.longitude.toString().includes(\",\")\r\n ) {\r\n updatedSpace.longitude = updatedSpace.longitude\r\n .toString()\r\n .replace(\",\", \".\");\r\n Number.parseFloat(updatedSpace.longitude);\r\n }\r\n }\r\n\r\n handleInputImageText() {\r\n if (this.location && this.location.annexes) {\r\n this.imageInputText = \"Change picture\";\r\n getSignedImageUrlForSpace(this.location).then((url) => {\r\n if (url) {\r\n this.currentImage = url;\r\n }\r\n });\r\n } else {\r\n this.imageInputText = \"Add picture\";\r\n }\r\n }\r\n\r\n\r\n isFormError(control) {\r\n return control && control.invalid && this.errorForm;\r\n }\r\n\r\n\r\n onFormChange() {\r\n if (this.errorForm && this.form.valid) {\r\n this.errorForm = false;\r\n }\r\n\r\n }\r\n}\r\n","<div class=\"col-md-6 form-new-loc\" *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" data-testid=\"new-location-name\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['name'])|| isFormError(form.controls['name'])}\"\r\n required formControlName=\"name\">\r\n\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-name-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['name']) \r\n || isFormError(form.controls['name'])\">\r\n {{validatorsService.getError(form.controls['name']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"addresses\" data-testid=\"new-location-address\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['addresses']) || isFormError(form.controls['addresses'])}\">\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"\" [translate]=\"validatorsService.getError(form.controls['addresses'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['addresses'])\"></span>\r\n\r\n <ngb-alert data-testid=\"new-location-address-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['addresses']) \">\r\n\r\n {{validatorsService.getError(form.controls['addresses']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Construction year' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"constructionYear\"\r\n data-testid=\"new-location-constructionYear\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-constructionYear-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])\">\r\n {{validatorsService.getError(form.controls['constructionYear']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Latitude' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"latitude\" data-testid=\"new-location-latitude\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['latitude'])|| isFormError(form.controls['latitude'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-latitude-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['latitude']) || isFormError(form.controls['latitude'])\">\r\n {{validatorsService.getError(form.controls['latitude']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Longitude' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"longitude\" data-testid=\"new-location-longitude\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['longitude'])|| isFormError(form.controls['longitude'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-longitude-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['longitude']) || isFormError(form.controls['longitude'])\">\r\n {{validatorsService.getError(form.controls['longitude']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Access level' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <select class=\"d-inline-block custom-select rounded-pill\" formControlName=\"level\">\r\n <option *ngFor=\"let level of levels\" [value]=\"level\">{{level | translate}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Energy Class' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"classEnergyConsumption\"\r\n data-testid=\"new-location-classEnergyConsumption\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-classEnergyConsumption-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])\">\r\n {{validatorsService.getError(form.controls['classEnergyConsumption']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Greenhouse gas emission Class' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"classGes\" data-testid=\"new-location-classGes\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classGes'])|| isFormError(form.controls['classGes'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-classGes-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['classGes']) || isFormError(form.controls['classGes'])\">\r\n {{validatorsService.getError(form.controls['classGes']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Cover picture' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <img #imageBasePreview *ngIf=\"currentImage\" class=\"image-preview\" [src]=\"currentImage\">\r\n <label #imageInputContainer for=\"image\"\r\n class=\"btn btn-label-file btn-outline-primary rounded-pill imageInputContainer\">\r\n <input #imageInput type=\"file\" id=\"image\" (change)=\"handleImageInput($event.target)\" />\r\n {{ imageInputText | translate}}</label>\r\n <button *ngIf=\"currentImage && !imageToUpload\" class=\"btn btn-outline-primary rounded-pill\"\r\n (click)=\"imageToBeDeleted=true;clearImageFile()\">{{'Delete picture' | translate }}</button>\r\n <div class=\"image-name\" *ngIf=\"imageToUpload\">\r\n <p>{{ imageToUpload.name}}</p>\r\n <div (click)=\"clearImageFile()\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\" *ngIf=\"!location\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Create mission for this space' | translate}}</label>\r\n <div class=\"col-sm-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"addMissionForNewSpace\" [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div>\r\n\r\n <button data-testid=\"new-location-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\" type=\"submit\"\r\n class=\"btn btn-outline-primary rounded-pill me-3\">{{'Save' | translate}}</button>\r\n\r\n <button data-testid=\"new-location-close-btn\" type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\r\n translate}}</button>\r\n\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"new-location-form-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n\r\n </ngb-alert>\r\n </div>\r\n </form>\r\n</div>","import { Component, OnInit } from '@angular/core';\r\nimport { UntypedFormGroup } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { LevelStatus, Space, SpaceService, BaseUserService, ViewerService, NavigationService, NavigatorService, enumToArray, Visit, MenuItem, SearchObjectType } from '@smarterplan/ngx-smarterplan-core';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-locations',\r\n templateUrl: './locations.component.html',\r\n styleUrls: ['./locations.component.scss']\r\n})\r\nexport class LocationsComponent implements OnInit {\r\n\r\n createForm: UntypedFormGroup;\r\n\r\n levels: Array<LevelStatus>;\r\n\r\n imageToUpload: File;\r\n\r\n isAdding = false;\r\n\r\n filteredLocations: Space[] = [];\r\n\r\n isManager = false;\r\n\r\n isMuseumUser = true;\r\n\r\n locations: Space[] = [];\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n userSubcription: Subscription;\r\n\r\n locationIDSubscription: Subscription;\r\n\r\n /** Last filtered Locations, used when we go back on all locations from the search bar location */\r\n lastFiltredLocations: Space[] = [];\r\n\r\n constructor(\r\n private spaceService: SpaceService,\r\n private router: Router,\r\n private userService: BaseUserService,\r\n private viewerService: ViewerService,\r\n private navigationService: NavigationService,\r\n private navigatorService: NavigatorService,\r\n ) {\r\n this.levels = enumToArray(LevelStatus);\r\n this.userSubcription = this.userService.isChanged.subscribe((isConnected) => {\r\n if (isConnected) {\r\n this.refresh();\r\n }\r\n });\r\n\r\n this.locationIDSubscription =\r\n this.navigatorService.locationIDChange.subscribe((id) => {\r\n this.changeSelectedLocation(id);\r\n this.setupMenuItems();\r\n });\r\n }\r\n\r\n async ngOnInit() {\r\n if (this.userService.cu) {\r\n this.resetList();\r\n this.updateUserRights();\r\n }\r\n this.setupMenuItems();\r\n }\r\n\r\n\r\n findSpaceById(id: string): Space {\r\n return this.locations.find((loc) => loc.id === id);\r\n }\r\n\r\n /**\r\n * Update when we change the selected location in filter (search bar)\r\n * @param id for a location, if null display all last filtred location\r\n */\r\n changeSelectedLocation(id?: string) {\r\n const space = id ? this.findSpaceById(id) : null;\r\n this.filteredLocations = space ? [space] : this.lastFiltredLocations; // New selected space or last filtered location\r\n }\r\n\r\n refresh() {\r\n this.updateUserRights();\r\n this.resetList();\r\n }\r\n\r\n\r\n ngOnDestroy() {\r\n this.userSubcription.unsubscribe();\r\n this.locationIDSubscription.unsubscribe();\r\n }\r\n\r\n setupMenuItems() {\r\n this.menuItems = [{ label: \"All Locations\", url: \"/localisation\" }];\r\n if (this.isAdding) {\r\n this.menuItems.push({ label: \"New\" });\r\n }\r\n if (this.filteredLocations.length === 1) {\r\n const selectedLoc = this.filteredLocations[0];\r\n this.menuItems.push({ label: selectedLoc.name });\r\n }\r\n }\r\n\r\n updateUserRights() {\r\n this.isManager = this.userService.hasManagerRoleInAnyMission();\r\n this.isMuseumUser = this.userService.hasOnlyMuseumRole();\r\n }\r\n\r\n isManagerForSpace(spaceID: string): boolean {\r\n return (\r\n this.userService.isManager(spaceID) ||\r\n this.userService.isGuide(spaceID)\r\n );\r\n }\r\n\r\n async resetList() {\r\n this.locations = await this.spaceService.getLocationsForCurrentUser();\r\n this.filteredLocations = this.locations;\r\n this.lastFiltredLocations = this.locations;\r\n this.isAdding = false;\r\n this.changeSelectedLocation(\r\n this.navigatorService.currentNavBarLocationID,\r\n ); // Set for the current selected location\r\n this.setupMenuItems();\r\n }\r\n\r\n onAddLocation() {\r\n this.isAdding = true;\r\n this.setupMenuItems();\r\n }\r\n\r\n handleImageInput(files: FileList) {\r\n this.imageToUpload = files.item(0);\r\n }\r\n\r\n onFormChange(event: any) {\r\n this.navigatorService.locationIDChange.next(\r\n null,\r\n ); /** Remove selected location */\r\n this.isAdding = false;\r\n if (event) {\r\n this.resetList();\r\n }\r\n this.setupMenuItems();\r\n }\r\n\r\n async onVisitClick(loc: Space, visit: Visit) {\r\n if (!this.userService.userHasAccessToAllZonesInSpace(loc.id)) {\r\n // get allowed sweep for the user\r\n const allowedSweeps =\r\n await this.navigationService.getAllowedSweepsIDsForUserInSpace(\r\n loc.id,\r\n );\r\n const firstSweep = allowedSweeps[0];\r\n this.viewerService.setSweepToMove(firstSweep);\r\n }\r\n if (this.userService.isGuide(loc.id)) {\r\n this.router.navigate([\"museum\", loc.id]);\r\n } else {\r\n this.router.navigate([\"visit\", loc.id], {\r\n queryParams: { model3D: visit.model3d },\r\n });\r\n }\r\n }\r\n\r\n applyResultsSearchBar(results: Space[]) {\r\n this.filteredLocations = results || this.locations;\r\n this.lastFiltredLocations = this.filteredLocations;\r\n this.navigatorService.locationIDChange.next(null); // When we search with keyword, we would like to search on all locations\r\n }\r\n\r\n getSearchType(): SearchObjectType {\r\n return SearchObjectType.LOCATION;\r\n }\r\n\r\n getStringNoSpace(data): string {\r\n return data.replace(/\\s/g, '');\r\n }\r\n\r\n onDetailViewClick(spaceID: string) {\r\n this.navigatorService.locationIDChange.next(spaceID); // Send update for the location filter bar\r\n this.router.navigate([\"dashboard/localisation\", spaceID]);\r\n }\r\n\r\n}\r\n","<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","import { Component, OnInit } from '@angular/core';\r\nimport { UntypedFormGroup } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { MenuItem, SpaceService, BaseUserService, NavigatorService, SpaceStatus, Space } from '@smarterplan/ngx-smarterplan-core';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-detail-location',\r\n templateUrl: './detail-location.component.html',\r\n styleUrls: ['./detail-location.component.scss']\r\n})\r\nexport class DetailLocationComponent implements OnInit {\r\n\r\n space: Space;\r\n\r\n editForm: UntypedFormGroup;\r\n\r\n isEditing = false;\r\n\r\n imageToUpload: File;\r\n\r\n id: string;\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n isValidatingDpe = false;\r\n\r\n selectedDpeResult: any;\r\n\r\n gettingData = false;\r\n\r\n parsedMetadata: {\r\n geo_adresse: string;\r\n secteur_activite: string;\r\n annee_construction: string;\r\n classe_consommation_energie: string;\r\n classe_estimation_ges: string;\r\n selected: boolean;\r\n }[];\r\n\r\n guestLink: string;\r\n\r\n canArchive: boolean;\r\n\r\n destroy$ = new Subject();\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private spaceService: SpaceService,\r\n private router: Router,\r\n private userService: BaseUserService,\r\n private translate: TranslateService,\r\n private navigatorService: NavigatorService,\r\n ) {\r\n this.navigatorService.locationIDChange\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((spaceID) => {\r\n this.router.navigate([\"dashboard/localisation\", spaceID]);\r\n });\r\n\r\n this.route.params.subscribe((params) => {\r\n this.id = params.id;\r\n this.setup();\r\n });\r\n }\r\n\r\n ngOnInit() { }\r\n\r\n async setup() {\r\n this.space = await this.spaceService.getSpace(this.id);\r\n this.setupMenuItems();\r\n this.setGuestLink();\r\n this.setCanArchive();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: \"Locations\", url: \"/localisation\" },\r\n {\r\n label: this.space.name,\r\n url: `/localisation/${this.space.id}`,\r\n },\r\n ];\r\n\r\n if (this.isEditing) {\r\n this.menuItems.push({ label: \"Edit\" });\r\n } else {\r\n this.menuItems.push({ label: \"Information\" });\r\n }\r\n }\r\n\r\n onEdit() {\r\n this.isEditing = true;\r\n this.setupMenuItems();\r\n }\r\n\r\n onReturn() {\r\n // this.locationService.back()\r\n this.router.navigate([\"dashboard/localisation\"]);\r\n }\r\n\r\n reset() {\r\n this.isEditing = false;\r\n this.setupMenuItems();\r\n }\r\n\r\n async onArchive() {\r\n const message = this.translate.instant(\"confirm.archiveSpace\");\r\n if (window.confirm(message)) {\r\n await this.spaceService.softDeleteSpace(this.id);\r\n this.onReturn();\r\n }\r\n }\r\n\r\n onFormChange(event: Space) {\r\n this.isEditing = false;\r\n if (event) {\r\n this.space = event;\r\n }\r\n this.setupMenuItems();\r\n }\r\n\r\n onDpeValidate() {\r\n this.isValidatingDpe = true;\r\n this.parsedMetadata = JSON.parse(this.space.metadata);\r\n this.parsedMetadata = this.parsedMetadata.filter(\r\n (result) => result.geo_adresse,\r\n );\r\n }\r\n\r\n onSelectChange(selectedResult: any) {\r\n for (const result of this.parsedMetadata) {\r\n if (result !== selectedResult && result.selected) {\r\n result.selected = false;\r\n }\r\n }\r\n this.selectedDpeResult = selectedResult;\r\n }\r\n\r\n async onSaveResult() {\r\n if (this.selectedDpeResult) {\r\n const input = {\r\n id: this.space.id,\r\n constructionYear: this.selectedDpeResult.annee_construction,\r\n classEnergyConsumption:\r\n this.selectedDpeResult.classe_consommation_energie,\r\n classGes: this.selectedDpeResult.classe_estimation_ges,\r\n status: SpaceStatus.DPE_VALIDATED,\r\n };\r\n const updatedLoc = await this.spaceService.updateSpace(input);\r\n this.space = updatedLoc;\r\n this.isValidatingDpe = false;\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.isValidatingDpe = false;\r\n }\r\n\r\n async onErase() {\r\n await this.spaceService.updateSpace({\r\n id: this.space.id,\r\n status: SpaceStatus.DPE_VALIDATED,\r\n });\r\n this.space.status = SpaceStatus.DPE_VALIDATED;\r\n this.isValidatingDpe = false;\r\n }\r\n\r\n async onGetDpeData() {\r\n this.gettingData = true;\r\n await this.spaceService.updateSpace({\r\n id: this.space.id,\r\n status: SpaceStatus.DPE_FETCH,\r\n });\r\n\r\n // force update of location\r\n setTimeout(async () => {\r\n this.space = await this.spaceService.getSpace(this.space.id);\r\n this.gettingData = false;\r\n }, 1500);\r\n }\r\n\r\n setGuestLink() {\r\n if (this.space.guestLink) {\r\n const { origin } = document.location;\r\n this.guestLink = `${origin}/${this.space.guestLink}`;\r\n setTimeout(() => {\r\n const hyperlink = document.querySelector(\r\n \"#linkHref\",\r\n ) as HTMLLinkElement;\r\n const message = this.translate.instant(\"confirm.followLink\");\r\n hyperlink.addEventListener(\"click\", async () => {\r\n if (window.confirm(message)) {\r\n window.location.href = this.guestLink;\r\n await this.userService.logoutCurrentAndSignOutAuth();\r\n this.router.navigate([\"auth\"]);\r\n }\r\n });\r\n }, 0);\r\n }\r\n }\r\n\r\n async setCanArchive() {\r\n this.canArchive = this.userService.isSPAdmin()\r\n ? true\r\n : await this.spaceService.canArchiveSpace(this.id);\r\n }\r\n\r\n}\r\n","<div class=\"container-fluid\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\r\n </div>\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\r\n translate}}</button>\r\n <div class=\"row\" *ngIf=\"!isEditing && space\">\r\n <div class=\"col-md-5\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\r\n {{space.constructionYear ?\r\n space.constructionYear : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\r\n {{space.latitude ?\r\n space.latitude : \"No data\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\r\n space.longitude : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\r\n }} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\r\n {{space.classEnergyConsumption ?\r\n space.classEnergyConsumption : \"No data\" | translate}}\r\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\r\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\r\n {{'Get data from API DPE' | translate}}</button>\r\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\r\n style=\"cursor: pointer;\">\r\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\r\n data-height=\"25\"></span>\r\n {{'DPE data found. Click to validate' | translate}}\r\n </a>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\r\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\r\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\r\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\r\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\r\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\r\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\r\n </p>\r\n </li>\r\n\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n <hr>\r\n <div class=\"d-flex\">\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\r\n data-testid=\"location-edit-btn\">{{'Edit' |\r\n translate}}</button>\r\n <div class=\"tooltip-wrapper\"\r\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\r\n {{'Archive' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\r\n <h6>{{'Most relevant results for' | translate}} :\r\n <b>diagnostics de performance énergétique (DPE) des bâtiments tertiaires</b>\r\n </h6>\r\n <table class=\"table table-striped\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">#</th>\r\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\r\n <th scope=\"col\">{{'Address' | translate}}</th>\r\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\r\n <th scope=\"col\">{{'Construction year' | translate}}</th>\r\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\r\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\r\n <th scope=\"row\">{{ i + 1 }}</th>\r\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\r\n (change)=\"onSelectChange(result)\"></td>\r\n <td>{{result.geo_adresse}}</td>\r\n <td>{{result.secteur_activite}}</td>\r\n <td>{{ result.annee_construction }}</td>\r\n <td>{{ result.classe_consommation_energie }}</td>\r\n <td>{{ result.classe_estimation_ges }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\r\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\r\n translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\r\n {{'No match (erase data)' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </div>\r\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\r\n</div>","import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { getDocument, PDFDocumentProxy } from 'pdfjs-dist';\r\n// import { PDFDocumentProxy } from 'ng2-pdf-viewer';\r\nimport {\r\n Zone,\r\n MenuItem,\r\n Plan,\r\n Space,\r\n Navigation,\r\n PlanService,\r\n ZoneService,\r\n SpaceService,\r\n NavigationService,\r\n getMetaForImage,\r\n MatterportImportService,\r\n} from '@smarterplan/ngx-smarterplan-core';\r\nimport panzoom from 'panzoom';\r\n\r\n@Component({\r\n selector: 'lib-calibration',\r\n templateUrl: './calibration.component.html',\r\n styleUrls: ['./calibration.component.scss'],\r\n})\r\nexport class CalibrationComponent implements OnInit {\r\n /** Item to display for the navbar */\r\n menuItems: MenuItem[] = [];\r\n\r\n /** Canvas (Plan) */\r\n canvas;\r\n\r\n /** CanvasDiv (Div that contain the canvas + matterport iframe) */\r\n @ViewChild('canvasDiv') canvasDiv: ElementRef;\r\n\r\n /** Size of the canvas & matterport iframe */\r\n canvasSize: { w: number; h: number; };\r\n\r\n /** Zoom ratio of the canvas/plan */\r\n canvasZoom = 0;\r\n\r\n /** Opacity for matterport iframe */\r\n opacity: number = 50;\r\n\r\n /** Current rotation for matterport, [0-360], matterport rotation is bind to input range */\r\n rotation: number = 180;\r\n\r\n /** Previous rotation, use to calculate the deltaRotation to rotate, when user change rotation value using range input */\r\n prevRotation: number = 180;\r\n\r\n /** Current Camera Pose */\r\n cameraPose: any;\r\n\r\n /** True when the user is currently rotating with the input range, the matterport rotation events will be ignored */\r\n isRotatingRange: boolean = false;\r\n\r\n /** Rotating queue event to send to matterport */\r\n rotatingQueueEvent: number[] = [];\r\n\r\n /** True when Vertical symmetry is enabled */\r\n reflectV = false;\r\n\r\n /** True when Horizontal symmetry is enabled */\r\n reflectH = false;\r\n\r\n chosenPlan: Plan;\r\n\r\n spaceID: string;\r\n\r\n currentSpace: Space;\r\n\r\n currentZone: Zone;\r\n\r\n chosenPlanIsPdf = false;\r\n\r\n /** First Point in visit, used to determine the calibration */\r\n firstMarkVisit = { x: 0, y: 0 };\r\n\r\n /** Second Point in visit, used to determine the calibration */\r\n secondMarkVisit = { x: 0.5, y: 0.5 };\r\n\r\n /** Equivalent of 'firstMarkVisit' in canvas */\r\n firstMarkPlan: { x: number; y: number; } = { x: 0, y: 0 };\r\n\r\n /** Equivalent of 'secondMarkVisit' in canvas */\r\n secondMarkPlan: { x: number; y: number; } = { x: 0, y: 0 };\r\n\r\n /** Calibration result, (offsetX, offsetY, x, y) */\r\n calibrage: any = {};\r\n\r\n /** Is in preview mode (see scan result) */\r\n preview = false;\r\n\r\n /** Matterport is loading */\r\n loading = true;\r\n\r\n /* for pan and zoom of canvas */\r\n panzoom: any;\r\n\r\n currentNavigations: Navigation[];\r\n\r\n positions: { navID: string; planID: string; x: number; y: number; }[] = [];\r\n\r\n floors: any[] = [];\r\n\r\n currentFloor;\r\n\r\n zoomCanBeChanged: boolean = false;\r\n\r\n constructor(\r\n private matterportImportService: MatterportImportService,\r\n private planService: PlanService,\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private zoneService: ZoneService,\r\n private spaceService: SpaceService,\r\n private navigationService: NavigationService,\r\n private translate: TranslateService\r\n ) { }\r\n\r\n ngOnDestroy(): void {\r\n if (!this.loading) {\r\n this.matterportImportService.removeFrame();\r\n }\r\n }\r\n\r\n async ngOnInit(): Promise<void> {\r\n this.spaceID = this.route.snapshot.queryParams.spaceID;\r\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\r\n\r\n /** Menu nav bar */\r\n this.setupMenuItems();\r\n\r\n this.chosenPlan = this.planService.getChosenPlan();\r\n\r\n if (this.chosenPlan) {\r\n this.chosenPlanIsPdf = this.chosenPlan.annexe.includes('pdf');\r\n this.launchViewer();\r\n setTimeout(() => {\r\n this.configureCanvas().then(() => {\r\n this.panzoom = panzoom(this.canvas, {\r\n bounds: true,\r\n boundsPadding: 0,\r\n maxZoom: 2.5,\r\n minZoom: 0.1,\r\n initialZoom: 1,\r\n zoomSpeed: 0.02,\r\n });\r\n });\r\n }, 500);\r\n } else {\r\n this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);\r\n }\r\n }\r\n\r\n /** **********************************************************************************************\r\n * MENU NAV BAR\r\n *********************************************************************************************** */\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: 'Locations', url: '/localisation' },\r\n {\r\n label: this.currentSpace.name,\r\n url: `/localisation/${this.spaceID}`,\r\n },\r\n {\r\n label: 'Plans',\r\n url: `/localisation/${this.currentSpace.id}/plans`,\r\n },\r\n {\r\n label: 'Calibration',\r\n url: `/localisation/${this.currentSpace.id}/plan-calibration?spaceID=${this.currentSpace.id}`,\r\n },\r\n ];\r\n }\r\n\r\n /** **********************************************************************************************\r\n * CANVAS\r\n *********************************************************************************************** */\r\n\r\n /** Display the plan */\r\n async configureCanvas() {\r\n /** Get canvas */\r\n if (!this.canvas) {\r\n const canvas = document.querySelector('#canvas') as HTMLCanvasElement;\r\n this.canvas = canvas;\r\n }\r\n\r\n if (!this.chosenPlanIsPdf) {\r\n const image = await getMetaForImage(this.chosenPlan.filepath);\r\n /** Compute the new size for the canvas/matterport, base on the dimension of the plan, keeping the ratio */\r\n const size = this.getSizeForCanvas(image.width, image.height);\r\n\r\n /** Compute the plan zoom ratio (use for the calibration later) */\r\n this.canvasZoom = size.w / image.width;\r\n\r\n this.resizeView(size);\r\n\r\n /** Draw Plan on the canvas */\r\n this.drawImage(this.chosenPlan.filepath);\r\n } else {\r\n // TODO\r\n this.pdfToCanvas();\r\n }\r\n }\r\n\r\n /** Update size of the canvas/matterport */\r\n resizeView(size) {\r\n this.canvasDiv.nativeElement.style.width = `${size.w}px`;\r\n this.canvasDiv.nativeElement.style.height = `${size.h}px`;\r\n this.canvas.style.width = `${size.w}px`;\r\n this.canvas.style.height = `${size.h}px`;\r\n this.canvas.width = size.w;\r\n this.canvas.height = size.h;\r\n this.canvasSize = size;\r\n }\r\n\r\n /** Draw something on the canvas */\r\n drawImage(url: string, x = 0, y = 0, icone = false) {\r\n const image = new Image();\r\n const size = this.canvasSize;\r\n const context = this.canvas.getContext('2d');\r\n\r\n /** Flip the context, for symmetry */\r\n // if (this.reflectV) {\r\n // context.translate(size.w, 0);\r\n // context.scale(-1, 1);\r\n // }\r\n // if (this.reflectH) {\r\n // context.translate(0, size.h);\r\n // context.scale(1, -1);\r\n // }\r\n\r\n let imageWidth = size.w;\r\n let imageHeight = size.h;\r\n image.addEventListener('load', () => {\r\n if (icone) {\r\n imageWidth = image.width;\r\n imageHeight = image.height;\r\n }\r\n context.drawImage(\r\n image,\r\n 0,\r\n 0,\r\n image.width,\r\n image.height,\r\n x,\r\n y,\r\n imageWidth,\r\n imageHeight\r\n );\r\n });\r\n image.src = url;\r\n }\r\n\r\n /** Get the size for the canvas, based on the plan size, keeping the ratio */\r\n getSizeForCanvas(w, h) {\r\n let canvasW = this.canvasDiv.nativeElement.offsetWidth;\r\n let canvasH = this.canvasDiv.nativeElement.offsetHeight;\r\n\r\n const imageRatio = w / h;\r\n const canvasRatio = canvasW / canvasH;\r\n\r\n if (imageRatio > canvasRatio) {\r\n canvasH = canvasW / imageRatio;\r\n } else {\r\n canvasW = canvasH * imageRatio;\r\n }\r\n return { w: canvasW, h: canvasH };\r\n }\r\n\r\n /** [TODO] Convert a PDF to a Canvas */\r\n async pdfToCanvas() {\r\n const pdfjs = await import('pdfjs-dist/build/pdf');\r\n const pdfjsWorker = await import('pdfjs-dist/build/pdf.worker.entry');\r\n\r\n pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;\r\n\r\n const pdf: PDFDocumentProxy = await getDocument(this.chosenPlan.filepath)\r\n .promise;\r\n const page = await pdf.getPage(1);\r\n\r\n const viewPortParameters = { scale: 1 };\r\n const viewport = page.getViewport(viewPortParameters);\r\n\r\n this.canvas.height = viewport.height;\r\n this.canvas.width = viewport.width;\r\n\r\n const size = this.getSizeForCanvas(viewport.width, viewport.height);\r\n console.log(size);\r\n this.canvasSize = size;\r\n\r\n this.canvasZoom = size.w / viewport.width;\r\n\r\n const context = this.canvas.getContext('2d') as CanvasRenderingContext2D;\r\n const renderContext = {\r\n canvasContext: context,\r\n viewport,\r\n };\r\n const renderTask = page.render(renderContext).promise;\r\n\r\n renderTask.then(() => console.log('Page rendered'));\r\n\r\n // const res = canvas.toDataURL();\r\n // if (pdf != null) pdf.destroy();\r\n // return res;\r\n }\r\n\r\n /** User click to user Symmetry Vertical */\r\n onReflectV() {\r\n this.reflectV = !this.reflectV;\r\n this.configureCanvas();\r\n }\r\n\r\n /** User click to user Symmetry Horizontal */\r\n onReflectH() {\r\n this.reflectH = !this.reflectH;\r\n this.configureCanvas();\r\n }\r\n\r\n /** **********************************************************************************************\r\n * MATTERPORT\r\n *********************************************************************************************** */\r\n\r\n /** Launch matterport */\r\n async launchViewer() {\r\n await this.matterportImportService.initSdkForModel(this.chosenPlan.model3d);\r\n\r\n const { sdk } = this.matterportImportService;\r\n this.floors = Object.values(this.matterportImportService.floors);\r\n // console.log(this.floors);\r\n setTimeout(async () => {\r\n /** Move Floor mode */\r\n sdk.Mode.moveTo(sdk.Mode.Mode.FLOORPLAN).then(async (nextMode) => {\r\n /** Display the correct floor for the plan */\r\n try {\r\n const matterportFloor = this.chosenPlan.zone.metadata ?\r\n JSON.parse(this.chosenPlan.zone.metadata).matterportFloorSequence : null;\r\n await this.matterportImportService.moveToFloor(this.chosenPlan.zone.name, matterportFloor);\r\n\r\n /** When the user try to change the view mode we set it back to floorpan */\r\n sdk.on(sdk.Mode.Event.CHANGE_END, (oldMode, newMode) => {\r\n if (newMode !== sdk.Mode.Mode.FLOORPLAN) {\r\n sdk.Mode.moveTo(sdk.Mode.Mode.FLOORPLAN, {\r\n transition: 'transition.instant',\r\n });\r\n }\r\n });\r\n } catch {\r\n console.log('couldnot move to floor');\r\n }\r\n });\r\n\r\n /** We can display the matterport view now */\r\n this.loading = false;\r\n }, 1000);\r\n\r\n /** Update current camera pose and rotation */\r\n sdk.Camera.pose.subscribe((event) => {\r\n /** We update only if the user is not changing the rotation with the <input> range, to not override the <input> value */\r\n if (!this.isRotatingRange) {\r\n this.rotation = event.rotation.y + 180;\r\n this.prevRotation = this.rotation;\r\n this.cameraPose = event;\r\n }\r\n });\r\n }\r\n\r\n /** When the <input> range, for rotation, change */\r\n async onRotationChange() {\r\n const rotationDelta = this.rotation - this.prevRotation;\r\n this.prevRotation = this.rotation;\r\n\r\n /** Send the rotationDelta to th queue event in order to be send to matterport */\r\n this.rotatingQueueEvent.push(rotationDelta);\r\n\r\n /** Start to process the queue, if it's the first event */\r\n if (!this.isRotatingRange) {\r\n this.isRotatingRange = true;\r\n this.processRotatingQueueEvent();\r\n }\r\n }\r\n\r\n /** Process the rotating event queue, send event one by one to matterport */\r\n async processRotatingQueueEvent() {\r\n const { sdk } = this.matterportImportService;\r\n\r\n /** While the queue is not empty */\r\n while (this.rotatingQueueEvent.length > 0) {\r\n /** Rotate matterport by deltaRotation and remove event from queue */\r\n await sdk.Camera.rotate(this.rotatingQueueEvent.shift(), 0, {\r\n speed: 360,\r\n });\r\n }\r\n\r\n /** When the queue is empty, then the user is not rotating with the <input> range anymore */\r\n this.isRotatingRange = false;\r\n }\r\n\r\n /** **********************************************************************************************\r\n * USER ACTIONS\r\n *********************************************************************************************** */\r\n\r\n /** Preview calibration */\r\n async onPreview() {\r\n this.preview = true;\r\n /** Place sweeps */\r\n this.onPlaceSweeps();\r\n }\r\n\r\n async calibrate() {\r\n const [navigation] = this.currentNavigations;\r\n const position = JSON.parse(navigation.position);\r\n this.firstMarkPlan =\r\n await this.matterportImportService.sdk.Renderer.getScreenPosition({\r\n x: position.x,\r\n y: position.y,\r\n z: position.z,\r\n });\r\n this.secondMarkPlan =\r\n await this.matterportImportService.sdk.Renderer.getScreenPosition({\r\n x: position.x,\r\n y: 0,\r\n z: 0,\r\n });\r\n const deltaZVisit = 0 - position.z;\r\n let deltaXPlan = this.secondMarkPlan.x - this.firstMarkPlan.x;\r\n if (deltaXPlan === 0) {\r\n // console.log(\"we moved along Y axis on Plan\");\r\n const deltaYPlan = this.secondMarkPlan.y - this.firstMarkPlan.y;\r\n this.calibrage.nameYAxis = 'z';\r\n this.calibrage.nameXAxis = 'x';\r\n this.calibrage.offsetY = this.secondMarkPlan.y;\r\n this.calibrage.scaleY = deltaYPlan / deltaZVisit;\r\n } else {\r\n // console.log(\" we moved along X axis on Plan\");\r\n this.calibrage.nameYAxis = 'x';\r\n this.calibrage.nameXAxis = 'z';\r\n this.calibrage.offsetX = this.secondMarkPlan.x;\r\n this.calibrage.scaleX = deltaXPlan / deltaZVisit;\r\n }\r\n const thirdMarkPlan =\r\n await this.matterportImportService.sdk.Renderer.getScreenPosition({\r\n x: 0,\r\n y: 0,\r\n z: position.z,\r\n });\r\n const deltaXVisit = 0 - position.x;\r\n if (deltaXPlan === 0) {\r\n // console.log(\" we moved along X axis on Plan\");\r\n deltaXPlan = thirdMarkPlan.x - this.firstMarkPlan.x;\r\n this.calibrage.offsetX = thirdMarkPlan.x;\r\n this.calibrage.scaleX = deltaXPlan / deltaXVisit;\r\n } else {\r\n const deltaYPlan = thirdMarkPlan.y - this.firstMarkPlan.y;\r\n this.calibrage.offsetY = thirdMarkPlan.y;\r\n this.calibrage.scaleY = deltaYPlan / deltaXVisit;\r\n }\r\n\r\n /** Take considiration of pan and zoom of plan on canvas */\r\n const transformInfo = this.panzoom.getTransform();\r\n const { scale, x, y } = transformInfo;\r\n // console.log(transformInfo);\r\n this.calibrage.offsetXPlan = x;\r\n this.calibrage.offsetYPlan = y;\r\n this.calibrage.scalePlan = scale;\r\n console.log(this.calibrage);\r\n }\r\n\r\n /** Place sweeps */\r\n async onPlaceSweeps() {\r\n /** Display all scan */\r\n const zone = await this.zoneService.getZone(this.chosenPlan.zoneID);\r\n\r\n if (zone) {\r\n this.currentZone = zone;\r\n const navigations = await this.navigationService.getNavigationsForZone(\r\n this.currentZone\r\n );\r\n this.currentNavigations = navigations;\r\n await this.calibrate();\r\n if (navigations.length > 0) {\r\n for (const navigation of navigations) {\r\n const testPosition = JSON.parse(navigation.position);\r\n const positionX =\r\n this.calibrage.nameXAxis === 'x' ? testPosition.x : testPosition.z;\r\n const positionY =\r\n this.calibrage.nameYAxis === 'x' ? testPosition.x : testPosition.z;\r\n const testX =\r\n positionX * this.calibrage.scaleX + this.calibrage.offsetX;\r\n const testY =\r\n positionY * this.calibrage.scaleY + this.calibrage.offsetY;\r\n // console.log(\"test position GREEN\", testX, testY);\r\n const transformedX =\r\n (testX - this.calibrage.offsetXPlan) / this.calibrage.scalePlan; // we are undoing the pan and zoom\r\n const transformedY =\r\n (testY - this.calibrage.offsetYPlan) / this.calibrage.scalePlan;\r\n this.positions.push({\r\n navID: navigation.id,\r\n planID: this.chosenPlan.id,\r\n x: transformedX,\r\n y: transformedY,\r\n });\r\n const iconSize = 30 * this.calibrage.scalePlan;\r\n const shift = iconSize / 2;\r\n this.drawImage(\r\n 'https://api.iconify.design/mdi:adjust.svg?color=green&height=30&width=30',\r\n transformedX - shift,\r\n transformedY - shift,\r\n true\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Save calibration */\r\n async onSave() {\r\n if (this.currentZone) {\r\n /** Normalize with the zoom */\r\n // this.calibrage.offsetX /= this.canvasZoom;\r\n // this.calibrage.offsetY /= this.canvasZoom;\r\n // this.calibrage.x /= this.canvasZoom;\r\n // this.calibrage.y /= this.canvasZoom;\r\n this.calibrage.new = true;\r\n this.calibrage.imgWidth = this.canvasSize.w;\r\n this.calibrage.imgHeight = this.canvasSize.h;\r\n\r\n await this.planService.updatePlan({\r\n id: this.chosenPlan.id,\r\n calibration: JSON.stringify(this.calibrage),\r\n });\r\n await Promise.all(\r\n this.positions.map(async (position) => {\r\n const { navID } = position;\r\n delete position.navID;\r\n const nav = this.currentNavigations.find((_nav) => _nav.id === navID);\r\n let positionsDataToUpdate;\r\n if (nav.positionOnPlan) {\r\n const positionOnPlan = nav.positionOnPlan.map((entry) =>\r\n JSON.parse(entry)\r\n );\r\n const positionForCurrentPlan = positionOnPlan.find(\r\n (entry) => entry.planID === this.chosenPlan.id\r\n );\r\n if (positionForCurrentPlan) {\r\n positionOnPlan.splice(\r\n positionOnPlan.indexOf(positionForCurrentPlan),\r\n 1,\r\n position\r\n );\r\n } else {\r\n positionOnPlan.push(position);\r\n }\r\n positionsDataToUpdate = [...positionOnPlan];\r\n } else {\r\n positionsDataToUpdate = [position];\r\n }\r\n // console.log(positionsDataToUpdate);\r\n await this.navigationService.updateNavigation({\r\n id: navID,\r\n positionOnPlan: positionsDataToUpdate.map((entry) =>\r\n JSON.stringify(entry)\r\n ),\r\n });\r\n })\r\n );\r\n }\r\n this.matterportImportService.removeFrame();\r\n\r\n this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);\r\n alert(this.translate.instant('calibration.success'));\r\n }\r\n\r\n /** Reset the canvas */\r\n onReset() {\r\n this.reflectH = false;\r\n this.reflectV = false;\r\n this.preview = false;\r\n\r\n this.configureCanvas();\r\n }\r\n\r\n /** Cancel, leave */\r\n onCancel() {\r\n this.matterportImportService.removeFrame();\r\n this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);\r\n alert(this.translate.instant('calibration.canceled'));\r\n }\r\n\r\n async onFloorClick(floor) {\r\n this.currentFloor = floor;\r\n await this.matterportImportService.moveToFloor(floor.id);\r\n }\r\n\r\n onActivateZoomChange() {\r\n this.zoomCanBeChanged = !this.zoomCanBeChanged;\r\n const iframe = document.querySelector('#viewer-frame') as HTMLElement;\r\n if (iframe) {\r\n iframe.style.zIndex = this.zoomCanBeChanged ? '1' : '0';\r\n }\r\n }\r\n}\r\n","<div class=\"row mt-3\">\r\n <div class=\"col\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems'></lib-tab-navigation>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div id=\"rowCanvas\">\r\n <div #canvasDiv id=\"canvasDiv\">\r\n\r\n <div id=\"viewer-frame\" [style.pointer-events]=\"zoomCanBeChanged?'auto':'none'\">\r\n <!-- <div class=\"blur\"></div> -->\r\n </div>\r\n <canvas id=\"canvas\" [ngStyle]=\"{'opacity': (preview||loading) ? '1' : 'calc(' + opacity + '/ 100)'}\"></canvas>\r\n </div>\r\n\r\n <div class=\"calibration-tools container-fluid\" *ngIf=\"!(preview || loading)\">\r\n <h1>{{'Calibration tool' | translate}}</h1>\r\n <div class=\"tool\">\r\n <div class=\"row ms-0 me-0 legend\">\r\n <div class=\"legend-bar-indicator\" [ngStyle]=\"{'opacity': 'calc(' + (-(opacity-100)+10) + '/ 100)'}\">\r\n {{'Less' | translate}}</div>\r\n <div class=\"legend-title\">{{'Plan Opacity' | translate }}</div>\r\n <div class=\"legend-bar-indicator\" [ngStyle]=\"{'opacity': 'calc(' + (opacity+10) + '/ 100)'}\">{{'More' |\r\n translate}}</div>\r\n </div>\r\n <div class=\"row ms-0 me-0 \">\r\n <input [disabled]=\"false\" [ngModelOptions]=\"{standalone: true}\" [(ngModel)]=\"opacity\" type=\"range\"\r\n class=\"form-range\" min=\"0\" max=\"100\" value=\"50\" id=\"opacity\">\r\n </div>\r\n </div>\r\n <div class=\"tool\">\r\n <div class=\"row ms-0 me-0 \">\r\n <div class=\"label-legend\">{{'Change Visit Floor' | translate}}</div>\r\n <div ngbDropdown class=\"d-inline-block ms-3\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" ngbDropdownToggle>\r\n {{currentFloor ? currentFloor.id : ('Floor' | translate) }}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button ngbDropdownItem *ngFor=\"let floor of floors\" (click)=\"onFloorClick(floor)\">\r\n {{ floor.name.length > 0 ? floor.name : ('Floor ' + floor.id) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"tool\">\r\n <div class=\"row ms-0 me-0 \">\r\n <div class=\"tool-checkbox-container\">\r\n <div class=\"tool-checkbox-subcontainer\">\r\n <div class=\"label-legend me-3\">{{'Pan/Zoom Visit' | translate}} {{zoomCanBeChanged ? \"ON\" :\r\n \"OFF\"}}\r\n </div>\r\n <input type=\"checkbox\" (change)=\"onActivateZoomChange()\" style=\"margin-top: 5px;\">\r\n </div>\r\n <div class=\"card border-warning mb-3 mt-3\" *ngIf=\"zoomCanBeChanged\">\r\n <div class=\"card-body text-warning\">\r\n <h5 class=\"card-title\">{{\"calibration.wait-message\" | translate}}</h5>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"action\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onPreview()\"\r\n [disabled]=\"zoomCanBeChanged\">{{'Preview' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'Cancel' |\r\n translate}}</button>\r\n\r\n </div>\r\n\r\n </div>\r\n <div class=\"calibration-tools container-fluid\" *ngIf=\"preview\">\r\n <h1>{{'Validation' | translate}}</h1>\r\n <div class=\"action\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onSave()\">{{'Validate' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onReset()\">{{'Reset' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'Cancel' |\r\n translate}}</button>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"calibration-tools container-fluid\" *ngIf=\"loading\">\r\n <h3>{{\"Waiting for Matterport\" | translate}}...</h3>\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>","import { Component, OnInit } from '@angular/core';\r\nimport { UntypedFormGroup, UntypedFormBuilder, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { Zone, Space, Plan, MenuItem, SpaceService, PlanService, getMetaForImage, getSignedFile, downloadFileAsObject, downloadBlob, NavigatorService } from '@smarterplan/ngx-smarterplan-core';\r\nimport panzoom from 'panzoom';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-plans',\r\n templateUrl: './plans.component.html',\r\n styleUrls: ['./plans.component.scss']\r\n})\r\nexport class PlansComponent implements OnInit {\r\n\r\n spaceID: string;\r\n\r\n currentSpace: Space;\r\n\r\n plans: Plan[];\r\n\r\n // chosenPlan: Plan;\r\n\r\n indexDetails = -1;\r\n\r\n loading = false;\r\n\r\n uploadingPlan = false;\r\n\r\n planForm: UntypedFormGroup;\r\n\r\n isCurrentPlanForZone = false;\r\n\r\n canvas;\r\n\r\n scale: number;\r\n\r\n panzoom: any;\r\n\r\n currentZone: Zone;\r\n\r\n fileToUpload: File;\r\n\r\n chosenPlanIsPdf = false;\r\n\r\n zones: Zone[];\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n destroy$ = new Subject();\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private spaceService: SpaceService,\r\n private planService: PlanService,\r\n private fb: UntypedFormBuilder,\r\n private translate: TranslateService,\r\n private navigatorService: NavigatorService\r\n ) {\r\n this.navigatorService.locationIDChange\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((spaceID) => {\r\n this.router.navigate([\"dashboard/localisation\", spaceID, \"plans\"]);\r\n });\r\n\r\n this.route.params.subscribe((params) => {\r\n this.spaceID = params.id;\r\n this.getPlans();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (\r\n this.planService.getPlanFileCache() &&\r\n this.planService.getChosenPlan()\r\n ) {\r\n this.addPlanFromCache(\r\n this.planService.getPlanFileCache(),\r\n this.planService.getChosenPlan(),\r\n );\r\n this.planService.setPlanFileCache(null);\r\n }\r\n this.planService.setChosenPlan(null);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: \"Locations\", url: \"/localisation\" },\r\n {\r\n label: this.currentSpace.name,\r\n url: `/localisation/${this.currentSpace.id}`,\r\n },\r\n {\r\n label: \"Plans\",\r\n url: `/localisation/${this.currentSpace.id}/plans`,\r\n },\r\n ];\r\n }\r\n\r\n onGoBack() { }\r\n\r\n async onPlanClick(plan?: Plan) {\r\n if (plan) this.planService.setChosenPlan(plan);\r\n this.chosenPlanIsPdf = plan.annexe.includes(\"pdf\");\r\n if (!this.chosenPlanIsPdf) {\r\n setTimeout(() => {\r\n this.configureCanvas().then(() => {\r\n this.panzoom = panzoom(this.canvas, {\r\n bounds: true,\r\n boundsPadding: 0,\r\n maxZoom: 3.5,\r\n minZoom: 0.1,\r\n initialZoom: 0.5,\r\n });\r\n });\r\n }, 500);\r\n }\r\n }\r\n\r\n async configureCanvas() {\r\n this.uploadingPlan = true;\r\n const canvas = document.querySelector(\"#canvas\") as HTMLCanvasElement;\r\n const image = await getMetaForImage(this.getChoosenPlan().filepath);\r\n canvas.width = image.width;\r\n canvas.height = image.height;\r\n this.canvas = canvas;\r\n this.drawImage(this.getChoosenPlan().filepath);\r\n this.uploadingPlan = false;\r\n }\r\n\r\n drawImage(url: string, x = 0, y = 0) {\r\n const image = new Image();\r\n const context = this.canvas.getContext(\"2d\");\r\n const imageWidth = this.canvas.width;\r\n const imageHeight = this.canvas.height;\r\n image.addEventListener(\"load\", () => {\r\n context.drawImage(\r\n image,\r\n 0,\r\n 0,\r\n image.width,\r\n image.height,\r\n x,\r\n y,\r\n imageWidth,\r\n imageHeight,\r\n );\r\n });\r\n image.src = url;\r\n // image.crossOrigin = \"*\"; //need to download as png,\r\n // BUT: https://stackoverflow.com/questions/49503171/the-image-tag-with-crossorigin-anonymous-cant-load-success-from-s3\r\n }\r\n\r\n async getPlans() {\r\n this.loading = true;\r\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\r\n this.setupMenuItems();\r\n\r\n this.zones = this.currentSpace.zones.items;\r\n this.plans = await this.planService.getSingedPlansForSpace(this.spaceID);\r\n this.loading = false;\r\n if (this.plans.length === 1) {\r\n this.onPlanClick(this.plans[0]);\r\n }\r\n }\r\n\r\n getChoosenPlan() {\r\n return this.planService.getChosenPlan();\r\n }\r\n\r\n removeImage() {\r\n const context = this.canvas.getContext(\"2d\");\r\n context.clearRect(0, 0, 4096, 4096);\r\n }\r\n\r\n /**\r\n *\r\n */\r\n onCalibrateClick() {\r\n if (this.getChoosenPlan()) {\r\n this.router.navigate(\r\n [\"/dashboard/localisation\", this.spaceID, \"plan-calibration\"],\r\n { queryParams: { spaceID: this.spaceID } },\r\n );\r\n }\r\n }\r\n\r\n /**\r\n *\r\n */\r\n onEditClick() {\r\n if (this.getChoosenPlan()) {\r\n this.router.navigate(\r\n [\"/dashboard/localisation\", this.spaceID, \"plan-edit\"],\r\n { queryParams: { spaceID: this.spaceID } },\r\n );\r\n }\r\n }\r\n\r\n onUploadClick() {\r\n const inputFile = document.querySelector(\r\n \"#upload-file\",\r\n ) as HTMLInputElement;\r\n inputFile.click();\r\n }\r\n\r\n addPlan(target: EventTarget) {\r\n this.fileToUpload = (target as HTMLInputElement).files[0];\r\n this.planForm = this.fb.group({\r\n name: [this.fileToUpload.name, [Validators.required]],\r\n zoneID: [null, [Validators.required]],\r\n spaceID: this.spaceID,\r\n isModified: false,\r\n calibration: \"\",\r\n });\r\n }\r\n\r\n addPlanFromCache(file: File, plan: Plan) {\r\n this.fileToUpload = file;\r\n this.planForm = this.fb.group({\r\n name: [this.fileToUpload.name, [Validators.required]],\r\n zoneID: [plan ? plan.zoneID : null, [Validators.required]],\r\n spaceID: this.spaceID,\r\n isModified: !!plan,\r\n calibration:\r\n plan && plan.isModified && plan.calibration\r\n ? plan.calibration\r\n : \"\",\r\n });\r\n }\r\n\r\n async onSavePlan() {\r\n const formValue = this.planForm.value as Plan;\r\n formValue.isCurrentForZone = this.isCurrentPlanForZone;\r\n const createdPlan = await this.planService.createPlanWithAnnexe(\r\n formValue,\r\n this.fileToUpload,\r\n );\r\n const filepath = await getSignedFile(createdPlan.annexe);\r\n if (filepath) {\r\n createdPlan.filepath = filepath;\r\n }\r\n if (formValue.isCurrentForZone) {\r\n // set all other plans to not current\r\n this.planService.setAllPlansForZoneNotCurrent(\r\n createdPlan.zoneID,\r\n createdPlan.id,\r\n );\r\n }\r\n this.plans.push(createdPlan);\r\n this.planForm = null;\r\n this.fileToUpload = null;\r\n }\r\n\r\n onCancelUpload() {\r\n this.fileToUpload = null;\r\n this.planForm = null;\r\n }\r\n\r\n async onCurrentPlanClick() {\r\n await this.planService.updatePlan({\r\n id: this.getChoosenPlan().id,\r\n isCurrentForZone: this.getChoosenPlan().isCurrentForZone,\r\n });\r\n if (this.getChoosenPlan().isCurrentForZone) {\r\n this.planService.setAllPlansForZoneNotCurrent(\r\n this.getChoosenPlan().zoneID,\r\n this.getChoosenPlan().id,\r\n );\r\n }\r\n }\r\n\r\n async onDownloadClick() {\r\n const signedFile = await downloadFileAsObject(\r\n this.getChoosenPlan().annexe,\r\n );\r\n if (signedFile) {\r\n // @ts-ignore\r\n downloadBlob(signedFile.Body, this.getChoosenPlan().name);\r\n }\r\n }\r\n\r\n async onDownloadAsPng() {\r\n const canvas = document.querySelector(\"#canvas\") as HTMLCanvasElement;\r\n canvas.toBlob(function (blob) {\r\n downloadBlob(blob, \"plan-as-png.png\");\r\n });\r\n }\r\n\r\n async onRemoveClick() {\r\n const message = this.translate.instant(\"confirm.deletePlan\");\r\n if (window.confirm(message)) {\r\n await this.planService.deletePlan(this.getChoosenPlan());\r\n this.removeImage();\r\n this.planService.setChosenPlan(null);\r\n this.getPlans();\r\n }\r\n }\r\n}\r\n","<div class=\"container-fluid\" *ngIf=\"currentSpace\" class=\"dashboard-tab\">\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...</span>\r\n </div>\r\n </div>\r\n <div class=\"mt-3\" *ngIf=\"!plans && !loading\">\r\n <h4 style=\"font-weight: bold;\">{{'No imported plans' | translate }}</h4>\r\n <p>{{'For import from 3D visit: go Virtual Visits => Import Images' | translate}}</p>\r\n </div>\r\n <div class=\"row ms-1\">\r\n <div ngbDropdown class=\"d-inline-block me-3\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" ngbDropdownToggle>{{getChoosenPlan() ?\r\n getChoosenPlan().name: ('Choose Plan' | translate) }}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button ngbDropdownItem *ngFor=\"let plan of plans\" (click)=\"onPlanClick(plan)\">{{plan.name }}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"d-inline-block\" ngbDropdown #myDrop=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownManual\" ngbDropdownToggle>{{'Choose action' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownManual\">\r\n <button (click)=\"onCalibrateClick()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">{{'Calibrate' |\r\n translate}}</button>\r\n <button (click)=\"onEditClick()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">{{'Edit plan' |\r\n translate}}\r\n </button>\r\n <button (click)=\"onUploadClick()\" ngbDropdownItem>{{'Upload new plan' | translate}}</button>\r\n <button (click)=\"onDownloadClick()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">{{'Download plan' |\r\n translate}}</button>\r\n <button (click)=\"onRemoveClick()\" ngbDropdownItem\r\n [disabled]=\"!getChoosenPlan() || getChoosenPlan().isImportedMatterport\">{{'Delete plan' |\r\n translate}}</button>\r\n <!-- <button (click)=\"onDownloadAsPng()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">\r\n {{'Download plan as PNG' | translate}}</button> -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row mt-3 ms-0\">\r\n <h4 *ngIf=\"fileToUpload\">{{'New plan' | translate }}</h4>\r\n <input class=\"hidden\" type=\"file\" id=\"upload-file\" name=\"upload-file\" accept=\"image/png, image/jpeg, .pdf, .svg\"\r\n ngf-max-size=\"6MB\" (change)=\"addPlan($event.target)\">\r\n </div>\r\n <div class=\"col-md-6 mt-3\" *ngIf=\"planForm\">\r\n <form (ngSubmit)=\"onSavePlan()\" [formGroup]=\"planForm\">\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3\">{{'Name' | translate}} </label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3\">{{'Zone' | translate}} </label>\r\n <div class=\"col-sm-9\">\r\n <select class=\"form-control\" formControlName=\"zoneID\">\r\n <option *ngFor=\"let zone of zones\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3\">{{'Set as current plan for zone' | translate}}</label>\r\n <div class=\"col-sm-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isCurrentPlanForZone\" [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div>\r\n <button [disabled]=\"planForm.invalid\" type='submit' class=\"btn btn-label-file rounded-pill\">{{'Save' |\r\n translate}}</button>\r\n <button class=\"btn btn-label-file rounded-pill ms-3\" type=\"button\" (click)=\"onCancelUpload()\">{{'Cancel' |\r\n translate}}</button>\r\n </form>\r\n </div>\r\n <ul class=\"col-md-6 list-group list-group-flush\" *ngIf=\"getChoosenPlan()\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate }} : {{getChoosenPlan().name}} </li>\r\n <li class=\"list-group-item bg-transparent\"> {{'Plan is ' | translate }} :\r\n {{getChoosenPlan().calibration ? ('Calibrated' | translate) : ('Not calibrated' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Attributed to zone ' | translate }} :\r\n {{getChoosenPlan().zone ? getChoosenPlan().zone.name : 'None'}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Is current plan for zone ' | translate }} :\r\n <input type=\"checkbox\" [(ngModel)]=\"getChoosenPlan().isCurrentForZone\" (change)=\"onCurrentPlanClick()\">\r\n </li>\r\n\r\n </ul>\r\n\r\n <div class=\"row mt-4\">\r\n <div class=\"col-md-10\">\r\n <embed *ngIf=\"getChoosenPlan() && chosenPlanIsPdf\" [src]=\"getChoosenPlan().filepath | safeUrl\"\r\n type=\"application/pdf\" frameBorder=\"0\" scrolling=\"auto\" height=\"650px;\" width=\"100%\" />\r\n <div *ngIf=\"!chosenPlanIsPdf\" class=\"row\" style=\"height: 500px; overflow: hidden;\" id=\"canvasDiv\">\r\n <canvas id=\"canvas\" width=\"4096px\" height=\"4096px\">\r\n <!-- <img *ngIf=\"chosenPlan\" id=\"plan-image\" [src]=\"chosenPlan.filepath\" style=\"width: 100%;\"> -->\r\n </canvas>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, Input, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-chevron',\r\n templateUrl: './chevron.component.html',\r\n styleUrls: ['./chevron.component.scss']\r\n})\r\nexport class ChevronComponent implements OnInit {\r\n\r\n @Input() conditionShowing = false;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n}\r\n","<div style=\"height: 30px; width: 30px;\">\r\n <span class=\"icon-container\" >\r\n <div [class]=\"conditionShowing ? 'icon-img-up' : 'icon-img-down'\"></div>\r\n </span>\r\n</div>\r\n","import { Component, OnInit, ViewChild } from '@angular/core';\r\nimport {\r\n UntypedFormGroup,\r\n UntypedFormBuilder,\r\n Validators,\r\n AbstractControl,\r\n} from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { NgbModal, ModalDismissReasons } from '@ng-bootstrap/ng-bootstrap';\r\nimport {\r\n Node,\r\n Visit,\r\n MenuItem,\r\n MatterportImportService,\r\n CaptureService,\r\n NodeService,\r\n SpaceService,\r\n VisitService,\r\n CaptureViewer,\r\n Capture,\r\n ValidatorsService,\r\n NavigatorService,\r\n} from '@smarterplan/ngx-smarterplan-core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-visits',\r\n templateUrl: './visits.component.html',\r\n styleUrls: ['./visits.component.scss'],\r\n})\r\nexport class VisitsComponent implements OnInit {\r\n spaceId: string;\r\n\r\n visitIndexDetails = -1;\r\n\r\n visitForm: UntypedFormGroup;\r\n\r\n isEditing: boolean = false;\r\n\r\n visitSubmitted: boolean = false;\r\n\r\n captureDate: number;\r\n\r\n currentSpace = { zones: [] } as any;\r\n\r\n visits: Visit[] = [];\r\n\r\n closeResult: string;\r\n\r\n @ViewChild('content', { static: false }) private content;\r\n\r\n modalReference: any;\r\n\r\n canCancelImport = false;\r\n\r\n imagesProcessed: number = 0;\r\n\r\n totalImages: number = 0;\r\n\r\n imagesUploaded: number = 0;\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n errorForm: boolean = false;\r\n\r\n isProcessing = false;\r\n\r\n destroy$ = new Subject();\r\n\r\n constructor(\r\n private fb: UntypedFormBuilder,\r\n private matterportImportService: MatterportImportService,\r\n private captureService: CaptureService,\r\n private nodeService: NodeService,\r\n private spaceService: SpaceService,\r\n private route: ActivatedRoute,\r\n private modalService: NgbModal,\r\n private visitService: VisitService,\r\n public validatorsService: ValidatorsService,\r\n private translate: TranslateService,\r\n private navigatorService: NavigatorService,\r\n private router: Router,\r\n ) {\r\n this.matterportImportService.importingImages.pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n this.canCancelImport = true;\r\n });\r\n this.matterportImportService.sweepProcessedCount.pipe(takeUntil(this.destroy$)).subscribe((count) => {\r\n this.imagesProcessed = count + 1;\r\n });\r\n this.matterportImportService.totalSweepsCount.pipe(takeUntil(this.destroy$)).subscribe((count) => {\r\n this.totalImages = count;\r\n });\r\n\r\n this.navigatorService.locationIDChange\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((spaceID) => {\r\n this.router.navigate([\"dashboard/localisation\", spaceID, \"visits\"]);\r\n });\r\n\r\n this.route.params.subscribe((params) => {\r\n this.spaceId = params.id;\r\n this.resetVisits();\r\n });\r\n }\r\n\r\n async ngOnInit(): Promise<void> {\r\n this.spaceId = this.route.snapshot.paramMap.get('id');\r\n await this.resetVisits();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n\r\n /*\r\n Visit = {\r\n captureID: string,\r\n model3d: string,\r\n takenAt: number,\r\n spaceID: string,\r\n viewer: CaptureViewer,\r\n surface: number,\r\n node: Node,\r\n name?: string | null\r\n }\r\n */\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: 'Locations', url: '/localisation' },\r\n {\r\n label: this.currentSpace.name,\r\n url: `/localisation/${this.currentSpace.id}`,\r\n },\r\n {\r\n label: 'Virtual visits',\r\n url: `/localisation/${this.currentSpace.id}/visits`,\r\n },\r\n ];\r\n }\r\n\r\n onGoBack() {\r\n this.onCancel();\r\n }\r\n\r\n async resetVisits() {\r\n this.visits = [];\r\n this.currentSpace = await this.spaceService.getSpace(this.spaceId);\r\n this.setupMenuItems();\r\n await this.visitService\r\n .getVisitsForSpaceForUser(this.spaceId)\r\n .then((visits) => {\r\n if (visits) {\r\n this.visits = visits;\r\n }\r\n });\r\n }\r\n\r\n initVisitForm(input: Visit = null) {\r\n if (input) {\r\n this.visitForm = this.fb.group({\r\n captureID: input.captureID,\r\n nodeID: input.node.id,\r\n name: [input.name, [Validators.required]],\r\n model3D: [input.model3d, [Validators.required]],\r\n viewer: input.viewer ? input.viewer : CaptureViewer.MATTERPORT,\r\n surface: input.surface ? input.surface : null,\r\n });\r\n this.captureDate = input.takenAt;\r\n } else {\r\n this.visitForm = this.fb.group({\r\n model3D: [null, [Validators.required]],\r\n viewer: CaptureViewer.MATTERPORT,\r\n surface: null,\r\n name: [null, [Validators.required]],\r\n });\r\n }\r\n }\r\n\r\n async onToggleDetail(index) {\r\n this.visitIndexDetails = index === this.visitIndexDetails ? -1 : index;\r\n this.imagesUploaded = await this.matterportImportService.getUploadedImageCount(this.visits[index].model3d);\r\n }\r\n\r\n onAddVisit() {\r\n this.initVisitForm();\r\n this.menuItems.push({ label: 'New' });\r\n }\r\n\r\n onEdit(visit) {\r\n this.initVisitForm(visit);\r\n this.isEditing = true;\r\n this.menuItems.push({ label: visit.name });\r\n }\r\n\r\n async onSubmitVisit() {\r\n this.visitSubmitted = true;\r\n if (!this.visitForm.valid) {\r\n this.errorForm = true;\r\n return;\r\n }\r\n this.errorForm = false;\r\n const formValue = this.visitForm.value;\r\n const capture = {\r\n viewer: formValue.viewer,\r\n takenAt: this.captureDate,\r\n surface: formValue.surface,\r\n spaceID: this.currentSpace.id,\r\n } as Capture;\r\n\r\n if (this.isEditing) {\r\n capture.id = formValue.captureID;\r\n await this.captureService.updateCapture(capture);\r\n const node = {\r\n id: formValue.nodeID,\r\n model3D: formValue.model3D,\r\n metadata: formValue.name,\r\n } as Node;\r\n await this.nodeService.updateNode(node);\r\n } else {\r\n let createdNode;\r\n await this.captureService.createCapture(capture).then(async (res) => {\r\n if (res) {\r\n const node = {\r\n model3D: formValue.model3D,\r\n captureID: res.id,\r\n metadata: formValue.name,\r\n } as Node;\r\n createdNode = await this.nodeService.createNode(node);\r\n }\r\n });\r\n this.launchImport(\r\n formValue.model3D,\r\n formValue.surface,\r\n createdNode,\r\n false\r\n )\r\n .then((success) => {\r\n this.modalReference.close('import ended with success');\r\n })\r\n .catch((e) => {\r\n this.modalReference.close(`Error while import: ${e}`);\r\n alert(`Error while import: ${e} ${JSON.stringify(e)}`);\r\n this.onDelete({\r\n node: createdNode,\r\n captureID: createdNode.captureID,\r\n } as Visit, false);\r\n });\r\n }\r\n await this.resetVisits();\r\n this.onCancel();\r\n }\r\n\r\n get model3D(): AbstractControl {\r\n return this.visitForm.get('model3D');\r\n }\r\n\r\n get name(): AbstractControl {\r\n return this.visitForm.get('name');\r\n }\r\n\r\n onCancel() {\r\n this.visitSubmitted = false;\r\n this.visitForm = null;\r\n this.isEditing = false;\r\n this.canCancelImport = false;\r\n this.totalImages = 0;\r\n this.imagesProcessed = 0;\r\n this.errorForm = false;\r\n this.setupMenuItems();\r\n }\r\n\r\n async onDelete(visit: Visit, needPermission = true) {\r\n const message = this.translate.instant('confirm.deleteVisit');\r\n // eslint-disable-next-line no-alert\r\n if (window.confirm(message) || !needPermission) {\r\n console.log(this.visitIndexDetails);\r\n this.isProcessing = true;\r\n await this.visitService.deleteVisit(visit, this.spaceId);\r\n await this.resetVisits();\r\n this.isProcessing = false;\r\n }\r\n }\r\n\r\n private getDismissReason(reason: any): string {\r\n if (reason === ModalDismissReasons.ESC) {\r\n return 'by pressing ESC';\r\n }\r\n if (reason === ModalDismissReasons.BACKDROP_CLICK) {\r\n return 'by clicking on a backdrop';\r\n }\r\n return `with: ${reason}`;\r\n }\r\n\r\n async launchImport(\r\n model3D,\r\n surface,\r\n node,\r\n imagesOnly = false,\r\n overrideExisting = false,\r\n ) {\r\n this.modalReference = this.modalService.open(this.content, {\r\n ariaLabelledBy: \"modal-basic-title\",\r\n });\r\n this.modalReference.result.then(\r\n (result) => {\r\n this.closeResult = `Closed with: ${result}`;\r\n console.log(this.closeResult);\r\n this.cancelImport();\r\n },\r\n (error) => {\r\n this.closeResult = `Dismissed ${this.getDismissReason(error)}`;\r\n console.log(this.closeResult);\r\n this.cancelImport();\r\n },\r\n );\r\n try {\r\n await this.matterportImportService.initSdkForModel(model3D);\r\n\r\n await this.matterportImportService.importData(\r\n this.spaceId,\r\n surface,\r\n imagesOnly,\r\n node,\r\n overrideExisting\r\n );\r\n\r\n this.modalReference.close();\r\n\r\n } catch (error) {\r\n console.log(error);\r\n Promise.reject(error);\r\n }\r\n }\r\n\r\n private cancelImport() {\r\n this.matterportImportService.abandon();\r\n this.onCancel();\r\n this.resetVisits();\r\n }\r\n\r\n onImportImages(visit: Visit, overrideExisting) {\r\n this.launchImport(visit.model3d, null, visit.node.id, true, overrideExisting);\r\n }\r\n\r\n isFormError(control) {\r\n return control && control.invalid && this.errorForm;\r\n }\r\n}\r\n","<div class=\"container-fluid\" class=\"dashboard-tab\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\r\n </div>\r\n\r\n <div class=\"row main-form-container\">\r\n <div class=\"col-md-6 form-container\">\r\n <ul class=\"list-group list-group-flush\" *ngIf=\"!visitForm\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let visit of visits; index as index\">\r\n <div class=\"d-flex justify-content-between align-items-center\" (click)=\"onToggleDetail(index)\">\r\n {{visit.name ? visit.name : visit.model3d }}\r\n <lib-chevron [conditionShowing]=\"index==visitIndexDetails\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"index==visitIndexDetails\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}} : {{ visit.name ?\r\n visit.name : \"Not provided\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'3D Model' | translate}} : {{ visit.model3d }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Surface' | translate}}, m<sup>2</sup>: {{\r\n visit.surface ?\r\n visit.surface : 'Not provided' | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Viewer' | translate}} : {{ visit.viewer }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Date of capture' | translate}} : {{\r\n visit.takenAt | timeDateString | async}}\r\n <li class=\"list-group-item bg-transparent\">{{'Images are imported' | translate}} : {{\r\n imagesUploaded }}\r\n </li>\r\n </ul>\r\n \r\n <lib-loader *ngIf=\"isProcessing\"></lib-loader>\r\n\r\n <div class=\"action-button-container mt-3\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onImportImages(visit, true)\" [disabled]=\"isProcessing\">{{'Import all images' |\r\n translate}}</button>\r\n <button type=\"button\" *ngIf=\"imagesUploaded > 0\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onImportImages(visit, false)\" [disabled]=\"isProcessing\">{{'Import from image' |\r\n translate}} {{imagesUploaded}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" [disabled]=\"isProcessing\"\r\n (click)=\"onEdit(visit)\">{{'Edit' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" [disabled]=\"isProcessing\"\r\n (click)=\"onDelete(visit)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n <div *ngIf=\"visitForm\">\r\n <form (ngSubmit)=\"onSubmitVisit()\" [formGroup]=\"visitForm\">\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Reference 3D model' | translate}} *</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" [readonly]=\"isEditing\"\r\n [class.is-invalid]=\"model3D.invalid && visitSubmitted\" required\r\n formControlName=\"model3D\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-name-invalid\" [dismissible]=\"false\" type=\"danger\" \r\n *ngIf=\"validatorsService.isControlError(visitForm.controls['name']) \r\n || isFormError(visitForm.controls['name'])\">\r\n {{validatorsService.getError(visitForm.controls['name']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n <div *ngIf=\"isEditing\" class=\"text-danger\">\r\n {{'Cannot change 3D model reference. Please add new model.' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Viewer' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"viewer\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Surface' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"surface\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Capture Date' | translate}}</label>\r\n <div class=\"input-group\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"captureDate\" ngbDatepicker\r\n #d1=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\"\r\n type=\"button\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill me-2\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\r\n translate}}</button>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"new-location-form-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n \r\n </ngb-alert>\r\n </div>\r\n </form>\r\n </div>\r\n <div *ngIf=\"!visitForm\">\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onAddVisit()\">{{'Add 3D visit' |\r\n translate}}</button>\r\n </div>\r\n </div>\r\n <div id=\"viewer-frame\" style=\"width: 100%; aspect-ratio: 2/1;\"></div>\r\n </div>\r\n <ng-template #content let-modal>\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\" id=\"modal-basic-title\">{{'Importing Data' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n {{'Please do not leave or refresh this page...' | translate}}\r\n <div *ngIf=\"totalImages != 0\">Imported {{imagesProcessed}} out of {{totalImages}} images.</div>\r\n <div class=\"d-flex justify-content-center\">\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>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-outline-dark\" [disabled]=\"!canCancelImport\"\r\n (click)=\"modal.close('Cancel click')\">{{'Cancel import of images' | translate}}</button>\r\n </div>\r\n </ng-template>\r\n</div>","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-carousel',\r\n templateUrl: './carousel.component.html',\r\n styleUrls: ['./carousel.component.scss']\r\n})\r\nexport class CarouselComponent implements OnInit {\r\n\r\n @Input() images;\r\n\r\n @Output() currentScan = new EventEmitter<number>();\r\n\r\n dataEvent: string;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n this.currentScan.emit(0);\r\n }\r\n\r\n onSlide(event) {\r\n this.dataEvent = JSON.stringify(event);\r\n const imageIndex = Number.parseInt(\r\n event.current.replace(\"slideId_\", \"\"),\r\n 10,\r\n );\r\n this.currentScan.emit(imageIndex);\r\n }\r\n\r\n}\r\n","<ngb-carousel [interval]=\"5000\" *ngIf=\"images && images.length > 1\" (slide)=\"onSlide($event)\">\r\n <ng-template *ngFor=\"let image of images; let i = index\" ngbSlide [id]=\"'slideId_' + i\">\r\n <div class=\"picsum-img-wrapper\">\r\n <img [src]=\"image.path\" alt=\"Scan\" class=\"d-block w-100\">\r\n </div>\r\n <div class=\"carousel-caption\">\r\n <h3>{{image.title}}</h3>\r\n <p>{{image.description}}</p>\r\n </div>\r\n </ng-template>\r\n</ngb-carousel>\r\n\r\n<img *ngIf=\"images.length === 1\" [src]=\"images[0].path\" alt=\"Scan\" class=\"d-block w-100\">\r\n","export type Rectangle = {\r\n top: number;\r\n left: number;\r\n width: number;\r\n height: number;\r\n};\r\n\r\nexport enum SweepState {\r\n ADDED,\r\n REMOVED,\r\n DISABLED,\r\n OCCUPIED,\r\n STARTPOINT\r\n}\r\n\r\nexport function isInPolygon(p: { x: any; y: any; }, polygon: string | any[]): boolean {\r\n\r\n let isInside = false;\r\n let minX = polygon[0].x;\r\n let maxX = polygon[0].x;\r\n let minY = polygon[0].y;\r\n let maxY = polygon[0].y;\r\n for (let n = 1; n < polygon.length; n++) {\r\n const q = polygon[n];\r\n minX = Math.min(q.x, minX);\r\n maxX = Math.max(q.x, maxX);\r\n minY = Math.min(q.y, minY);\r\n maxY = Math.max(q.y, maxY);\r\n }\r\n\r\n if (p.x < minX || p.x > maxX || p.y < minY || p.y > maxY) {\r\n return false;\r\n }\r\n\r\n for (\r\n let index = 0, index_ = polygon.length - 1;\r\n index < polygon.length;\r\n index_ = index++\r\n ) {\r\n if (\r\n polygon[index].y > p.y !== polygon[index_].y > p.y &&\r\n p.x <\r\n ((polygon[index_].x - polygon[index].x) *\r\n (p.y - polygon[index].y)) /\r\n (polygon[index_].y - polygon[index].y) +\r\n polygon[index].x\r\n ) {\r\n isInside = !isInside;\r\n }\r\n }\r\n return isInside;\r\n}\r\n\r\nexport function rotate(point: { x: any; y: any; }, center: { x: any; y: any; }, angle: number) {\r\n let xM;\r\n let yM;\r\n let x;\r\n let y;\r\n angle *= Math.PI / 180;\r\n xM = point.x - center.x;\r\n yM = point.y - center.y;\r\n x = xM * Math.cos(angle) + yM * Math.sin(angle) + center.x;\r\n y = -xM * Math.sin(angle) + yM * Math.cos(angle) + center.y;\r\n return { x: Math.round(x), y: Math.round(y) };\r\n}\r\n\r\n/**\r\n * Check if an HtmlElement is inside a selection\r\n * @param button HTMLElement\r\n * @param selection\r\n * @returns true if the element is inside the selection, false otherwise\r\n */\r\nexport function buttonIsInSelection(\r\n button: HTMLButtonElement,\r\n selection: Rectangle,\r\n): boolean {\r\n const bounds = button.getBoundingClientRect();\r\n return (\r\n bounds.bottom > selection.top &&\r\n bounds.top < selection.top + selection.height &&\r\n bounds.right > selection.left &&\r\n bounds.left < selection.left + selection.width\r\n );\r\n}\r\n\r\n/**\r\n * Styles the button that represents a sweep on the plan: green-added to zone, red -not added, gray - disabled, orange - occupied\r\n * @param button HTMLButtonElement, button on the plan, \r\n * @param isAdded boolean, if the sweep added to the zone\r\n * @param isOccupied boolean, if the sweep added to any other zone (but not current)\r\n */\r\nexport function styleButton(button: HTMLButtonElement, state: SweepState) {\r\n switch (state) {\r\n case SweepState.ADDED:\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\r\n break;\r\n case SweepState.DISABLED:\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=black&height=17&width=17\")`;\r\n button.style.cursor = \"auto\";\r\n break;\r\n case SweepState.OCCUPIED:\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`;\r\n break;\r\n case SweepState.STARTPOINT:\r\n button.style.backgroundImage = `url('https://api.iconify.design/ic/baseline-flag-circle.svg?color=white&width=17&height=17')`;\r\n break;\r\n case SweepState.REMOVED:\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\r\n break;\r\n default:\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\r\n break;\r\n }\r\n // if (disabled) {\r\n // button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=#636363&height=17&width=17\")`;\r\n // button.style.cursor = \"auto\";\r\n // } else if (isOccupied) {\r\n // button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`;\r\n // } else {\r\n // button.style.backgroundImage = isAdded\r\n // ? `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`\r\n // : `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\r\n // }\r\n button.style.backgroundColor = \"transparent\";\r\n button.style.position = \"absolute\";\r\n button.style.border = \"none\";\r\n button.style.width = \"17px\";\r\n button.style.height = \"17px\";\r\n button.disabled = false;\r\n button.type = \"button\";\r\n}\r\n\r\n/**\r\n * Check if sweep (button) is chosen; it is reprsented by image style \"mdi:adjust\"\r\n * @param button HTMLElement\r\n * @returns boolean, if button was selected\r\n */\r\nexport function buttonIsChosen(button: HTMLElement): boolean {\r\n return button.style.backgroundImage.includes(\"adjust\");\r\n}\r\n\r\n/**\r\n * Visually change the state of a scan button, a selected button is blue\r\n * @param button HTMLElement\r\n * @param selected if true the button will be blue, otherwise it will red or green\r\n */\r\nexport function setVisuallySelected(button: HTMLElement, selected: boolean) {\r\n if (selected) {\r\n /** Color in blue */\r\n button.style.backgroundImage = button.style.backgroundImage\r\n .replace(\"red\", \"blue\")\r\n .replace(\"green\", \"blue\");\r\n } else {\r\n /** Get back in red or green */\r\n const color = buttonIsChosen(button) ? \"green\" : \"red\";\r\n button.style.backgroundImage = button.style.backgroundImage.replace(\r\n \"blue\",\r\n color,\r\n );\r\n }\r\n}","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\r\nimport { Rectangle } from '../../../../helper.service';\r\n\r\n@Component({\r\n selector: 'lib-selection',\r\n templateUrl: './selection.component.html',\r\n styleUrls: ['./selection.component.scss']\r\n})\r\nexport class SelectionComponent implements OnInit {\r\n constructor(){}\r\n\r\n /**Emit a new selection */\r\n @Output() onSelectionChanged = new EventEmitter<Rectangle>();\r\n\r\n /**Zone wich you can use a selection inside, must have the class \".selectZone\" */\r\n selectionableZone : HTMLElement;\r\n\r\n /**HtmlElement use to display the selected zone (blue) */\r\n selectionElement : HTMLElement;\r\n\r\n isMousedown : boolean = false;\r\n\r\n selection = {startX: 0, startY: 0, endX: 0, endY: 0};\r\n\r\n selectionRectangle : Rectangle = {top : 0, left: 0, width: 0, height: 0};\r\n\r\n ngOnInit(): void {\r\n this.selectionableZone = document.querySelector(\".selectZone\");\r\n\r\n this.selectionElement = document.querySelector(\"#selection\");\r\n\r\n this.selectionableZone.addEventListener(\"mousedown\",this.mousedown.bind(this));\r\n\r\n this.selectionableZone.addEventListener(\"mousemove\",this.mousemove.bind(this));\r\n\r\n this.selectionableZone.addEventListener(\"mouseup\",this.mouseup.bind(this));\r\n }\r\n \r\n /**\r\n * Update the current selection\r\n * Will update the selectionRectangle and Selection HTML element\r\n * @param shouldEmit if true an event will be emitted through onSelectionChanged (true by default)\r\n */\r\n updateSelectionElement(shouldEmit=true){\r\n this.selectionRectangle.width = Math.abs(this.selection.endX - this.selection.startX);\r\n this.selectionRectangle.height = Math.abs(this.selection.endY - this.selection.startY);\r\n this.selectionRectangle.top = Math.min(this.selection.endY, this.selection.startY);\r\n this.selectionRectangle.left = Math.min(this.selection.endX, this.selection.startX);\r\n\r\n this.selectionElement.style.top = `${this.selectionRectangle.top}px`;\r\n this.selectionElement.style.left = `${this.selectionRectangle.left}px`;\r\n this.selectionElement.style.width = `${this.selectionRectangle.width}px`;\r\n this.selectionElement.style.height = `${this.selectionRectangle.height}px`;\r\n\r\n if(shouldEmit){\r\n this.onSelectionChanged.emit(this.selectionRectangle);\r\n }\r\n }\r\n\r\n /**\r\n * Trigger when mouse is press down on selectionableZone\r\n * @param event \r\n */\r\n mousedown(event : MouseEvent){\r\n if(event.button !== 2){ /**Selection with the right click, so ignore all other event */\r\n return;\r\n }\r\n this.isMousedown = true;\r\n this.selection = {startY : event.clientY, startX : event.clientX, endX:event.clientX, endY:event.clientY};\r\n this.updateSelectionElement(); \r\n }\r\n\r\n /**\r\n * Trigger when mouse is release on selectionableZone\r\n * @param event \r\n */\r\n mouseup(event : MouseEvent){\r\n this.isMousedown = false;\r\n this.selection = {startX :0, startY : 0, endX:0, endY:0};\r\n this.updateSelectionElement(false); \r\n }\r\n\r\n /**\r\n * Trigger when mouse is moving on selectionableZone\r\n * @param event \r\n */\r\n mousemove(event : MouseEvent){\r\n if(this.isMousedown){\r\n this.selection.endX = event.clientX;\r\n this.selection.endY = event.clientY;\r\n this.updateSelectionElement();\r\n }\r\n }\r\n\r\n}\r\n","<ng-content></ng-content>\r\n\r\n<div id=\"selection\"></div>","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-radio-button',\r\n templateUrl: './radio-button.component.html',\r\n styleUrls: ['./radio-button.component.scss']\r\n})\r\nexport class RadioButtonComponent implements OnInit {\r\n\r\n @Input() label: string;\r\n\r\n @Output() isCheckedEvent = new EventEmitter<boolean>();\r\n\r\n isChecked: boolean;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n this.isChecked = false;\r\n }\r\n\r\n onChecked() {\r\n this.isCheckedEvent.emit(this.isChecked);\r\n }\r\n\r\n}\r\n","<div class=\"checkboxContainer\">\r\n <div class=\"switchContainer\">\r\n <label class=\"switch switch-success\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isChecked\" (change)=\"onChecked()\">\r\n <span class=\"slider round\"></span>\r\n </label>\r\n </div>\r\n <span class=\"label right\">{{label | translate}}</span>\r\n</div>","import { Component, OnInit, Input, OnChanges } from '@angular/core';\r\nimport { TranslateService } from \"@ngx-translate/core\";\r\n\r\n@Component({\r\n selector: 'lib-plan-legend',\r\n templateUrl: './plan-legend.component.html',\r\n styleUrls: ['./plan-legend.component.scss']\r\n})\r\nexport class PlanLegendComponent implements OnInit {\r\n @Input() isAudioZone?:boolean = false;\r\n\r\n buttonsToRender = [];\r\n\r\n colorToText = {};\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n ) {}\r\n\r\n async ngOnInit() {\r\n this.render()\r\n }\r\n\r\n async render() {\r\n this.buttonsToRender = [\r\n {\r\n url: `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`,\r\n text: this.translate.instant(\"legend.green\")\r\n },\r\n {\r\n url: `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`,\r\n text: this.translate.instant(\"legend.red\")\r\n }\r\n ]\r\n if (this.isAudioZone) {\r\n let audioPoints = [{\r\n url: `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=black&height=17&width=17\")`,\r\n text: this.translate.instant(\"legend.black\")\r\n },\r\n {\r\n url: `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`,\r\n text: this.translate.instant(\"legend.orange\")\r\n }]\r\n this.buttonsToRender = this.buttonsToRender.concat(audioPoints)\r\n }\r\n }\r\n\r\n //styleButton(element, SweepState.DISABLED);\r\n\r\n}\r\n","<div class=\"mt-3 ms-3\" class=\"legendContainer\">\r\n <h5>{{\"legend.title\" | translate}}</h5>\r\n <div class=\"legendBox\">\r\n <div class=\"legendRow\" *ngFor=\"let elemnt of buttonsToRender\">\r\n <button class=\"legendIcon\" [ngStyle] = \"{'background-image': elemnt.url}\"></button>\r\n <span>{{elemnt.text}}</span>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { getCoefficientsForImage, getMetaForImage, Navigation, NavigationService, Plan, Zone, showScanPointsOnPlanInDiv, ZoneService, PlanService } from '@smarterplan/ngx-smarterplan-core';\r\nimport panzoom, { PanZoom } from 'panzoom';\r\nimport { buttonIsInSelection, isInPolygon, Rectangle, rotate, setVisuallySelected, styleButton, SweepState } from '../../../../helper.service';\r\n\r\n@Component({\r\n selector: 'lib-sweep-plan-selection',\r\n templateUrl: './sweep-plan-selection.component.html',\r\n styleUrls: ['./sweep-plan-selection.component.scss']\r\n})\r\nexport class SweepPlanSelectionComponent implements OnInit {\r\n\r\n plans: Plan[];\r\n\r\n @Input() spaceID: string;\r\n\r\n @Input() chosenScansOnPlan: string[] = [];\r\n\r\n /** if comming from Edit Plan SVG Zone creation */\r\n @Input() newZoneData: any;\r\n\r\n navIDsZoneEdit: string[] = [];\r\n\r\n // sweeps belonging to any audio zone\r\n @Input() occupiedSweeps: string[] = [];\r\n\r\n // sweeps unavailable (cannot be chosen)\r\n @Input() unavailableSweeps: string[] = [];\r\n\r\n // if choosing sweeps for audio zone\r\n @Input() editingAudioZone: boolean = false;\r\n\r\n @Input() inputZone: Zone;\r\n\r\n @Input() multipleFloors: boolean = false;\r\n\r\n chosenPlan: Plan;\r\n\r\n /** panZoom element for adding scans */\r\n panZoom: PanZoom;\r\n\r\n /** divPlan (use By panZoom) */\r\n divPlan: HTMLElement;\r\n\r\n /** all scan buttons Element */\r\n buttonElements: HTMLButtonElement[] = [];\r\n\r\n /** Scan buttons that are in the current selection */\r\n buttonsInSelection: HTMLButtonElement[] = [];\r\n\r\n @Output() sweepsSelected = new EventEmitter<{ sweeps: string[]; startSweepID: string; }>();\r\n\r\n isSettingStartSweep = false;\r\n\r\n startSweepID: string;\r\n\r\n chosenSweepsPerFloor = new Map<string, string[]>(); // map matching floorID to sweeps selected\r\n\r\n inputSweepsPerFloor = new Map<string, string[]>(); // map matching floorID to sweeps selected for zone in edition\r\n\r\n selectionChanged = false;\r\n\r\n constructor(\r\n private zoneService: ZoneService,\r\n private navigationService: NavigationService,\r\n private planService: PlanService,\r\n private translate: TranslateService,\r\n ) { }\r\n\r\n async ngOnInit() {\r\n await this.getPlans();\r\n this.setSweepsOfInputZone();\r\n }\r\n\r\n ngOnChanges() {\r\n if (this.chosenPlan) {\r\n this.setSweepsOfInputZone();\r\n this.chosenScansOnPlan = [];\r\n this.clearDivPlan();\r\n this.addScanPoints();\r\n }\r\n }\r\n\r\n setSweepsOfInputZone() {\r\n this.navIDsZoneEdit = this.inputZone ? this.inputZone.sweepIDs : [];\r\n if (this.multipleFloors) {\r\n this.plans.forEach((plan) => {\r\n if (!this.inputSweepsPerFloor.get(plan.zoneID)) {\r\n this.inputSweepsPerFloor.set(plan.zoneID,\r\n this.navIDsZoneEdit.filter((sweep) => plan.zone.sweepIDs.includes(sweep)));\r\n }\r\n });\r\n } else {\r\n if (this.inputZone) {\r\n //filter plans only for the parent Zone\r\n this.plans = this.plans.filter((p) => p.zoneID === this.inputZone.parentID);\r\n }\r\n }\r\n }\r\n\r\n async getPlans() {\r\n this.plans = await this.planService.getSingedPlansForSpace(\r\n this.spaceID,\r\n );\r\n }\r\n\r\n async onPlanClick(plan: Plan) {\r\n const switchPlan = () => {\r\n this.selectionChanged = false;\r\n this.chosenPlan = plan;\r\n this.chosenScansOnPlan = [];\r\n this.clearDivPlan();\r\n this.addScanPoints();\r\n };\r\n if (this.selectionChanged) {\r\n const message = this.translate.instant(\"confirm.cancelModifZoneSweeps\");\r\n if (window.confirm(message)) {\r\n switchPlan();\r\n }\r\n } else {\r\n switchPlan();\r\n }\r\n }\r\n\r\n async addScanPoints() {\r\n let wasModified = false;\r\n if (this.multipleFloors) {\r\n // check if we have already validated buttons for this floor\r\n if (this.chosenSweepsPerFloor.get(this.chosenPlan.zoneID)) {\r\n this.chosenScansOnPlan = this.chosenSweepsPerFloor.get(this.chosenPlan.zoneID);\r\n wasModified = true;\r\n }\r\n }\r\n this.divPlan = document.querySelector(\"#planDiv\") as HTMLElement;\r\n const zoneOfPlan = await this.zoneService.getZone(\r\n this.chosenPlan.zoneID,\r\n );\r\n const navigations = await this.navigationService.getNavigationsForZone(\r\n zoneOfPlan,\r\n );\r\n if (this.newZoneData) await this.setScanByDraw(navigations);\r\n this.buttonElements = await showScanPointsOnPlanInDiv(\r\n this.chosenPlan,\r\n this.divPlan,\r\n navigations,\r\n );\r\n for (const element of this.buttonElements) {\r\n if (this.unavailableSweeps && this.unavailableSweeps.includes(element.id)) {\r\n styleButton(element, SweepState.DISABLED);\r\n } else {\r\n\r\n if (wasModified) {\r\n if (this.chosenScansOnPlan.includes(element.id)) {\r\n styleButton(element, SweepState.ADDED);\r\n } else {\r\n styleButton(element, SweepState.REMOVED);\r\n }\r\n } else {\r\n if (\r\n this.navIDsZoneEdit.length > 0 &&\r\n this.navIDsZoneEdit.includes(element.id)) {\r\n styleButton(element, SweepState.ADDED);\r\n if (!this.chosenScansOnPlan.includes(element.id)) {\r\n this.chosenScansOnPlan.push(element.id);\r\n }\r\n } else if (this.occupiedSweeps && this.occupiedSweeps.includes(element.id)) {\r\n styleButton(element, SweepState.OCCUPIED);\r\n } else {\r\n styleButton(element, SweepState.REMOVED);\r\n }\r\n }\r\n\r\n //start point should be last condition \r\n if (this.inputZone && this.inputZone.startSweepID === element.id) {\r\n console.log(\"setting start point\");\r\n styleButton(element, SweepState.STARTPOINT);\r\n }\r\n element.addEventListener(\"click\", (event) =>\r\n this.onButtonScanClicked(event.target as HTMLElement),\r\n );\r\n }\r\n }\r\n this.panZoom = panzoom(this.divPlan, {\r\n bounds: true,\r\n boundsPadding: 0,\r\n maxZoom: 3.5,\r\n beforeMouseDown(e: MouseEvent) {\r\n return (\r\n e.button === 2\r\n ); /** Ignore event for right click (use for selecting) */\r\n },\r\n });\r\n if (this.multipleFloors) {\r\n this.chosenSweepsPerFloor.set(this.chosenPlan.zoneID, [...this.chosenScansOnPlan]);\r\n }\r\n }\r\n\r\n /** Function if we are coming for svg editor workflow */\r\n setScanByDraw(navigations: any[]): Promise<void> {\r\n return new Promise(async (resolve) => {\r\n const rect = {\r\n width: this.newZoneData.width,\r\n height: this.newZoneData.height,\r\n };\r\n const img = await getMetaForImage(this.chosenPlan.filepath);\r\n const { coeffX, coeffY } = getCoefficientsForImage(img, rect);\r\n\r\n const draw = this.newZoneData.elements;\r\n\r\n draw.map(async (element: any) => {\r\n switch (element.nodeName) {\r\n case \"rect\":\r\n await this.setScanInRect(\r\n img,\r\n coeffX,\r\n coeffY,\r\n element,\r\n navigations,\r\n );\r\n break;\r\n\r\n case \"ellipse\":\r\n await this.setScanInCircle(\r\n img,\r\n coeffX,\r\n coeffY,\r\n element,\r\n navigations,\r\n );\r\n break;\r\n\r\n case \"path\":\r\n await this.setScanInPolygon(\r\n img,\r\n coeffX,\r\n coeffY,\r\n element,\r\n navigations,\r\n );\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n\r\n resolve();\r\n });\r\n }\r\n\r\n async setScanInRect(img: any, coeffX: number, coeffY: number,\r\n element: { angle: any; cx: any; cy: any; x: number; width: any; y: number; height: any; }, navigations: any[]) {\r\n const calibrage = JSON.parse(this.chosenPlan.calibration);\r\n navigations.map((navigation) => {\r\n const positionsOnPlan = navigation.positionOnPlan.map((entry) =>\r\n JSON.parse(entry),\r\n );\r\n const positionOnPlan = positionsOnPlan.find(\r\n (data) => data.planID === this.chosenPlan.id,\r\n );\r\n if (positionOnPlan) {\r\n const realWidth = img.width / coeffX;\r\n const realHeight = img.height / coeffY;\r\n const navY = (positionOnPlan.y * realHeight) / calibrage.imgHeight;\r\n const navX = (positionOnPlan.x * realWidth) / calibrage.imgWidth;\r\n if (\r\n navX > element.x &&\r\n navX < element.x + element.width &&\r\n navY > element.y &&\r\n navY < element.y + element.height &&\r\n !this.navIDsZoneEdit.includes(navigation.id)\r\n ) {\r\n this.navIDsZoneEdit.push(navigation.id);\r\n }\r\n }\r\n\r\n // old calibration:\r\n // const position = JSON.parse(navigation.position);\r\n // let navX = (calibrage.offsetX + position.x * calibrage.x) / coeffX;\r\n // let navY = (calibrage.offsetY + position.z * calibrage.y) / coeffY;\r\n // if (element.angle) {\r\n // const rotatePos = rotate(\r\n // { x: navX, y: navY },\r\n // { x: element.cx, y: element.cy },\r\n // element.angle,\r\n // );\r\n // navX = rotatePos.x;\r\n // navY = rotatePos.y;\r\n // }\r\n /**\r\n * TODO calculer la rotation du rectangle\r\n */\r\n // if (\r\n // navX > element.x &&\r\n // navX < element.x + element.width &&\r\n // navY > element.y &&\r\n // navY < element.y + element.height &&\r\n // !this.navIDsZoneEdit.includes(navigation.id)\r\n // ) {\r\n // this.navIDsZoneEdit.push(navigation.id);\r\n // }\r\n });\r\n } // EO\r\n\r\n async setScanInCircle(img: any, coeffX: number, coeffY: number,\r\n element: { angle: any; cx: number; cy: number; rx: number; ry: number; }, navigations: Navigation[]) {\r\n const calibrage = JSON.parse(this.chosenPlan.calibration);\r\n navigations.map(navigation => {\r\n const positionsOnPlan = navigation.positionOnPlan.map((entry) =>\r\n JSON.parse(entry),\r\n );\r\n const positionOnPlan = positionsOnPlan.find(\r\n (data) => data.planID === this.chosenPlan.id,\r\n );\r\n if (positionOnPlan) {\r\n const realWidth = img.width / coeffX;\r\n const realHeight = img.height / coeffY;\r\n let navY = (positionOnPlan.y * realHeight) / calibrage.imgHeight;\r\n let navX = (positionOnPlan.x * realWidth) / calibrage.imgWidth;\r\n if (element.angle) {\r\n const rotatePos = rotate(\r\n { x: navX, y: navY },\r\n { x: element.cx, y: element.cy },\r\n element.angle,\r\n );\r\n navX = rotatePos.x;\r\n navY = rotatePos.y;\r\n }\r\n\r\n const valueX =\r\n Math.pow(navX - element.cx, 2) / Math.pow(element.rx, 2);\r\n const valueY =\r\n Math.pow(navY - element.cy, 2) / Math.pow(element.ry, 2);\r\n const result = valueX + valueY;\r\n if (result <= 1 && !this.navIDsZoneEdit.includes(navigation.id)) {\r\n this.navIDsZoneEdit.push(navigation.id);\r\n }\r\n }\r\n\r\n // old calibration\r\n // const position = JSON.parse(navigation.position);\r\n // let navX = (calibrage.offsetX + position.x * calibrage.x) / coeffX;\r\n // let navY = (calibrage.offsetY + position.z * calibrage.y) / coeffY;\r\n // if (element.angle) {\r\n // const rotatePos = rotate(\r\n // { x: navX, y: navY },\r\n // { x: element.cx, y: element.cy },\r\n // element.angle,\r\n // );\r\n // navX = rotatePos.x;\r\n // navY = rotatePos.y;\r\n // }\r\n\r\n // const valueX =\r\n // Math.pow(navX - element.cx, 2) / Math.pow(element.rx, 2);\r\n // const valueY =\r\n // Math.pow(navY - element.cy, 2) / Math.pow(element.ry, 2);\r\n // const result = valueX + valueY;\r\n // if (result <= 1 && !this.navIDsZoneEdit.includes(navigation.id)) {\r\n // this.navIDsZoneEdit.push(navigation.id);\r\n // }\r\n });\r\n } // EO\r\n\r\n async setScanInPolygon(img: any, coeffX: number, coeffY: number, element: { segList: any; }, navigations: any[]) {\r\n const calibrage = JSON.parse(this.chosenPlan.calibration);\r\n navigations.map(async (navigation) => {\r\n\r\n const positionsOnPlan = navigation.positionOnPlan.map((entry) =>\r\n JSON.parse(entry),\r\n );\r\n const positionOnPlan = positionsOnPlan.find(\r\n (data) => data.planID === this.chosenPlan.id,\r\n );\r\n if (positionOnPlan) {\r\n const realWidth = img.width / coeffX;\r\n const realHeight = img.height / coeffY;\r\n let navY = (positionOnPlan.y * realHeight) / calibrage.imgHeight;\r\n let navX = (positionOnPlan.x * realWidth) / calibrage.imgWidth;\r\n\r\n const p = {\r\n x: navX,\r\n y: navY,\r\n };\r\n if (\r\n isInPolygon(p, element.segList) &&\r\n !this.navIDsZoneEdit.includes(navigation.id)\r\n ) {\r\n this.navIDsZoneEdit.push(navigation.id);\r\n }\r\n }\r\n\r\n // old calibration\r\n // const position = JSON.parse(navigation.position);\r\n // const p = {\r\n // x: (calibrage.offsetX + position.x * calibrage.x) / coeffX,\r\n // y: (calibrage.offsetY + position.z * calibrage.y) / coeffY,\r\n // };\r\n // if (element.angle) {\r\n // p = this.rotate(\r\n // p,\r\n // { x: element.cx, y: element.cy },\r\n // element.angle,\r\n // );\r\n // }\r\n // if (\r\n // isInPolygon(p, element.segList) &&\r\n // !this.navIDsZoneEdit.includes(navigation.id)\r\n // ) {\r\n // this.navIDsZoneEdit.push(navigation.id);\r\n // }\r\n });\r\n }\r\n\r\n clearDivPlan() {\r\n if (this.divPlan) this.divPlan.innerHTML = \"\";\r\n }\r\n\r\n\r\n /**\r\n * Trigger each by the selectionComponent when selection change\r\n * Update the current selected scan buttons\r\n * @param selection new selection\r\n */\r\n onSelectionChanged(selection: Rectangle) {\r\n const unselectedButtons: HTMLButtonElement[] = [];\r\n const newSelectedButtons = [];\r\n\r\n /** For each button, decide whether will be add to selected list or unselected list */\r\n for (const button of this.buttonElements) {\r\n const isSelected = buttonIsInSelection(button, selection);\r\n if (this.buttonsInSelection.includes(button)) {\r\n /** If the button is already in the selected list, we check if it should be unselect */\r\n if (!isSelected) {\r\n unselectedButtons.push(button);\r\n }\r\n } else if (isSelected) {\r\n newSelectedButtons.push(button);\r\n }\r\n }\r\n\r\n /** Visually Update unselected list */\r\n for (const button of unselectedButtons) {\r\n setVisuallySelected(button, false);\r\n }\r\n\r\n /** Visually Update selected list */\r\n for (const button of newSelectedButtons) {\r\n setVisuallySelected(button, true);\r\n }\r\n\r\n /** Remove unselected list */\r\n this.buttonsInSelection = this.buttonsInSelection.filter((button) => {\r\n return !unselectedButtons.includes(button);\r\n });\r\n /** Add new selected buttons */\r\n this.buttonsInSelection = [\r\n ...this.buttonsInSelection,\r\n ...newSelectedButtons,\r\n ];\r\n }\r\n\r\n\r\n\r\n /**\r\n * Trigger when the user click to add the selected scans\r\n */\r\n onSelectionAdd() {\r\n for (const button of this.buttonsInSelection) {\r\n if (!this.chosenScansOnPlan.includes(button.id)) {\r\n this.onButtonScanClicked(button);\r\n }\r\n }\r\n\r\n this.onSelectionChanged({ top: 0, left: 0, width: 0, height: 0 });\r\n }\r\n\r\n /**\r\n * Trigger when the user click to remove the selected scans\r\n */\r\n onSelectionRemove() {\r\n for (const button of this.buttonsInSelection) {\r\n if (this.chosenScansOnPlan.includes(button.id)) {\r\n this.onButtonScanClicked(button);\r\n }\r\n }\r\n this.onSelectionChanged({ top: 0, left: 0, width: 0, height: 0 });\r\n }\r\n\r\n /**\r\n * Trigger when the user click to select all scans\r\n */\r\n onSelectAll() {\r\n this.buttonsInSelection = [...this.buttonElements];\r\n for (const button of this.buttonsInSelection) {\r\n setVisuallySelected(button, true);\r\n }\r\n }\r\n\r\n /**\r\n * Trigger when the user change the size of the scan points\r\n * @param event\r\n */\r\n onChangeScanSize(event: any) {\r\n const factor = event.target.value;\r\n\r\n for (const button of this.buttonElements) {\r\n button.style.transform = `scale(${factor})`;\r\n }\r\n }\r\n\r\n /**\r\n * When a button representing a scan is clicked\r\n * @param button\r\n */\r\n onButtonScanClicked(button: HTMLElement) {\r\n this.selectionChanged = true;\r\n if (this.isSettingStartSweep) {\r\n if (this.startSweepID === button.id) {\r\n // we deselect the starting point\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\r\n this.startSweepID = null;\r\n return;\r\n }\r\n button.style.backgroundImage = `url('https://api.iconify.design/ic/baseline-flag-circle.svg?color=white&width=17&height=17')`;\r\n if (!this.chosenScansOnPlan.includes(button.id)) {\r\n this.chosenScansOnPlan.push(button.id);\r\n }\r\n if (this.startSweepID) {\r\n // we are changing start sweep\r\n const btnChanged = this.buttonElements.find((btn) => btn.id === this.startSweepID);\r\n btnChanged.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\r\n }\r\n this.startSweepID = button.id;\r\n return;\r\n }\r\n if (!this.chosenScansOnPlan.includes(button.id)) {\r\n // add to selection\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\r\n this.chosenScansOnPlan.push(button.id);\r\n } else {\r\n // remove from selection\r\n if (this.occupiedSweeps.includes(button.id) && !this.navIDsZoneEdit.includes(button.id)) {\r\n // the sweep belongs to another zone => set orange\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`;\r\n } else {\r\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\r\n }\r\n const index = this.chosenScansOnPlan.indexOf(button.id);\r\n this.chosenScansOnPlan.splice(index, 1);\r\n }\r\n }\r\n\r\n onSaveSelection() {\r\n if (this.multipleFloors) {\r\n // rassemble all sweeps per floors\r\n let finalSweeps = [];\r\n Array.from(this.inputSweepsPerFloor.keys()).forEach(floorID => {\r\n if (this.chosenSweepsPerFloor.get(floorID)) {\r\n // the sweeps for this floor were modified, we take them\r\n finalSweeps = [...finalSweeps, ...this.chosenSweepsPerFloor.get(floorID)];\r\n } else {\r\n // was not modified, we take the previous values\r\n finalSweeps = [...finalSweeps, ...this.inputSweepsPerFloor.get(floorID)];\r\n }\r\n });\r\n // console.log(\"final sweeps\", finalSweeps);\r\n this.sweepsSelected.emit({ \"sweeps\": finalSweeps, \"startSweepID\": this.startSweepID });\r\n } else {\r\n this.sweepsSelected.emit({ \"sweeps\": this.chosenScansOnPlan, \"startSweepID\": this.startSweepID });\r\n }\r\n }\r\n\r\n onCancel() {\r\n if (this.selectionChanged) {\r\n const message = this.translate.instant(\"confirm.cancelModifZoneSweeps\");\r\n if (window.confirm(message)) {\r\n this.sweepsSelected.emit(null);\r\n }\r\n } else {\r\n this.sweepsSelected.emit(null);\r\n }\r\n }\r\n\r\n /**\r\n * Adds current selection of sweeps for current floor (plan) for multifloor zone.\r\n * It has to be saved anyway with onSaveSelection!\r\n */\r\n onValidateForFloor() {\r\n if (this.multipleFloors) {\r\n this.chosenSweepsPerFloor.set(this.chosenPlan.zoneID, [...this.chosenScansOnPlan]);\r\n this.selectionChanged = false;\r\n }\r\n }\r\n}\r\n","<div ngbDropdown class=\"sp-row d-inline-block\">\r\n <div class=\"col-sm-3\" *ngIf=\"plans\">\r\n <button type=\"button\" class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\"\r\n ngbDropdownToggle>{{chosenPlan ?\r\n chosenPlan.name : ('Choose Plan' | translate) }}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button type=\"button\" ngbDropdownItem *ngFor=\"let plan of plans\" (click)=\"onPlanClick(plan)\"\r\n [disabled]=\"!plan.calibration\">{{ plan.name }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"sp-row\">\r\n <lib-selection class=\"col-md-8\" (onSelectionChanged)=\"onSelectionChanged($event)\">\r\n <lib-plan-legend [isAudioZone]=\"editingAudioZone\" *ngIf=\"buttonElements.length > 0\"></lib-plan-legend>\r\n <div class=\"selectZone\" oncontextmenu=\"return false;\">\r\n <div class=\"sp-row\">\r\n <div style=\"overflow: hidden;width:100%;\">\r\n <div style=\"height: 400px; width: 100%;\" id=\"planDiv\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </lib-selection>\r\n \r\n <div class=\"col-md-4 scanTool\" *ngIf=\"buttonElements.length > 0\">\r\n <div class=\"sp-row d-inline-block\">\r\n <h2>{{'selectTool.title' | translate}}</h2>\r\n <div class=\"protip\">{{'selectTool.tip' | translate}}.</div>\r\n </div>\r\n \r\n <div class=\"sp-row\">\r\n <div class=\"col-3\" style=\"padding:0px\">\r\n <label class=\"tool-label\" for=\"scanSize\">{{'selectTool.size' | translate}}</label>\r\n </div>\r\n <div class=\"col-9\">\r\n <input type=\"range\" class=\"form-range\" min=\"0.001\" max=\"5\" step=\"0.01\" value=\"1\"\r\n id=\"scanSize\" (input)=\"onChangeScanSize($event)\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"sp-row\">\r\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onSelectAll()\">{{'selectTool.selectAll' | translate}}</button>\r\n </div>\r\n \r\n <div *ngIf=\"buttonsInSelection.length > 0\" class=\"edit-selected\">\r\n <span class=\"tool-label\">{{'selectTool.edit' | translate}} : </span>\r\n <div class=\"sp-row\">\r\n <button class=\"btn rounded-pill btn-primary ms-3 me-2\" (click)=\"onSelectionAdd()\">{{'selectTool.add' | translate}}</button>\r\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onSelectionRemove()\">{{'selectTool.undo' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sp-row\">\r\n <div *ngIf=\"multipleFloors\"> \r\n {{ chosenSweepsPerFloor.get(chosenPlan.zoneID) ? chosenSweepsPerFloor.get(chosenPlan.zoneID).length : \"0\"}} {{'scan points selected on this floor' | translate}} \r\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onValidateForFloor()\" [disabled]=\"!selectionChanged\">{{'Update selection for this floor' | translate}}</button>\r\n </div>\r\n <div *ngIf=\"!multipleFloors\">\r\n {{ chosenScansOnPlan.length }} {{'scan points chosen' | translate}} \r\n </div>\r\n </div>\r\n <div *ngIf=\"!editingAudioZone\" class=\"sp-row\">\r\n <lib-radio-button label=\"{{ 'selectTool.chooseStartPoint' | translate }}\" (isCheckedEvent)=\"isSettingStartSweep=!isSettingStartSweep\"></lib-radio-button>\r\n </div>\r\n <div class=\"sp-row\">\r\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onSaveSelection()\">{{'selectTool.saveSelection' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'selectTool.cancelSelection' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n \r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport {\r\n UntypedFormGroup,\r\n UntypedFormBuilder,\r\n Validators,\r\n AbstractControl,\r\n ValidatorFn,\r\n ValidationErrors,\r\n} from '@angular/forms';\r\nimport {\r\n Zone,\r\n Plan,\r\n Layer,\r\n ZoneService,\r\n LayerService,\r\n BaseUserService,\r\n NavigationService,\r\n} from '@smarterplan/ngx-smarterplan-core';\r\n@Component({\r\n selector: 'lib-add-zone',\r\n templateUrl: './add-zone.component.html',\r\n styleUrls: ['./add-zone.component.scss'],\r\n})\r\nexport class AddZoneComponent implements OnInit {\r\n @Input() zoneEdit: Zone;\r\n\r\n @Input() spaceID: string;\r\n\r\n @Input() images360: { path: string; filename: string }[];\r\n\r\n @Input() navigationIDs: string[];\r\n\r\n @Input() zones: Zone[];\r\n\r\n @Input() newZoneDataFromEditor: any;\r\n\r\n @Output() updatedZone = new EventEmitter<any>();\r\n\r\n @Input() chosenPlan: Plan;\r\n\r\n @Input() isMuseumVisit: boolean = false;\r\n\r\n @Input() defaultZone: Zone;\r\n\r\n parentZones: Zone[] = [];\r\n\r\n carouselIsVisible = false;\r\n\r\n zoneForm: UntypedFormGroup;\r\n\r\n isSubmitted = false;\r\n\r\n currentScanShowing: number;\r\n\r\n chosenScans: number[] = [];\r\n\r\n layers: Layer[];\r\n\r\n fromPlan: boolean = false;\r\n\r\n chosenScansOnPlan: string[] = [];\r\n\r\n currentOrgId: string;\r\n\r\n zoneInitialNavCount = 0;\r\n\r\n zoneIsMatterportFloor = false;\r\n\r\n multipleFloors = false;\r\n\r\n constructor(\r\n private fb: UntypedFormBuilder,\r\n private zoneService: ZoneService,\r\n private layerService: LayerService,\r\n private userService: BaseUserService,\r\n private navigationService: NavigationService\r\n ) { }\r\n\r\n async ngOnInit() {\r\n this.parentZones = this.zones.filter(\r\n (zone) => zone.layer && zone.layer.name === 'FLOOR'\r\n );\r\n if (!this.defaultZone) {\r\n this.defaultZone = this.getDefaultZone();\r\n }\r\n this.parentZones.unshift(this.defaultZone);\r\n await this.updateLayers();\r\n this.initZoneForm();\r\n }\r\n\r\n async updateLayers() {\r\n this.currentOrgId = this.userService.currentOrganisation(this.spaceID).id;\r\n const layers = await this.layerService.getLayerForOrganisation(\r\n this.currentOrgId\r\n );\r\n // filter out layers created by the system\r\n this.layers = layers.filter(\r\n (l) => l.name !== 'BUILDING' && l.name !== 'FLOOR'\r\n );\r\n }\r\n\r\n async initZoneForm() {\r\n if (this.zoneEdit) {\r\n if (this.zoneEdit.metadata) {\r\n const metadata = JSON.parse(this.zoneEdit.metadata);\r\n this.zoneIsMatterportFloor = metadata.hasOwnProperty(\r\n 'matterportFloorSequence'\r\n );\r\n }\r\n const isVirtual = this.zoneService.zoneIsVirtual(this.zoneEdit);\r\n if (!isVirtual) {\r\n await this.loadNavigations();\r\n }\r\n this.isMuseumVisit = this.zoneEdit.isMuseumVisitZone === true;\r\n this.multipleFloors = this.zoneEdit.isMultipleFloorZone === true;\r\n this.zoneForm = this.fb.group({\r\n id: this.zoneEdit.id,\r\n name: [this.zoneEdit.name, [Validators.required]],\r\n code_ref: this.zoneEdit.code_ref ? this.zoneEdit.code_ref : null,\r\n layerID: this.zoneEdit.layer ? this.zoneEdit.layer.id : null,\r\n surface: this.zoneEdit.surface ? this.zoneEdit.surface : 0,\r\n parentID: this.zoneEdit.parentID,\r\n parent: { value: this.zoneEdit.parent.name, disabled: true },\r\n newLayer: [null, [this.layerNameValidator()]],\r\n isMuseumVisitZone: this.isMuseumVisit,\r\n startSweepID: this.zoneEdit.startSweepID,\r\n });\r\n this.onChangeMultipleFloors();\r\n } else {\r\n this.zoneForm = this.fb.group({\r\n name: [\r\n this.newZoneDataFromEditor ? this.newZoneDataFromEditor.name : '',\r\n [Validators.required],\r\n ],\r\n code_ref: null,\r\n layerID: null,\r\n surface: 0,\r\n parentID: this.defaultZone.id,\r\n newLayer: [null, [this.layerNameValidator()]],\r\n isMuseumVisitZone: this.isMuseumVisit,\r\n startSweepID: null,\r\n });\r\n }\r\n }\r\n\r\n async onSubmitZone() {\r\n this.isSubmitted = true;\r\n if (!this.zoneForm.valid) {\r\n return;\r\n }\r\n const formValue = this.zoneForm.getRawValue(); //because we need values of disables controls as well\r\n if (formValue.newLayer) {\r\n await this.createLayer(formValue.newLayer).then((layer) => {\r\n formValue.layerID = layer.id;\r\n });\r\n }\r\n\r\n const zoneInput = {\r\n name: formValue.name,\r\n surface: Math.round(formValue.surface * 100) / 100,\r\n spaceID: this.spaceID,\r\n layerID: formValue.layerID,\r\n parentID: formValue.parentID,\r\n isMuseumVisitZone: this.isMuseumVisit,\r\n isMultipleFloorZone: this.multipleFloors,\r\n sweepIDs: [],\r\n startSweepID: formValue.startSweepID,\r\n } as Zone;\r\n\r\n if (formValue.code_ref) {\r\n zoneInput.code_ref = formValue.code_ref;\r\n }\r\n\r\n try {\r\n this.zoneForm = null;\r\n this.isSubmitted = false;\r\n if (this.zoneEdit) {\r\n const zoneUpdate = zoneInput;\r\n zoneUpdate.sweepIDs = this.zoneEdit.sweepIDs;\r\n zoneUpdate.id = formValue.id;\r\n await this.setSweepsAndNodeForZoneInput(zoneUpdate);\r\n await this.zoneService.updateZone(zoneUpdate);\r\n this.zoneEdit = null;\r\n this.updatedZone.emit(zoneUpdate.id);\r\n } else {\r\n await this.setSweepsAndNodeForZoneInput(zoneInput);\r\n if (!zoneInput.parentID) {\r\n // set building as parent\r\n zoneInput.parentID = this.defaultZone.id;\r\n }\r\n await this.zoneService.create(zoneInput).then((zoneCreated) => {\r\n this.updatedZone.emit(zoneCreated.id);\r\n });\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.isSubmitted = false;\r\n this.zoneForm = null;\r\n this.chosenScansOnPlan = [];\r\n this.chosenScans = [];\r\n this.updatedZone.emit(false);\r\n }\r\n\r\n get name(): AbstractControl {\r\n return this.zoneForm.get('name');\r\n }\r\n\r\n get newLayer(): AbstractControl {\r\n return this.zoneForm.get('newLayer');\r\n }\r\n\r\n toggleCarousel() {\r\n this.carouselIsVisible = true;\r\n this.chosenScansOnPlan = [];\r\n }\r\n\r\n togglePlan() {\r\n this.fromPlan = true;\r\n this.chosenScans = [];\r\n }\r\n\r\n onAddScan() {\r\n if (!this.chosenScans.includes(this.currentScanShowing)) {\r\n // console.log(\"adding scan\", this.currentScanShowing);\r\n this.chosenScans.push(this.currentScanShowing);\r\n } else {\r\n alert('Scan already added!');\r\n }\r\n }\r\n\r\n onRemoveScanImage(scan: any) {\r\n const index = this.chosenScans.indexOf(scan);\r\n this.chosenScans.splice(index, 1);\r\n }\r\n\r\n onRemoveScanPlan(scan: any) {\r\n const index = this.chosenScansOnPlan.indexOf(scan);\r\n this.chosenScansOnPlan.splice(index, 1);\r\n }\r\n\r\n async setSweepsAndNodeForZoneInput(zoneInput: Zone) {\r\n if (\r\n this.chosenScans.length > 0 &&\r\n this.chosenScans.length !== this.zoneInitialNavCount &&\r\n !this.fromPlan\r\n ) {\r\n // if we chose scans from the carousel\r\n const sweepIDs: string[] = [];\r\n this.chosenScans.map(async (scan) => {\r\n const imageUuid = this.images360[scan].filename.split('_')[0];\r\n const sweepID = this.navigationIDs.find((nav) => {\r\n return nav.includes(imageUuid);\r\n });\r\n if (sweepID) {\r\n sweepIDs.push(sweepID);\r\n }\r\n });\r\n zoneInput.sweepIDs = sweepIDs;\r\n } else {\r\n // we are not coming from gallery choice\r\n if (this.chosenScansOnPlan.length > 0) {\r\n zoneInput.sweepIDs = this.chosenScansOnPlan;\r\n }\r\n }\r\n\r\n if (zoneInput.sweepIDs && zoneInput.sweepIDs.length > 0) {\r\n const navForSweep =\r\n await this.navigationService.getNavigationsForMatterportIDForSpace(\r\n zoneInput.sweepIDs[0],\r\n this.spaceID\r\n );\r\n zoneInput.nodeIDs = [navForSweep[0].nodeID];\r\n }\r\n }\r\n\r\n async createLayer(name: string): Promise<Layer> {\r\n return this.layerService.createLayerForOrganisation(\r\n name,\r\n this.currentOrgId\r\n );\r\n }\r\n\r\n async loadNavigations(): Promise<any> {\r\n if (this.zoneEdit.sweepIDs.length > 0) {\r\n this.zoneInitialNavCount = this.zoneEdit.sweepIDs.length;\r\n const navList: number[] = [];\r\n const scansZoneEdit: string[] = [];\r\n await Promise.all(\r\n this.zoneEdit.sweepIDs.map(async (sweepID: string) => {\r\n scansZoneEdit.push(sweepID);\r\n const index = this.images360.findIndex((im) => {\r\n return im.filename.includes(sweepID.slice(0, 8));\r\n });\r\n if (index !== -1) {\r\n navList.push(index);\r\n }\r\n })\r\n );\r\n this.chosenScans = navList;\r\n this.chosenScansOnPlan = scansZoneEdit;\r\n return Promise.resolve();\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n // iniPlanForDraw() {\r\n // this.togglePlan();\r\n // setTimeout(() => {\r\n // this.onPlanClick();\r\n // }, 500);\r\n // }\r\n\r\n /**\r\n * Adds all sweeps of the space\r\n */\r\n onAddAll() {\r\n const defaultZone = this.getDefaultZone();\r\n if (defaultZone) {\r\n this.chosenScansOnPlan = defaultZone.sweepIDs;\r\n this.zoneForm.get('parentID').setValue(defaultZone.id);\r\n this.zoneForm.get('parentID').disable();\r\n this.multipleFloors = true;\r\n }\r\n }\r\n\r\n getDefaultZone(): Zone {\r\n return this.zones.find(\r\n (zone) =>\r\n zone.layer &&\r\n zone.layer.name === 'BUILDING' &&\r\n zone.sweepIDs &&\r\n zone.sweepIDs.length > 0\r\n );\r\n }\r\n /**\r\n * Multiple floors\r\n */\r\n onChangeMultipleFloors() {\r\n if (this.multipleFloors) {\r\n const defaultZone = this.getDefaultZone();\r\n if (defaultZone) {\r\n this.zoneForm.get('parentID').setValue(defaultZone.id);\r\n this.zoneForm.get('parentID').disable();\r\n }\r\n } else {\r\n this.zoneForm.get('parentID').enable();\r\n }\r\n }\r\n\r\n onSelectedSweepsFromPlan(result: { sweeps: string[]; startSweepID: string }) {\r\n if (result) {\r\n if (result.sweeps) {\r\n this.chosenScansOnPlan = result.sweeps;\r\n }\r\n if (result.startSweepID) {\r\n this.zoneForm.controls.startSweepID.setValue(result.startSweepID);\r\n }\r\n }\r\n this.fromPlan = false;\r\n }\r\n\r\n layerNameValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n const forbidden = this.layers\r\n .map((l) => l.name.toLowerCase())\r\n .includes(control.value.toLowerCase());\r\n return forbidden ? { forbiddenName: { value: control.value } } : null;\r\n };\r\n }\r\n}\r\n","<div class=\"main-container\" *ngIf=\"zoneForm\">\r\n <div class=\"col-7\">\r\n <form (ngSubmit)=\"onSubmitZone()\" [formGroup]=\"zoneForm\">\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" required formControlName=\"name\">\r\n <!-- <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'codeRef' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"code_ref\">\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\" *ngIf=\"!isMuseumVisit && !zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Type of zone' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <select class=\"form-control\" formControlName=\"layerID\">\r\n <option value=\"null\" selected disabled hidden> {{ zoneEdit && zoneEdit.layer ?\r\n zoneEdit.layer.name : 'Choose type'}}</option>\r\n <option *ngFor=\"let layer of layers\" [value]=\"layer.id\">\r\n {{ layer.name }}\r\n </option>\r\n </select>\r\n <p class=\"mt-1 new-type-text\">{{'or add new type of zone' | translate }}</p>\r\n <input type=\"text\" class=\"form-control new-type-input\" formControlName=\"newLayer\">\r\n <div *ngIf=\"newLayer.invalid && (newLayer.dirty || newLayer.touched)\" class=\"text-danger\">\r\n <div *ngIf=\"newLayer.errors?.['forbiddenName']\">\r\n {{'Layer exists already' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--If Editing Zone possibility to assign it to museum itinerary-->\r\n <div class=\"mb-3 row\" *ngIf=\"zoneEdit && !zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{ 'Museum Itinerary' | translate }}</label>\r\n <div class=\"col-sm-10\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"isMuseumVisit\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" *ngIf=\"!zoneEdit || zoneEdit.isMultipleFloorZone\">\r\n <label class=\"col-sm-2 col-form-label\">{{ 'Multiple Floors' | translate }}</label>\r\n <div class=\"col-sm-10\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"multipleFloors\"\r\n [disabled]=\"zoneEdit !== undefined && zoneEdit !== null\" (change)=\"onChangeMultipleFloors()\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n <div class='text-danger' *ngIf=\"zoneEdit\">\r\n {{'cannotChangeMultifloor' | translate}}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Surface' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"surface\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Parent zone' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input *ngIf=\"zoneEdit\" type=\"text\" class=\"form-control\" formControlName=\"parent\">\r\n <div class=\"text-danger\" *ngIf=\"zoneEdit\">\r\n {{'cannotChangeParent' | translate}}\r\n </div>\r\n <select *ngIf=\"!zoneEdit\" class=\"form-control\" formControlName=\"parentID\">\r\n <option *ngFor=\"let zone of parentZones\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" style=\"max-height: 200px; overflow: auto;\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Scan Points' | translate}}</label>\r\n <!-- <p class=\"col-sm-2\" *ngIf=\"zoneEdit\">{{ zoneEdit.sweepIDs.length }} scans</p> -->\r\n <p class=\"col\" *ngIf=\"chosenScansOnPlan.length === 0 && chosenScans.length === 0\">\r\n {{'No scan points chosen' | translate}}</p>\r\n <div class=\"col-sm-5\" *ngIf=\"chosenScansOnPlan && chosenScansOnPlan.length > 0\">\r\n <p>{{ chosenScansOnPlan.length }} {{'scan points chosen' | translate}}</p>\r\n <!-- <div *ngFor=\"let scan of chosenScansOnPlan\">\r\n <div class=\"row\">\r\n <p class=\"me-2\">{{ scan | slice:0:8 }}</p>\r\n <div (click)=\"onRemoveScanPlan(scan)\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <div class=\"col-sm-5\" *ngIf=\"carouselIsVisible && chosenScans && chosenScans.length > 0\">\r\n <p>{{ chosenScans.length }} {{'scan points chosen' | translate}}</p>\r\n <div *ngFor=\"let scan of chosenScans\">\r\n <div class=\"row\">\r\n <p class=\"me-2\">{{ images360[scan].filename }}</p>\r\n <div (click)=\"onRemoveScanImage(scan)\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3 mt-3\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <div class=\"col\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\r\n (click)=\"togglePlan()\">{{'Choose scan points on plan' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"toggleCarousel()\"\r\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\r\n {{'Choose scan points from gallery' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAll()\"\r\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\r\n {{'add-all-scans' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'No visible scan points' | translate}}</label>\r\n <div class=\"col-sm-3\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"noScanPoints\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div> -->\r\n\r\n <div *ngIf=\"carouselIsVisible\" class=\"mb-2\">\r\n <lib-carousel *ngIf=\"images360 && images360.length > 0\" [images]=\"images360\"\r\n (currentScan)=\"currentScanShowing=$event\"></lib-carousel>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2 mt-3\"\r\n (click)=\"onAddScan()\">{{'Add to zone' | translate}}</button>\r\n </div>\r\n <div class=\"mt-3\">\r\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\"\r\n [disabled]=\"fromPlan || !zoneForm.valid\">{{'Save' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\r\n <lib-sweep-plan-selection style=\"width: 100%;\" [newZoneData]=\"newZoneDataFromEditor\" [spaceID]=\"spaceID\"\r\n [multipleFloors]=\"multipleFloors\" [inputZone]=\"zoneEdit\"\r\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\r\n </div>\r\n</div>","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { UntypedFormGroup, UntypedFormBuilder, Validators } from '@angular/forms';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { ZoneService, LayerService, BaseUserService, NavigationService, Layer, Zone, CommentType, CommentService, Comment, filterUniqueArrayByID } from '@smarterplan/ngx-smarterplan-core';\r\n\r\n\r\n@Component({\r\n selector: 'lib-add-audio-zone',\r\n templateUrl: './add-audio-zone.component.html',\r\n styleUrls: ['./add-audio-zone.component.scss'],\r\n})\r\nexport class AddAudioZoneComponent implements OnInit {\r\n\r\n @Input() spaceID: string;\r\n\r\n @Output() updatedZone = new EventEmitter<any>();\r\n\r\n @Input() defaultZone: Zone;\r\n\r\n @Input() zones: Zone[];\r\n\r\n @Input() parentZone: Zone;\r\n\r\n isSubmitted = false;\r\n\r\n fromPlan: boolean = false;\r\n\r\n chosenScansOnPlan: string[] = [];\r\n\r\n currentOrgId: string;\r\n\r\n audioLayer: Layer;\r\n\r\n commentForm: UntypedFormGroup;\r\n\r\n fileToUpload: File;\r\n\r\n audiosForSpace: Comment[];\r\n\r\n isAddingAudio = false;\r\n\r\n chosenAudio: Comment;\r\n\r\n audioZones: Zone[];\r\n\r\n @Input() currentAudioZone: Zone;\r\n\r\n scansModified = false;\r\n\r\n occupiedSweeps: string[] = [];\r\n\r\n unavailableSweeps: string[] = [];\r\n\r\n working = false;\r\n\r\n audioUploaded = false;\r\n\r\n constructor(\r\n private fb: UntypedFormBuilder,\r\n private zoneService: ZoneService,\r\n private layerService: LayerService,\r\n private userService: BaseUserService,\r\n private navigationService: NavigationService,\r\n private commentService: CommentService,\r\n private translate: TranslateService,\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (this.currentAudioZone) {\r\n // we are editing zone\r\n this.chosenAudio = this.currentAudioZone.audio;\r\n this.chosenScansOnPlan = this.currentAudioZone.sweepIDs;\r\n this.parentZone = this.currentAudioZone.parent;\r\n }\r\n this.setup();\r\n }\r\n\r\n async setup() {\r\n const mission = this.userService.currentMission(this.spaceID);\r\n this.currentOrgId = mission.organisationID;\r\n let layers = await this.layerService.getLayerForOrganisation(\r\n this.currentOrgId,\r\n );\r\n this.audioLayer = layers.find((layer) => layer.name === \"AUDIO\");\r\n if (!this.audioLayer) {\r\n // first time creating Audio Zone \r\n this.audioLayer = await this.layerService.createLayerForOrganisation(\"AUDIO\", this.currentOrgId);\r\n }\r\n if (!this.parentZone) {\r\n this.parentZone = this.defaultZone;\r\n }\r\n this.audioZones = this.zones.filter((zone) => zone.audioID && zone.parentID === this.parentZone.id);\r\n this.occupiedSweeps = this.audioZones.flatMap((zone) => zone.sweepIDs);\r\n // unavailable sweeps: sweeps that do not belong to parent zone\r\n this.unavailableSweeps = this.defaultZone.sweepIDs.filter((sweep) => !this.parentZone.sweepIDs.includes(sweep));\r\n await this.getAudios();\r\n this.commentForm = this.fb.group({\r\n title: [null, Validators.required],\r\n spaceID: this.spaceID,\r\n type: CommentType.AUDIO,\r\n ownerID: mission.id,\r\n });\r\n }\r\n\r\n async onSubmit() {\r\n this.isSubmitted = true;\r\n this.working = true;\r\n if (this.currentAudioZone) {\r\n await this.zoneService.updateZone({\r\n id: this.currentAudioZone.id,\r\n sweepIDs: this.chosenScansOnPlan,\r\n });\r\n await this.removeTakenSweepsFromOtherZones();\r\n this.updatedZone.emit(this.currentAudioZone.id);\r\n this.working = false;\r\n } else {\r\n const zoneInput = {\r\n name: `${this.parentZone.name} - ${this.chosenAudio.title}`,\r\n surface: 0,\r\n spaceID: this.spaceID,\r\n layerID: this.audioLayer.id,\r\n parentID: this.parentZone.id,\r\n isMuseumVisitZone: false,\r\n isMultipleFloorZone: this.parentZone.isMultipleFloorZone,\r\n audioID: this.chosenAudio.id,\r\n } as Zone;\r\n try {\r\n await this.setSweepsAndNodeForZoneInput(zoneInput);\r\n await this.zoneService\r\n .create(zoneInput)\r\n .then(async (zoneCreated) => {\r\n this.currentAudioZone = zoneCreated;\r\n await this.removeTakenSweepsFromOtherZones();\r\n this.updatedZone.emit(zoneCreated.id);\r\n });\r\n this.working = false;\r\n } catch (error) {\r\n console.error(error);\r\n this.working = false;\r\n }\r\n }\r\n }\r\n\r\n async setSweepsAndNodeForZoneInput(zoneInput: Zone) {\r\n if (this.chosenScansOnPlan.length > 0) {\r\n zoneInput.sweepIDs = this.chosenScansOnPlan;\r\n }\r\n if (zoneInput.sweepIDs && zoneInput.sweepIDs.length > 0) {\r\n const navForSweep =\r\n await this.navigationService.getNavigationsForMatterportIDForSpace(\r\n zoneInput.sweepIDs[0],\r\n this.spaceID,\r\n );\r\n zoneInput.nodeIDs = [navForSweep[0].nodeID];\r\n }\r\n }\r\n\r\n onCancel() {\r\n if (this.scansModified) {\r\n const message = this.translate.instant(\"confirm.cancelEditZone\");\r\n if (!window.confirm(message)) {\r\n return;\r\n }\r\n }\r\n this.commentForm = null;\r\n this.chosenScansOnPlan = [];\r\n this.updatedZone.emit(false);\r\n }\r\n\r\n togglePlan() {\r\n this.fromPlan = true;\r\n }\r\n\r\n onSelectedSweepsFromPlan(result: { \"sweeps\": string[]; \"startSweepID\": string; }) {\r\n if (result && result.sweeps) {\r\n this.chosenScansOnPlan = result.sweeps;\r\n this.scansModified = true;\r\n }\r\n this.fromPlan = false;\r\n }\r\n\r\n handleFileInput(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n this.fileToUpload = (target.files as FileList)[0];\r\n }\r\n\r\n async onUploadAudio() {\r\n this.working = true;\r\n const commentInput = this.commentForm.value;\r\n try {\r\n const newAudio = await this.commentService.createCommentWithFile(\r\n commentInput,\r\n this.fileToUpload,\r\n );\r\n this.audiosForSpace.push(newAudio);\r\n this.isAddingAudio = false;\r\n this.working = false;\r\n this.audioUploaded = true;\r\n } catch (e) {\r\n this.working = false;\r\n this.audioUploaded = false;\r\n console.log(e);\r\n }\r\n\r\n }\r\n\r\n async getAudios() {\r\n const attachments = await this.commentService.getCommentsBySpaceID(this.spaceID);\r\n if (attachments) {\r\n this.audiosForSpace = attachments.filter((attachment) => attachment.type === CommentType.AUDIO);\r\n }\r\n }\r\n\r\n onCancelAudioUpload() {\r\n this.commentForm = null;\r\n this.isAddingAudio = false;\r\n this.fileToUpload = null;\r\n }\r\n\r\n onChooseAudio(audio: Comment) {\r\n this.chosenAudio = audio;\r\n this.currentAudioZone = this.audioZones.find((zone) => zone.audioID === this.chosenAudio.id);\r\n if (this.currentAudioZone) {\r\n this.chosenScansOnPlan = this.currentAudioZone.sweepIDs;\r\n } else {\r\n this.chosenScansOnPlan = [];\r\n }\r\n }\r\n\r\n /**\r\n * Removes newly selected sweeps for current zone (they are in chosenScansOnPlan) from other audio zones. \r\n * Rule: one sweep = one audio.\r\n */\r\n async removeTakenSweepsFromOtherZones() {\r\n await Promise.all(this.audioZones.map(async (zone) => {\r\n if (zone.id !== this.currentAudioZone.id) {\r\n const newSweeps = zone.sweepIDs.filter((sweepID) => !this.chosenScansOnPlan.includes(sweepID));\r\n if (newSweeps.length !== zone.sweepIDs.length) {\r\n await this.zoneService.updateZone({ id: zone.id, sweepIDs: newSweeps });\r\n }\r\n }\r\n }));\r\n }\r\n\r\n /**\r\n * Delete audio as Comment, all its audio Zones and file from S3 (using lambda function)\r\n */\r\n async onDeleteAudio() {\r\n const message = this.translate.instant(\"confirm.deleteAudio\");\r\n if (window.confirm(message)) {\r\n await this.commentService.deleteComment(this.chosenAudio.id);\r\n const index = this.audiosForSpace.indexOf(this.chosenAudio);\r\n this.audiosForSpace.splice(index, 1);\r\n\r\n // delete all zones with this comment audio\r\n const audioZonesToDelete = this.zones.filter((z) => z.audioID === this.chosenAudio.id);\r\n await Promise.all(audioZonesToDelete.map(async (zone) => {\r\n await this.zoneService.deleteZone(zone.id);\r\n const indexZone = this.audioZones.indexOf(this.currentAudioZone);\r\n if (indexZone !== -1) {\r\n this.audioZones.slice(indexZone, 1);\r\n }\r\n }));\r\n this.currentAudioZone = null;\r\n this.chosenAudio = null;\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"main-container\">\r\n <div class=\"col-lg-6 col-md-6 col-sm-7\" *ngIf=\"isAddingAudio\">\r\n <form (ngSubmit)=\"onUploadAudio()\" [formGroup]=\"commentForm\">\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" required formControlName=\"title\">\r\n </div>\r\n </div>\r\n <div>\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\r\n {{'Choose File' | translate}}</label>\r\n <p *ngIf=\"fileToUpload\">{{ fileToUpload.name}}</p>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n \r\n <div class=\"mt-3\">\r\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || working\">{{'Upload' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancelAudioUpload()\" class=\"btn btn-outline-primary rounded-pill me-2\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <ngb-alert type=\"success\" [dismissible]=\"true\" *ngIf=\"!working && audioUploaded\" (closed)=\"audioUploaded=false\">\r\n {{ 'add-audio.success' | translate }} !\r\n </ngb-alert>\r\n <div class=\"col-7\" *ngIf=\"!isAddingAudio && audiosForSpace\">\r\n \r\n <div class=\"instruction-row\" >\r\n <p>1.</p>\r\n <div ngbDropdown class=\"d-inline-block\">\r\n <div>\r\n <button type=\"button\" class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\"\r\n ngbDropdownToggle>{{chosenAudio ?\r\n chosenAudio.title : ('choose-audio' | translate) }}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button type=\"button\" ngbDropdownItem *ngFor=\"let audio of audiosForSpace\" \r\n (click)=\"onChooseAudio(audio)\">{{ audio.title }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <p>{{'or' | translate}}</p>\r\n <button (click)=\"isAddingAudio=true\" class=\"btn btn-primary rounded-pill me-2\"> {{'add-audio.add' | translate}}</button>\r\n </div>\r\n <div class=\"instruction-row\">\r\n <p>2.</p>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"togglePlan()\" [disabled]=\"!chosenAudio\">\r\n {{'Choose scan points on plan' | translate}}</button>\r\n\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onDeleteAudio()\" [disabled]=\"!chosenAudio\">\r\n {{'Delete audio' | translate}}</button>\r\n \r\n </div>\r\n <div class=\"instruction-row\" *ngIf=\"chosenAudio\">\r\n <p>{{ chosenScansOnPlan.length }} {{'scans-chosen-audio' | translate}}</p>\r\n </div>\r\n\r\n <div class=\"mt-3\">\r\n <button class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || !this.chosenAudio\" (click)=\"onSubmit()\">{{'Save' | translate}}</button>\r\n <button (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </div>\r\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\r\n <lib-sweep-plan-selection style=\"width: 100%;\" [inputZone]=\"currentAudioZone\" [spaceID]=\"spaceID\" \r\n [occupiedSweeps]=\"occupiedSweeps\" [unavailableSweeps]=\"unavailableSweeps\" [editingAudioZone]=\"true\"\r\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\r\n </div>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { Zone, ZoneService } from '@smarterplan/ngx-smarterplan-core';\r\n\r\n@Pipe({\r\n name: 'countAudioSweeps'\r\n})\r\nexport class CountAudioSweepsPipe implements PipeTransform {\r\n constructor(private zoneService: ZoneService) { }\r\n\r\n async transform(zone: Zone): Promise<number> {\r\n let childrenAudioZones = await this.zoneService.getZonesByParentZone(zone.id);\r\n if (childrenAudioZones.length > 0) {\r\n childrenAudioZones = childrenAudioZones.filter((zone) => zone.audioID);\r\n if (childrenAudioZones.length > 0) {\r\n return childrenAudioZones.flatMap((z) => z.sweepIDs).length;\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n}\r\n","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport {\r\n MenuItem, ZoneService, SpaceService, VisitService,\r\n NavigationService, BaseUserService, PlanService, wait, Navigation, showScanPointsOnPlanInDiv, Plan, Space, Zone, SpModule, NavigatorService\r\n} from '@smarterplan/ngx-smarterplan-core';\r\nimport panzoom from \"panzoom\";\r\nimport { Subject, takeUntil } from 'rxjs';\r\n@Component({\r\n selector: 'lib-zones',\r\n templateUrl: './zones.component.html',\r\n styleUrls: ['./zones.component.scss']\r\n})\r\nexport class ZonesComponent implements OnInit {\r\n\r\n lotIndexDetails = -1;\r\n\r\n currentSpace: Space;\r\n\r\n @Output() updatedZone = new EventEmitter<boolean>();\r\n\r\n plans: Plan[];\r\n\r\n zoneForEdit: Zone;\r\n\r\n isEditingZone = false;\r\n\r\n captureDate: number;\r\n\r\n spaceID: string;\r\n\r\n navigations: string[];\r\n\r\n images360: any[];\r\n\r\n carouselIsVisible = false;\r\n\r\n planIsVisible = false;\r\n\r\n currentPlan: Plan;\r\n\r\n currentZone: Zone;\r\n\r\n loadingPlan = false;\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n isMuseumVisit = false;\r\n\r\n isMuseumModule = false;\r\n\r\n allZones: Zone[];\r\n\r\n floorZones: Zone[] = [];\r\n\r\n zonesMap: Map<string, Zone[]> = new Map();\r\n\r\n floorDetails: number = -1;\r\n\r\n defaultZone: Zone;\r\n\r\n defaultShowing = false;\r\n\r\n isAddingAudioTrack = false;\r\n\r\n parentZoneForAudio: Zone;\r\n\r\n destroy$ = new Subject();\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private zoneService: ZoneService,\r\n private spaceService: SpaceService,\r\n private visitService: VisitService,\r\n private navigationService: NavigationService,\r\n private userService: BaseUserService,\r\n private planService: PlanService,\r\n private translate: TranslateService,\r\n private navigatorService: NavigatorService,\r\n private router: Router,\r\n ) {\r\n // listen to the change of location via navigation bar dropdown\r\n this.navigatorService.locationIDChange\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((spaceID) => {\r\n this.router.navigate([\"dashboard/localisation\", spaceID, \"zones\"]).catch(e => console.log(e.message));\r\n });\r\n\r\n this.route.params.subscribe((params) => {\r\n this.spaceID = params.id;\r\n this.resetZones().catch(e => console.log(e.message));\r\n });\r\n }\r\n\r\n async ngOnInit() {\r\n this.isMuseumModule = this.userService.getSpModule() === SpModule.MUSEUM;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: \"Locations\", url: \"/localisation\" },\r\n {\r\n label: this.currentSpace.name,\r\n url: `/localisation/${this.spaceID}`,\r\n },\r\n {\r\n label: \"Zones\",\r\n url: `/localisation/${this.currentSpace.id}/zones`,\r\n },\r\n ];\r\n }\r\n\r\n onGoBack() {\r\n this.editCompleted(null);\r\n }\r\n\r\n ngOnChanges() {\r\n this.resetZones().catch(e => console.log(e.message));\r\n }\r\n\r\n async resetZones() {\r\n this.isMuseumVisit = false;\r\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\r\n this.setupMenuItems();\r\n\r\n this.allZones = await this.zoneService.getZonesBySpace(this.spaceID);\r\n this.defaultZone = this.allZones.find(\r\n (zone) => zone.layer && zone.layer.name === \"BUILDING\" && zone.sweepIDs,\r\n );\r\n\r\n this.floorZones = this.allZones.filter(\r\n (zone) => zone.layer && zone.layer.name === \"FLOOR\",\r\n );\r\n // sort alphabetically\r\n this.floorZones.sort((a, b) => a.name.localeCompare(b.name));\r\n // we add only children zones that are not Floors\r\n if (!!this.defaultZone) {\r\n this.zonesMap.set(this.defaultZone.id, this.allZones.filter((zone) => zone.parentID === this.defaultZone.id && !this.floorZones.includes(zone)));\r\n }\r\n for (const floor of this.floorZones) {\r\n const zonesForFloor = this.allZones.filter((zone) => zone.parentID === floor.id);\r\n this.zonesMap.set(\r\n floor.id,\r\n zonesForFloor.sort((a, b) => a.name.localeCompare(b.name)),\r\n );\r\n }\r\n this.resetNavigations();\r\n this.images360 = await this.visitService.loadImagesForSpace(\r\n this.currentSpace,\r\n );\r\n this.plans = await this.planService.getPlansWithZonesForSpace(\r\n this.spaceID,\r\n );\r\n this.plans = this.plans.filter((plan) => plan.isCurrentForZone);\r\n this.onPlansLoaded().catch(e => console.log(e.message));\r\n }\r\n\r\n resetNavigations() {\r\n this.navigations = [];\r\n const zonesWithSweeps = this.allZones.filter((zone) => zone.sweepIDs);\r\n this.navigations = [\r\n ...new Set(zonesWithSweeps.flatMap((zone) => zone.sweepIDs)),\r\n ];\r\n }\r\n\r\n async onPlansLoaded(): Promise<void> {\r\n if (this.planIsVisible && this.currentZone) {\r\n this.preparePlan().catch(e=>console.log(e.message));\r\n }\r\n }\r\n\r\n /**\r\n * onToggleDetail folds/unfolds details for a zone\r\n * @param index\r\n * @param zone\r\n */\r\n async onToggleDetail(index: number, zone: Zone) {\r\n this.lotIndexDetails = index === this.lotIndexDetails ? -1 : index;\r\n if (this.lotIndexDetails === -1) {\r\n this.currentZone = null;\r\n this.planIsVisible = false;\r\n return;\r\n }\r\n this.currentZone = zone;\r\n this.planIsVisible = true;\r\n if (!this.plans) {\r\n return; // wait until the plans are set\r\n }\r\n if (this.loadingPlan) {\r\n // another plan is already loading\r\n await wait(1000);\r\n }\r\n this.preparePlan().catch(e=>console.log(e.message));\r\n }\r\n\r\n onToggleDetailFloor(index: number, floor: Zone) {\r\n this.defaultShowing = false;\r\n this.floorDetails = index === this.floorDetails ? -1 : index;\r\n if (this.floorDetails === -1) {\r\n this.currentZone = null;\r\n this.planIsVisible = false;\r\n return;\r\n }\r\n this.currentZone = floor;\r\n this.planIsVisible = true;\r\n if (!this.plans) {\r\n console.log(\"plans not ready\");\r\n return; // wait until the plans are set\r\n }\r\n this.preparePlan().catch(e => console.log(e.message));\r\n }\r\n\r\n onToggleDefaultZone() {\r\n this.defaultShowing = !this.defaultShowing;\r\n this.currentZone = this.defaultShowing ? this.defaultZone : null;\r\n }\r\n\r\n async preparePlan() {\r\n this.loadingPlan = true;\r\n this.currentPlan = null;\r\n if (this.currentZone.virtual) {\r\n this.currentPlan = null;\r\n this.loadingPlan = false;\r\n return;\r\n }\r\n this.currentPlan = await this.planService.getCalibratedPlanForZone(\r\n this.currentZone,\r\n );\r\n if (this.currentPlan) {\r\n const scans = await this.navigationService.getNavigationsForZone(\r\n this.currentZone,\r\n );\r\n await this.showScanPointsOnPlan(scans);\r\n }\r\n this.loadingPlan = false;\r\n }\r\n\r\n toggleCarousel() {\r\n this.carouselIsVisible = true;\r\n }\r\n\r\n onEdit(zone: Zone) {\r\n this.zoneForEdit = zone;\r\n if (this.zoneForEdit.layer && this.zoneForEdit.layer.name === \"AUDIO\") {\r\n this.isAddingAudioTrack = true;\r\n } else {\r\n this.isEditingZone = true;\r\n }\r\n\r\n this.menuItems.push({\r\n label: `${zone.name}`,\r\n });\r\n }\r\n\r\n onAddLot() {\r\n this.isMuseumVisit = false;\r\n this.isEditingZone = true;\r\n this.menuItems.push({\r\n label: \"New\",\r\n });\r\n }\r\n\r\n onAddMuseumZone() {\r\n this.isMuseumVisit = true;\r\n this.isEditingZone = true;\r\n this.menuItems.push({\r\n label: \"New Museum Itinerary\",\r\n });\r\n }\r\n\r\n onAddAudioZone(parentZone: Zone) {\r\n this.parentZoneForAudio = parentZone;\r\n this.isAddingAudioTrack = true;\r\n this.menuItems.push({\r\n label: parentZone.name,\r\n });\r\n this.menuItems.push({\r\n label: \"add-audio.add\",\r\n });\r\n }\r\n\r\n async onDelete(zone: Zone) {\r\n const message = this.translate.instant(\"confirm.deleteZone\");\r\n // eslint-disable-next-line no-alert\r\n if (window.confirm(message)) {\r\n const childrenZones = await this.zoneService.getZonesByParentZone(zone.id);\r\n await Promise.all(childrenZones.map(async (childZone) => {\r\n await this.zoneService.deleteZone(childZone.id);\r\n this.allZones.splice(this.allZones.indexOf(childZone), 1);\r\n }));\r\n await this.zoneService.deleteZone(zone.id);\r\n this.allZones.splice(this.allZones.indexOf(zone), 1);\r\n // remove current zone from its parent list\r\n if (zone.parentID && Array.from(this.zonesMap.keys()).includes(zone.parentID)) {\r\n const zonesForParent = this.zonesMap.get(zone.parentID);\r\n zonesForParent.splice(zonesForParent.indexOf(zone), 1);\r\n this.zonesMap.set(zone.parentID, zonesForParent);\r\n }\r\n // we send update of location in order to force update of list of zones in nav bar\r\n this.navigatorService.locationIDChange.next(this.spaceID);\r\n }\r\n }\r\n\r\n editCompleted(event: any) {\r\n this.lotIndexDetails = -1;\r\n this.currentPlan = null;\r\n this.isEditingZone = false;\r\n this.isAddingAudioTrack = false;\r\n this.zoneForEdit = null;\r\n this.planIsVisible = false;\r\n this.carouselIsVisible = false;\r\n this.setupMenuItems();\r\n if (event) {\r\n this.resetZones().catch(e=> console.log(e.message));\r\n // we send update of location in order to force update of list of zones in nav bar\r\n this.navigatorService.locationIDChange.next(this.spaceID);\r\n }\r\n\r\n }\r\n\r\n async showScanPointsOnPlan(navigations: Navigation[]) {\r\n if (this.currentPlan) {\r\n const divPlan = document.querySelector(\"#planDiv\") as HTMLElement;\r\n await showScanPointsOnPlanInDiv(this.currentPlan, divPlan, navigations);\r\n panzoom(divPlan, {\r\n bounds: true,\r\n boundsPadding: 0,\r\n maxZoom: 3.5,\r\n });\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"container-fluid\" *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=\"row\" *ngIf=\"!isEditingZone && !isAddingAudioTrack\">\r\n <div class=\"col-md-6\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item default-zone-line-item\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\" *ngIf=\"defaultZone\">\r\n {{defaultZone.name}}\r\n <div class=\"default-zone-label\">{{ \"whole space\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"defaultShowing\" (click)=\"onToggleDefaultZone()\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"defaultShowing\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}:\r\n {{defaultZone.layer ? defaultZone.layer.name : \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"defaultZone.surface\">\r\n {{'Surface' | translate}}, m<sup>2</sup>: {{defaultZone.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!defaultZone.virtual\">{{'Scan Points' | translate}}:\r\n {{defaultZone.sweepIDs ? defaultZone.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n </ul>\r\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\r\n <div *ngIf=\"pair.key == defaultZone.id\">\r\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-flush list-group-item-action\"\r\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\r\n {{lot.name}}\r\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\"\r\n (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\r\n\r\n </div>\r\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\r\n translate}}: {{lot.layer ? lot.layer.name :\r\n \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">\r\n {{'Surface' | translate}},m<sup>2</sup>: {{lot.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\r\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\r\n {{'Zone not visible in 3D visit' | translate}}</li>\r\n </ul>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\r\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\r\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\r\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n\r\n <li class=\"list-group-item\" *ngFor=\"let floor of floorZones; index as index\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\r\n {{floor.name}}\r\n <!-- <small>({{ lot.metadata ? ('Calibrated' | translate) : ('Not calibrated' | translate)}})</small> -->\r\n <div class=\"museum-label\" *ngIf=\"floor.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"index==floorDetails\"\r\n (click)=\"onToggleDetailFloor(index, floor)\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"index==floorDetails\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}: {{floor.layer ?\r\n floor.layer.name :\r\n \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.surface\">{{'Surface' | translate}}, m<sup>2</sup>:\r\n {{floor.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!floor.virtual\">{{'Scan Points' | translate}}:\r\n {{floor.sweepIDs ? floor.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.virtual\">{{'Zone not visible in 3D visit' |\r\n translate}}</li>\r\n </ul>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onEdit(floor)\">{{'Edit' |\r\n translate}}</button>\r\n\r\n <!-- List of children zones -->\r\n\r\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\r\n <div *ngIf=\"pair.key == floor.id\">\r\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-flush list-group-item-action\"\r\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\r\n <div><span *ngIf=\"lot.code_ref\">{{lot.code_ref}}_</span>{{lot.name}}</div>\r\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\"\r\n (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\r\n\r\n </div>\r\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\r\n translate}}: {{lot.layer ? lot.layer.name :\r\n \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">{{'Surface' | translate}},\r\n m<sup>2</sup>:\r\n {{lot.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\r\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual && lot.isMuseumVisitZone\">\r\n {{'Scan Points with audio' | translate}}: {{ lot | countAudioSweeps | async}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\r\n {{'Zone not visible in 3D visit' | translate}}</li> dist\r\n </ul>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\r\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\r\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\r\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n\r\n <div>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddLot()\">{{'Add zone' |\r\n translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddMuseumZone()\" *ngIf=\"isMuseumModule\">\r\n {{'Add museum itinerary' | translate}}</button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"planIsVisible\">\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loadingPlan\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n <div class=\"row\" style=\"overflow: hidden; flex-direction: column;\">\r\n <div *ngIf=\"currentPlan\">\r\n <lib-plan-legend [isAudioZone]=\"false\"></lib-plan-legend>\r\n <div class=\"planContainer\">\r\n <div class=\"mt-3 ms-3\" style=\"height: 500px; width: 100%;\" id=\"planDiv\"></div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!currentPlan && plans && !loadingPlan && currentZone\">\r\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"!currentZone.virtual && !currentZone.isMultipleFloorZone\">\r\n {{ 'Plan is not calibrated' | translate}}\r\n </div>\r\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.virtual\">\r\n {{ 'No scan points chosen' | translate}}\r\n </div>\r\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.isMultipleFloorZone\">\r\n {{ 'The zone is on several floors' | translate}}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"isEditingZone\">\r\n <lib-add-zone [zoneEdit]=\"zoneForEdit\" [spaceID]=\"spaceID\" [images360]=\"images360\" [navigationIDs]=\"navigations\"\r\n [zones]=\"allZones\" [defaultZone]=\"defaultZone\" (updatedZone)=\"editCompleted($event)\"\r\n [isMuseumVisit]=\"isMuseumVisit\"></lib-add-zone>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"isAddingAudioTrack\">\r\n <lib-add-audio-zone [spaceID]=\"spaceID\" [defaultZone]=\"defaultZone\" [parentZone]=\"parentZoneForAudio\"\r\n [zones]=\"allZones\" [currentAudioZone]=\"zoneForEdit\" (updatedZone)=\"editCompleted($event)\"></lib-add-audio-zone>\r\n </div>\r\n</div>","import { Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Space, Visit, MenuItem, SpaceService, VisitService, NodeService, InventoryStatus, NavigatorService } from '@smarterplan/ngx-smarterplan-core';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-images',\r\n templateUrl: './images.component.html',\r\n styleUrls: ['./images.component.scss']\r\n})\r\nexport class ImagesComponent implements OnInit {\r\n\r\n images: Array<any>;\r\n\r\n spaceID: string;\r\n\r\n currentSpace: Space;\r\n\r\n currentVisit: Visit;\r\n\r\n currentImages: Array<any>;\r\n\r\n loading = false;\r\n\r\n currentScanID: string;\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n destroy$ = new Subject();\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private spaceService: SpaceService,\r\n private visitService: VisitService,\r\n private nodeService: NodeService,\r\n private navigatorService: NavigatorService,\r\n private router: Router,\r\n ) {\r\n this.navigatorService.locationIDChange\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((spaceID) => {\r\n this.router.navigate([\"dashboard/localisation\", spaceID, \"images\"]);\r\n });\r\n\r\n this.route.params.subscribe((params) => {\r\n this.spaceID = params.id;;\r\n this.loadImages();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: \"Locations\", url: \"/localisation\" },\r\n {\r\n label: this.currentSpace.name,\r\n url: `/localisation/${this.spaceID}`,\r\n },\r\n { label: \"360° Images\" },\r\n ];\r\n\r\n if (this.currentVisit) {\r\n this.menuItems.push({ label: this.currentVisit.name });\r\n }\r\n }\r\n\r\n onGoBack() {\r\n this.currentVisit = null;\r\n this.currentImages = null;\r\n this.setupMenuItems();\r\n }\r\n\r\n async loadImages() {\r\n this.loading = true;\r\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\r\n this.setupMenuItems();\r\n this.images = await this.visitService.loadImagesForSpace(\r\n this.currentSpace,\r\n );\r\n if (this.currentSpace.visits.length === 1) {\r\n this.setVisit(this.currentSpace.visits[0]);\r\n }\r\n this.loading = false;\r\n }\r\n\r\n setVisit(visit) {\r\n this.currentVisit = visit;\r\n this.currentImages = this.images.filter((im) => {\r\n return im.visit === visit;\r\n });\r\n this.setupMenuItems();\r\n }\r\n\r\n setCurrentScan(id) {\r\n this.currentScanID = id;\r\n }\r\n\r\n async onInventoryClick() {\r\n const { node } = this.currentVisit;\r\n const { filename } = this.currentImages[this.currentScanID]; // 110ee452_sweep.jpeg\r\n // check if node has already errors of inventory\r\n const missingFilesErrors = [\r\n InventoryStatus.ERROR_FILE_JSON_NOT_EXIST,\r\n InventoryStatus.ERROR_FILE_MODEL_NOT_EXIST,\r\n InventoryStatus.ERROR_FILE_OBJ_NOT_EXIST,\r\n ];\r\n if (\r\n node.inventoryStatus &&\r\n missingFilesErrors.includes(node.inventoryStatus)\r\n ) {\r\n alert(\r\n \"Files missing for this visit's inventory. Contact your administrator.\",\r\n );\r\n } else {\r\n await this.nodeService.updateNode({\r\n id: node.id,\r\n inventoryStatus: InventoryStatus.TO_RUN_ONE_IMAGE,\r\n navigationForInventory: filename.split(\"_\")[0],\r\n });\r\n alert(\r\n \"Automatic AI Inventory started! Detected equipments will appear soon in the visit.\",\r\n );\r\n }\r\n }\r\n\r\n}\r\n","<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>","import { Component, HostListener, NgZone, OnInit, ViewChild } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { getDocument, PDFDocumentProxy } from \"pdfjs-dist\";\r\nimport { Zone, Plan, Space, MenuItem, PlanService, ZoneService, VisitService, SpaceService, sortAlphabeticallyOnName, downloadFileAsObject } from '@smarterplan/ngx-smarterplan-core';\r\n\r\n@Component({\r\n selector: 'lib-edit-plan',\r\n templateUrl: './edit-plan.component.html',\r\n styleUrls: ['./edit-plan.component.scss']\r\n})\r\nexport class EditPlanComponent implements OnInit {\r\n\r\n @ViewChild(\"dialog\") dialog!: any;\r\n\r\n @ViewChild(\"dialogZone\") dialogZone!: any;\r\n\r\n @ViewChild(\"preparing\") loadingModal: any;\r\n\r\n spaceID: string;\r\n\r\n chosenPlan: Plan;\r\n\r\n editedPlan: Plan;\r\n\r\n loading: boolean = false;\r\n\r\n svgEditor;\r\n\r\n svgEditorIframe;\r\n\r\n navigations: string[];\r\n\r\n zones: Zone[];\r\n\r\n isNewZone: boolean = false;\r\n\r\n newZoneData;\r\n\r\n editorUrl;\r\n\r\n editedZone: Zone;\r\n\r\n images360;\r\n\r\n\r\n /**\r\n * Options for svgEditor\r\n */\r\n private config: any = {\r\n noStorageOnLoad: true,\r\n forceStorage: true,\r\n // imgPath: \"/assets/editor/images/\",\r\n // extPath: \"/assets/editor/extensions/\",\r\n // langPath: \"/assets/editor/locale/\",\r\n // canvgPath: \"/assets/editor/canvg/\",\r\n // jspdfPath: \"/assets/editor/jspdf/\",\r\n // jGraduatePath: \"/assets/editor/jgraduate/images/\",\r\n // extIconsPath: \"/assets/editor/extensions/\",\r\n // stylesheets: [\r\n // \"/assets/editor/jgraduate/css/jGraduate.css\",\r\n // \"/assets/editor/spinbtn/jQuery.SpinButton.css\",\r\n // \"/assets/editor/jgraduate/css/jPicker.css\",\r\n // \"/assets/editor/svg-editor.css\",\r\n // ],\r\n dimensions: [10000, 10000],\r\n showlayers: true,\r\n noDefaultExtensions: true,\r\n basePath: \"/assets/editor/\",\r\n customExportImage: true,\r\n extensions: [\r\n \"ext-connector\",\r\n // \"ext-eyedropper\",\r\n // \"ext-grid\",\r\n // \"ext-markers\",\r\n // \"ext-overview_window\",\r\n // \"ext-spi-library\",\r\n // \"ext-spi-icon\",\r\n \"ext-sp-zone\",\r\n // \"ext-arrows\",\r\n // \"ext-sp-css\",\r\n // \"ext-placemark\",\r\n ],\r\n };\r\n\r\n currentSpace: Space;\r\n\r\n menuItems: MenuItem[] = [];\r\n\r\n constructor(\r\n private planService: PlanService,\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private modalService: NgbModal,\r\n private zoneService: ZoneService,\r\n private visitService: VisitService,\r\n private spaceService: SpaceService,\r\n private translate: TranslateService,\r\n private ngZone: NgZone,\r\n ) {\r\n this.chosenPlan = this.planService.getChosenPlan();\r\n }\r\n\r\n async ngOnInit() {\r\n this.editorUrl = \"/assets/editor/main.html\";\r\n this.spaceID = this.route.snapshot.queryParams.spaceID;\r\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\r\n this.setupMenuItems();\r\n if (this.spaceID && !this.planService.getChosenPlan()) {\r\n this.router.navigate([\r\n \"/dashboard/localisation\",\r\n this.spaceID,\r\n \"plans\",\r\n ]);\r\n } else if (!this.spaceID && !this.planService.getChosenPlan()) {\r\n this.router.navigate([\"/dashboard/localisation\"]);\r\n }\r\n }\r\n\r\n setupMenuItems() {\r\n this.menuItems = [\r\n { label: \"Locations\", url: \"/localisation\" },\r\n {\r\n label: this.currentSpace.name,\r\n url: `/localisation/${this.spaceID}`,\r\n },\r\n {\r\n label: \"Plans\",\r\n url: `/localisation/${this.currentSpace.id}/plans`,\r\n },\r\n {\r\n label: \"Edit\",\r\n url: `/localisation/${this.currentSpace.id}/plan-edit?spaceID=${this.currentSpace.id}`,\r\n },\r\n ];\r\n }\r\n\r\n @HostListener(\"window:message\", [\"$event\"])\r\n async switchAction(event) {\r\n if (event.origin === window.location.origin) {\r\n switch (event.data.message) {\r\n case \"save\":\r\n this.onSave(event.data.redirect);\r\n break;\r\n case \"close\":\r\n this.onCancel();\r\n break;\r\n case \"new-zone\":\r\n const modalReference = this.modalService.open(\r\n this.loadingModal,\r\n );\r\n const svg = unescape(\r\n encodeURIComponent(\r\n this.svgEditor.svgCanvas.getSvgString(),\r\n ),\r\n );\r\n\r\n const base64 = `data:image/svg+xml;base64,${window.btoa(\r\n svg,\r\n )}`;\r\n const currentSpace = await this.spaceService.getSpace(\r\n this.spaceID,\r\n );\r\n\r\n this.images360 = await this.visitService.loadImagesForSpace(\r\n currentSpace,\r\n );\r\n\r\n this.editedPlan = { ...this.chosenPlan };\r\n this.editedPlan.filepath = base64;\r\n this.newZoneData = event.data.zoneData;\r\n if (this.newZoneData.elements.length === 0) {\r\n modalReference.close();\r\n alert(this.translate.instant(\"edition.no-zone\"));\r\n break;\r\n }\r\n this.zones = await this.zoneService.getZonesBySpace(\r\n this.spaceID,\r\n );\r\n // this.zones = sortAlphabeticallyOnName(this.zones);\r\n // console.log(\"zones\", this.zones);\r\n // this.editedZone = this.zones.find(\r\n // (z) => z.name === this.newZoneData.name,\r\n // );\r\n this.resetNavigations();\r\n modalReference.close();\r\n this.modalService.open(this.dialogZone);\r\n\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n\r\n async resetNavigations() {\r\n this.navigations = [];\r\n const defaultZone = this.zones.find((zone) => !zone.parentID);\r\n if (defaultZone.sweepIDs.length > 0) {\r\n this.navigations = defaultZone.sweepIDs;\r\n }\r\n }\r\n\r\n async onLoad(svgEditor) {\r\n if (svgEditor.contentWindow.SvgEditor) {\r\n this.svgEditorIframe = svgEditor;\r\n this.svgEditor = new svgEditor.contentWindow.SvgEditor();\r\n\r\n await this.svgEditor.init();\r\n await this.svgEditor.setConfig(this.config, {\r\n allowInitialUserOverride: true,\r\n });\r\n\r\n if (this.chosenPlan && this.chosenPlan.extension === \"svg\") {\r\n this.loadSvg();\r\n }\r\n if (this.chosenPlan && this.chosenPlan.extension === \"pdf\") {\r\n this.loadPdf();\r\n }\r\n if (!this.chosenPlan.calibration || !this.chosenPlan.isModified) {\r\n setTimeout(() => {\r\n this.svgEditorIframe.contentWindow.postMessage(\r\n { action: \"disable-zone\" },\r\n \"*\",\r\n );\r\n }, 1000);\r\n }\r\n\r\n this.svgEditor.svgCanvas.setMode('ext-panning');\r\n this.svgEditor.bottomPanel.changeZoom(50)\r\n }\r\n }\r\n\r\n async onSave(redirect: boolean) {\r\n const imgBlob = await new Blob(\r\n [this.svgEditor.svgCanvas.getSvgString()],\r\n {\r\n type: \"image/svg+xml\",\r\n },\r\n );\r\n const [name] = this.chosenPlan.name.split(\".\");\r\n const imgFile: File = new File([imgBlob], `${name}-edited.svg`, {\r\n type: \"image/svg+xml\",\r\n lastModified: Date.now(),\r\n });\r\n this.planService.setPlanFileCache(imgFile);\r\n if (this.chosenPlan.isModified) {\r\n this.ngZone.run(() =>\r\n this.modalService.open(this.dialog));\r\n } else {\r\n this.ngZone.run(() =>\r\n this.router.navigate([\r\n \"/dashboard/localisation\",\r\n this.spaceID,\r\n \"plans\",\r\n ]));\r\n }\r\n }\r\n\r\n async updateSvg() {\r\n const newUrl = await this.planService.updatePlanFile();\r\n await this.planService.updatePlan({\r\n id: this.chosenPlan.id,\r\n annexe: newUrl,\r\n });\r\n this.planService.setPlanFileCache(null);\r\n this.ngZone.run(() =>\r\n this.router.navigate([\r\n \"/dashboard/localisation\",\r\n this.spaceID,\r\n \"plans\",\r\n ]));\r\n }\r\n\r\n async newSvg() {\r\n this.ngZone.run(() =>\r\n this.router.navigate([\r\n \"/dashboard/localisation\",\r\n this.spaceID,\r\n \"plans\",\r\n ]));\r\n }\r\n\r\n async onCancel() {\r\n if (window.confirm(this.translate.instant(\"edition.cancel-alert\"))) {\r\n this.ngZone.run(() =>\r\n this.router.navigate([\r\n \"/dashboard/localisation\",\r\n this.spaceID,\r\n \"plans\",\r\n ]));\r\n alert(this.translate.instant(\"edition.cancel\"));\r\n }\r\n }\r\n\r\n async loadSvg() {\r\n const svgRequest: any = await downloadFileAsObject(\r\n this.chosenPlan.annexe,\r\n );\r\n if (svgRequest) {\r\n const svgBlob = await svgRequest.Body;\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n this.svgEditor.loadFromDataURI(reader.result);\r\n };\r\n reader.readAsDataURL(svgBlob);\r\n }\r\n }\r\n\r\n async loadPdf() {\r\n this.svgEditorIframe.contentWindow.postMessage(\r\n { action: \"disable-zone\" },\r\n \"*\",\r\n );\r\n const canvas = document.querySelector(\r\n \"#canvas4pdf\",\r\n ) as HTMLCanvasElement;\r\n const context = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\r\n\r\n const pdfjs = await import(\"pdfjs-dist/build/pdf\");\r\n const pdfjsWorker = await import(\"pdfjs-dist/build/pdf.worker.entry\");\r\n\r\n pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;\r\n\r\n const pdf: PDFDocumentProxy = await getDocument(\r\n this.chosenPlan.filepath,\r\n ).promise;\r\n const page = await pdf.getPage(1);\r\n\r\n const viewPortParameters = { scale: 1.5 };\r\n const viewport = page.getViewport(viewPortParameters);\r\n this.svgEditor.svgCanvas.setResolution(viewport.width, viewport.height);\r\n\r\n canvas.height = viewport.height;\r\n canvas.width = viewport.width;\r\n const renderContext = {\r\n canvasContext: context,\r\n viewport,\r\n };\r\n const renderTask = page.render(renderContext).promise;\r\n renderTask.then(() => {\r\n const newImage = this.svgEditor.svgCanvas.addSVGElementFromJson({\r\n element: \"image\",\r\n attr: {\r\n x: 0,\r\n y: 0,\r\n width: viewport.width,\r\n height: viewport.height,\r\n id: this.svgEditor.svgCanvas.getNextId(),\r\n style: \"pointer-events:inherit\",\r\n },\r\n });\r\n this.svgEditor.svgCanvas.setHref(\r\n newImage,\r\n canvas.toDataURL(\"image/png\"),\r\n );\r\n\r\n this.svgEditor.svgCanvas.renameCurrentLayer(this.translate.instant(\"edition.plan-base\"));\r\n this.svgEditor.svgCanvas.createLayer(this.translate.instant(\"edition.personalization\"));\r\n });\r\n }\r\n\r\n async onLoadImg(img: any) {\r\n this.svgEditorIframe.contentWindow.postMessage(\r\n { action: \"disable-zone\" },\r\n \"*\",\r\n );\r\n const imgRequest: any = await downloadFileAsObject(\r\n this.chosenPlan.annexe,\r\n );\r\n if (imgRequest) {\r\n const imgBlob = await imgRequest.Body;\r\n const imgWidth = img.naturalWidth;\r\n const imgHeight = img.naturalHeight;\r\n // await this.svgEditor.setConfig({\r\n // dimensions: [imgWidth, imgHeight],\r\n // });\r\n this.svgEditor.svgCanvas.setResolution(imgWidth, imgHeight);\r\n\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n const newImage = this.svgEditor.svgCanvas.addSVGElementFromJson(\r\n {\r\n element: \"image\",\r\n attr: {\r\n x: 0,\r\n y: 0,\r\n width: imgWidth,\r\n height: imgHeight,\r\n id: this.svgEditor.svgCanvas.getNextId(),\r\n style: \"pointer-events:inherit\",\r\n },\r\n },\r\n );\r\n this.svgEditor.svgCanvas.setHref(newImage, reader.result);\r\n this.svgEditor.svgCanvas.renameCurrentLayer(this.translate.instant(\"edition.plan-base\"));\r\n this.svgEditor.svgCanvas.createLayer(this.translate.instant(\"edition.personalization\"));\r\n };\r\n reader.readAsDataURL(imgBlob);\r\n }\r\n }\r\n\r\n onNewZone(event) {\r\n this.isNewZone = false;\r\n if (event) {\r\n this.svgEditorIframe.contentWindow.postMessage(\r\n { action: \"rename-layer\", name: event },\r\n \"*\",\r\n );\r\n } else {\r\n this.svgEditorIframe.contentWindow.postMessage(\r\n { action: \"cancel-layer\" },\r\n \"*\",\r\n );\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"row mt-3\">\r\n <div class=\"col\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems'></lib-tab-navigation>\r\n </div>\r\n </div>\r\n</div>\r\n<lib-add-zone *ngIf=\"isNewZone\" [images360]=\"images360\" [spaceID]=\"spaceID\" [navigationIDs]=\"navigations\"\r\n [zoneEdit]=\"editedZone\" [zones]=\"zones\" (updatedZone)=\"onNewZone($event)\" [chosenPlan]=\"editedPlan\"\r\n [newZoneDataFromEditor]=\"newZoneData\"></lib-add-zone>\r\n<iframe *ngIf=\"editorUrl\" #svgEditor [src]=\"editorUrl | safeUrl\" frameborder=\"0\"\r\n style=\"height:100%;width:100%;min-height:550px;max-height:750px\" (load)=\"onLoad(svgEditor)\"></iframe>\r\n<!-- chosenPlan && -->\r\n<!-- ./../../../../../../assets/svgeditor/index.html -->\r\n\r\n<img #imgPng *ngIf=\"chosenPlan && chosenPlan.extension !== 'svg' && svgEditor\" [src]=\"chosenPlan.filepath\"\r\n (load)=\"onLoadImg(imgPng)\" style=\"display: none;\">\r\n\r\n<canvas id=\"canvas4pdf\" style=\"display: none;\"></canvas>\r\n\r\n<ng-template #dialog let-modal>\r\n\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n {{'save plan edited' | translate}}\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"newSvg();modal.close('Close click')\">{{'Yes' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"updateSvg();modal.close('Close click')\">{{'No' |\r\n translate}}</button>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #dialogZone let-modal>\r\n\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n {{'confirm.new-zone-from-plan' | translate}}\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-outline-dark\"\r\n (click)=\"isNewZone = true;modal.close('Close click')\">{{'Validate' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"modal.close('Close click')\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #preparing let-modal>\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">{{'Processing' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-template>","import { NgModule } from \"@angular/core\";\r\nimport { Routes, RouterModule } from \"@angular/router\";\r\nimport { CalibrationComponent } from \"./components/plans/calibration/calibration.component\";\r\nimport { DetailLocationComponent } from \"./components/detail-location/detail-location.component\";\r\nimport { EditPlanComponent } from \"./components/plans/edit-plan/edit-plan.component\";\r\nimport { ImagesComponent } from \"./components/images/images.component\";\r\nimport { LocationsComponent } from \"./components/locations/locations.component\";\r\nimport { PlansComponent } from \"./components/plans/plans.component\";\r\nimport { VisitsComponent } from \"./components/visits/visits.component\";\r\nimport { ZonesComponent } from \"./components/zones/zones.component\";\r\n\r\nconst routes: Routes = [\r\n {\r\n path: \"\",\r\n component: LocationsComponent,\r\n },\r\n {\r\n path: \":id\",\r\n children: [\r\n { path: \"\", component: DetailLocationComponent },\r\n { path: \"zones\", component: ZonesComponent },\r\n { path: \"visits\", component: VisitsComponent },\r\n { path: \"plans\", component: PlansComponent },\r\n {\r\n path: \"plan-calibration\",\r\n component: CalibrationComponent,\r\n },\r\n {\r\n path: \"plan-edit\",\r\n component: EditPlanComponent,\r\n },\r\n { path: \"images\", component: ImagesComponent },\r\n ],\r\n },\r\n ];\r\n \r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule],\r\n})\r\nexport class LocationsRoutingModule { }","import { NgModule } from '@angular/core';\r\nimport { LocationsComponent } from './components/locations/locations.component';\r\nimport { DetailLocationComponent } from './components/detail-location/detail-location.component';\r\nimport { CalibrationComponent } from './components/plans/calibration/calibration.component';\r\nimport { PlansComponent } from './components/plans/plans.component';\r\nimport { VisitsComponent } from './components/visits/visits.component';\r\nimport { ZonesComponent } from './components/zones/zones.component';\r\nimport { ImagesComponent } from './components/images/images.component';\r\nimport { EditPlanComponent } from './components/plans/edit-plan/edit-plan.component';\r\nimport { LocationsRoutingModule } from './ngx-smarterplan-location-routing.module';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TabNavigationComponent } from './components/tab-navigation/tab-navigation.component';\r\nimport { MapComponent } from './components/locations/map/map.component';\r\nimport { LeafletModule } from '@asymmetrik/ngx-leaflet';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { MapPopupComponent } from './components/locations/map/map-popup/map-popup.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormLocationComponent } from './components/form-location/form-location.component';\r\nimport { NgbAlertModule, NgbModule } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { ClipboardModule } from \"@angular/cdk/clipboard\";\r\nimport { ChevronComponent } from './components/chevron/chevron.component';\r\nimport { AddZoneComponent } from './components/zones/add-zone/add-zone.component';\r\nimport { SelectionComponent } from './components/zones/add-zone/selection/selection.component';\r\nimport { CarouselComponent } from './components/carousel/carousel.component';\r\nimport { NgxSmarterplanCoreModule } from '@smarterplan/ngx-smarterplan-core';\r\nimport { PdfViewerModule } from 'ng2-pdf-viewer';\r\nimport { SweepPlanSelectionComponent } from './components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component';\r\nimport { AddAudioZoneComponent } from './components/zones/add-audio-zone/add-audio-zone.component';\r\nimport { RadioButtonComponent } from './radio-button/radio-button.component';\r\nimport { PlanLegendComponent } from './components/plan-legend/plan-legend.component';\r\nimport { CountAudioSweepsPipe } from './pipes/count-audio-sweeps.pipe';\r\n\r\n@NgModule({\r\n declarations: [\r\n LocationsComponent,\r\n DetailLocationComponent,\r\n CalibrationComponent,\r\n PlansComponent,\r\n VisitsComponent,\r\n ZonesComponent,\r\n ImagesComponent,\r\n EditPlanComponent,\r\n TabNavigationComponent,\r\n MapComponent,\r\n MapPopupComponent,\r\n FormLocationComponent,\r\n ChevronComponent,\r\n AddZoneComponent,\r\n SelectionComponent,\r\n CarouselComponent,\r\n SweepPlanSelectionComponent,\r\n AddAudioZoneComponent,\r\n RadioButtonComponent,\r\n PlanLegendComponent,\r\n CountAudioSweepsPipe,\r\n ],\r\n imports: [\r\n PdfViewerModule,\r\n ClipboardModule,\r\n NgbModule,\r\n NgbAlertModule,\r\n CommonModule,\r\n TranslateModule.forChild({\r\n extend: true\r\n }),\r\n LeafletModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n NgxSmarterplanCoreModule,\r\n LocationsRoutingModule,\r\n ],\r\n exports: [MapComponent, TabNavigationComponent]\r\n})\r\nexport class NgxSmarterplanLocationsModule { }\r\n","/*\r\n * Public API Surface of ngx-smarterplan-locations\r\n */\r\n\r\nexport * from './lib/ngx-smarterplan-locations.service';\r\nexport * from './lib/ngx-smarterplan-locations.module';\r\n\r\n// Components\r\n\r\nexport * from './lib/components/locations/map/map.component';\r\nexport * from './lib/components/tab-navigation/tab-navigation.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1","i3","i5","i5.TabNavigationComponent","i6.MapComponent","i7.FormLocationComponent","i8","i4","i6","i7","i8.TabNavigationComponent","i9.FormLocationComponent","i7.TabNavigationComponent","i8.ChevronComponent","i5.SelectionComponent","i6.RadioButtonComponent","i7.PlanLegendComponent","i4.CarouselComponent","i5.SweepPlanSelectionComponent","i6.SweepPlanSelectionComponent","i6.ChevronComponent","i7.AddZoneComponent","i8.AddAudioZoneComponent","i9.PlanLegendComponent","i10.CountAudioSweepsPipe","i6.CarouselComponent","i6.TabNavigationComponent"],"mappings":"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"}