@smarterplan/ngx-smarterplan-locations 0.2.63 → 0.2.64

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/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/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/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, ComponentFactoryResolver, 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 componentFactoryResolver: ComponentFactoryResolver,\r\n private injector: Injector,) { }\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.componentFactoryResolver\r\n .resolveComponentFactory(MapPopupComponent)\r\n .create(this.injector);\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($event)\" id=\"map\" leaflet\r\n style=\"height: 500px; margin-top: 30px; z-index: 195\"></div>\r\n","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { FormGroup, FormBuilder, 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: FormGroup;\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: FormBuilder,\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 { FormGroup } 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: FormGroup;\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 { FormGroup } 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: FormGroup;\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'\"\r\n (click)=\"onDpeValidate()\" 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 ngxClipboard [cbContent]=\"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()\" data-testid=\"location-edit-btn\">{{'Edit' |\r\n translate}}</button>\r\n <div class=\"tooltip-wrapper\" 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></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>\r\n","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 } from 'pdfjs-dist';\r\nimport { 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 { FormGroup, FormBuilder, 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: FormGroup;\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: FormBuilder,\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 FormGroup,\r\n FormBuilder,\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: FormGroup;\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: FormBuilder,\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, 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\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>\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 FormGroup,\r\n FormBuilder,\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: FormGroup;\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: FormBuilder,\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 { FormGroup, FormBuilder, 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: FormGroup;\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: FormBuilder,\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 } from \"pdfjs-dist\";\r\nimport { 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 \"ngx-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","i4","i5","i3.TabNavigationComponent","i4.MapComponent","i5.FormLocationComponent","i8","i4.TabNavigationComponent","i7","i9","i6","i5.TabNavigationComponent","i6.TabNavigationComponent","i7.ChevronComponent","i3.SelectionComponent","i4.PlanLegendComponent","i5.RadioButtonComponent","i3.CarouselComponent","i4.SweepPlanSelectionComponent","i5.SweepPlanSelectionComponent","i5.ChevronComponent","i6.PlanLegendComponent","i7.AddZoneComponent","i8.AddAudioZoneComponent","i10.CountAudioSweepsPipe","i4.CarouselComponent","i6.AddZoneComponent"],"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/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/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/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, ComponentFactoryResolver, 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 componentFactoryResolver: ComponentFactoryResolver,\r\n private injector: Injector,) { }\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.componentFactoryResolver\r\n .resolveComponentFactory(MapPopupComponent)\r\n .create(this.injector);\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 { FormGroup, FormBuilder, 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: FormGroup;\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: FormBuilder,\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 { FormGroup } 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: FormGroup;\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 { FormGroup } 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: FormGroup;\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'\"\r\n (click)=\"onDpeValidate()\" 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 ngxClipboard [cbContent]=\"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()\" data-testid=\"location-edit-btn\">{{'Edit' |\r\n translate}}</button>\r\n <div class=\"tooltip-wrapper\" 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></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>\r\n","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 } from 'pdfjs-dist';\r\nimport { 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 { FormGroup, FormBuilder, 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: FormGroup;\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: FormBuilder,\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 FormGroup,\r\n FormBuilder,\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: FormGroup;\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: FormBuilder,\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, 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\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, 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 FormGroup,\r\n FormBuilder,\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: FormGroup;\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: FormBuilder,\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 { FormGroup, FormBuilder, 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: FormGroup;\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: FormBuilder,\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 } from \"pdfjs-dist\";\r\nimport { 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 \"ngx-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","i4","i5","i3.TabNavigationComponent","i4.MapComponent","i5.FormLocationComponent","i8","i4.TabNavigationComponent","i7","i9","i6","i5.TabNavigationComponent","i6.TabNavigationComponent","i7.ChevronComponent","i3.SelectionComponent","i4.PlanLegendComponent","i5.RadioButtonComponent","i3.CarouselComponent","i4.SweepPlanSelectionComponent","i5.SweepPlanSelectionComponent","i5.ChevronComponent","i6.PlanLegendComponent","i7.AddZoneComponent","i8.AddAudioZoneComponent","i10.CountAudioSweepsPipe","i4.CarouselComponent","i6.AddZoneComponent"],"mappings":"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"}