@smarterplan/ngx-smarterplan-locations 0.4.20 → 0.4.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/detail-location/detail-location.component.mjs +40 -4
- package/esm2022/lib/components/visits/visits.component.mjs +5 -2
- package/fesm2022/smarterplan-ngx-smarterplan-locations.mjs +42 -3
- package/fesm2022/smarterplan-ngx-smarterplan-locations.mjs.map +1 -1
- package/lib/components/detail-location/detail-location.component.d.ts +13 -0
- package/package.json +2 -2
|
@@ -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/landmark-picker/landmark-picker.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/landmark-picker/landmark-picker.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/models3d/models3d.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/models3d/models3d.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/carousel/carousel.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/carousel/carousel.component.html","../../../projects/ngx-smarterplan-locations/src/lib/helper.service.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/selection/selection.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/selection/selection.component.html","../../../projects/ngx-smarterplan-locations/src/lib/radio-button/radio-button.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/radio-button/radio-button.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/plan-legend/plan-legend.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/plan-legend/plan-legend.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/add-zone.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/add-zone.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-audio-zone/add-audio-zone.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-audio-zone/add-audio-zone.component.html","../../../projects/ngx-smarterplan-locations/src/lib/pipes/count-audio-sweeps.pipe.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/zones.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/zones.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/images/images.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/images/images.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/edit-plan/edit-plan.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/edit-plan/edit-plan.component.html","../../../projects/ngx-smarterplan-locations/src/lib/ngx-smarterplan-location-routing.module.ts","../../../projects/ngx-smarterplan-locations/src/lib/ngx-smarterplan-locations.module.ts","../../../projects/ngx-smarterplan-locations/src/public-api.ts","../../../projects/ngx-smarterplan-locations/src/smarterplan-ngx-smarterplan-locations.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NgxSmarterplanLocationsService {\n\n constructor() { }\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { MenuItem } from '@smarterplan/ngx-smarterplan-core';\n\n@Component({\n selector: 'lib-tab-navigation',\n templateUrl: './tab-navigation.component.html',\n styleUrls: ['./tab-navigation.component.scss']\n})\nexport class TabNavigationComponent {\n\n @Output() onGoBack = new EventEmitter<void>();\n\n @Input() menuItems: MenuItem[] = [];\n\n constructor(private router: Router) { }\n\n onClick(url: string, parameter: any, index: number) {\n if (index === this.menuItems.length - 1) {\n return;\n }\n if (url) {\n const newURL = `/dashboard${url}`;\n if (this.router.url !== newURL) {\n console.log('new url', newURL);\n this.router.navigate([newURL]);\n } else {\n this.onGoBack.emit(parameter);\n }\n } else {\n this.onGoBack.emit(parameter);\n }\n }\n\n}\n","<span class=\"menu\">\n <span *ngFor=\"let item of menuItems; let index = index;\">\n <span class=\"item\" [ngClass]=\"{'current':index === menuItems.length - 1}\"\n (click)=\"onClick(item.url,item.back, index)\">{{item.label | translate}}</span> <span\n *ngIf=\"index !== menuItems.length - 1\" class=\"separator\">></span>\n </span>\n</span>\n","import { Component, NgZone, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Marker } from 'leaflet';\nimport { Space, Visit } from '@smarterplan/ngx-smarterplan-core';\n\n@Component({\n selector: 'lib-map-popup',\n templateUrl: './map-popup.component.html',\n styleUrls: ['./map-popup.component.scss']\n})\nexport class MapPopupComponent implements OnInit {\n\n space: Space;\n\n marker: Marker;\n\n popuparea: HTMLElement;\n\n isOnPopup = false;\n\n isMuseumUser = true;\n\n constructor(private router: Router, private ngZone: NgZone) { }\n\n ngOnInit() {\n this.marker.on(\"click\", () => this.onClickVisitFirst());\n\n this.marker.on(\"mouseover\", () => {\n this.isOnPopup = true;\n if (!this.marker.isPopupOpen()) {\n this.openPopup();\n }\n });\n }\n\n openPopup() {\n this.marker.openPopup();\n\n this.isOnPopup = false;\n this.popuparea = document.querySelector(\".leaflet-popup\") as HTMLElement;\n\n if (this.popuparea) {\n this.popuparea.addEventListener(\"mouseleave\", () => {\n this.closePopup();\n });\n this.popuparea.addEventListener(\"mouseover\", () => {\n this.isOnPopup = true;\n });\n }\n this.marker.on(\"mouseout\", () => {\n this.closePopup();\n });\n }\n\n closePopup() {\n this.isOnPopup = false;\n /** We want to wait to avoid glitch */\n setTimeout(() => {\n if (!this.isOnPopup) {\n this.marker.closePopup();\n }\n }, 100);\n }\n\n onClickVisitFirst() {\n if (this.space.visits.length === 0) {\n console.log(\"No space to visit !\");\n } else {\n this.onVisitClick(this.space.visits[0]);\n }\n }\n\n async onVisitClick(visit: Visit) {\n this.ngZone.run(() => {\n this.router.navigate([\"visit\", this.space.id], {\n queryParams: { model3D: visit.model3d },\n });\n });\n }\n\n}\n","<div id=\"map-popup\">\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\n <img [src]=\"space.annexes\" />\n </div>\n <div class=\"map-popup-details\">\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\n <span class=\"map-popup-address\">{{space.addresses}}</span>\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\n [style.cursor]=\"'pointer'\">➤ {{ visit.name ? visit.name : space.name}}</span>\n </div>\n</div>\n","import { Component, Input, OnChanges, SimpleChanges, ViewContainerRef, ViewChild, AfterViewInit } from '@angular/core';\nimport { Space } from '@smarterplan/ngx-smarterplan-core';\nimport {\n latLng,\n marker,\n tileLayer,\n Map,\n latLngBounds,\n point,\n Marker,\n icon,\n} from \"leaflet\";\nimport { MapPopupComponent } from './map-popup/map-popup.component';\n\n\nconst iconRetinaUrl = \"assets/marker-icon-2x.png\";\nconst iconUrl = \"assets/marker-icon.png\";\nconst shadowUrl = \"assets/marker-shadow.png\";\nconst iconDefault = icon({\n iconRetinaUrl,\n iconUrl,\n shadowUrl,\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n tooltipAnchor: [16, -28],\n shadowSize: [41, 41],\n});\nMarker.prototype.options.icon = iconDefault;\n@Component({\n selector: 'lib-map',\n templateUrl: './map.component.html',\n styleUrls: ['./map.component.scss']\n})\nexport class MapComponent implements OnChanges, AfterViewInit {\n\n constructor() { }\n\n @Input() spaces: Space[];\n @ViewChild('popupContainer', { read: ViewContainerRef, static: true }) popupContainer: ViewContainerRef;\n\n options = {\n layers: [\n tileLayer(\"http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\", {\n maxZoom: 18,\n attribution: \"...\",\n }),\n ],\n zoom: 5.5,\n center: latLng(47.06394, 2.77736),\n };\n\n layers: any[] = [];\n\n map: any;\n private isViewInitialized = false;\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.spaces) {\n if (this.isViewInitialized) {\n this.rebuildLayers();\n }\n }\n }\n\n ngAfterViewInit() {\n this.isViewInitialized = true;\n this.rebuildLayers();\n }\n\n private rebuildLayers() {\n if (!this.spaces) {\n return;\n }\n\n const nm = [];\n const bd = [];\n\n // Clear previous components to avoid leakage. \n // this.viewContainerRef.clear(); // Removed as we use the dedicated container\n if (this.popupContainer) {\n this.popupContainer.clear();\n }\n\n // Filtering out spaces without lat/longitudes\n for (const s of this.spaces) {\n if (s.latitude === null || s.longitude === null) {\n console.log(\n `${s.name} has not coordinates for ${s.addresses}`,\n );\n continue;\n }\n // We use the popup system from leaflet, as it packs a few improvements\n // on using bootstrap: autoclose other popups, closing option.\n const m = marker([s.latitude, s.longitude]);\n\n m.bindPopup(this.createPopupComponent(s, m));\n\n nm.push(m);\n bd.push(latLng(s.latitude, s.longitude));\n }\n // Note how we set the layers in one assignment, in order to have leaflet\n // detects the change correctly\n // We also set the bounds afterward, for the map to be properly zoomed and\n // centered\n this.layers = nm;\n if (this.map && bd.length > 0) {\n this.map.fitBounds(latLngBounds(bd), {\n padding: point(48, 48),\n maxZoom: 12,\n animate: true,\n });\n }\n }\n\n // Previous ngOnChanges logic was moved to rebuildLayers()\n\n onMapReady(map: Map) {\n this.map = map;\n }\n\n createPopupComponent(space: Space, marker: Marker) {\n if (!this.popupContainer) {\n console.warn(\"Popup container not ready yet\");\n return \"\";\n }\n const comp = this.popupContainer.createComponent(MapPopupComponent);\n comp.instance.space = space;\n comp.instance.marker = marker;\n comp.changeDetectorRef.detectChanges();\n return comp.location.nativeElement;\n }\n\n}\n","<div [leafletLayers]=\"layers\" [leafletOptions]=\"options\" (leafletMapReady)=\"onMapReady($any($event))\" id=\"map\" leaflet\n style=\"height: 500px; margin-top: 30px; z-index: 195\"></div>\n\n<!-- Hidden container for popup components to avoid display leakage and manage lifecycle -->\n<div style=\"display: none\">\n <div #popupContainer></div>\n</div>","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\nimport { UntypedFormGroup, UntypedFormBuilder, Validators, AbstractControl } from '@angular/forms';\nimport { Space, LevelStatus, SpaceService, PropertyService, BaseUserService, MissionService, enumToArray, uploadFileToS3, Layer, PropertyType, getSignedImageUrlForSpace, LayerService, deleteFromS3 } from '@smarterplan/ngx-smarterplan-core';\nimport { ValidatorsService, textValidator, noEmptyValidator, floatValidator } from \"@smarterplan/ngx-smarterplan-core\";\n\n@Component({\n selector: 'lib-form-location',\n templateUrl: './form-location.component.html',\n styleUrls: ['./form-location.component.scss']\n})\nexport class FormLocationComponent implements OnInit {\n\n form: UntypedFormGroup;\n\n @ViewChild(\"imageInputContainer\")\n imageInputContainer: ElementRef;\n\n @ViewChild(\"imageInput\")\n imageInput: ElementRef;\n\n @ViewChild(\"imageBasePreview\")\n imageBasePreview: ElementRef;\n\n @Input()\n location: Space;\n\n imageToUpload: any;\n\n isSubmitted = false;\n\n levels: Array<LevelStatus>;\n\n addMissionForNewSpace = true;\n\n imageInputText: string;\n\n currentImage: string;\n\n imageToBeDeleted: boolean = false;\n\n errorForm: boolean = false;\n\n @Output() onChange = new EventEmitter<Space | null>();\n\n constructor(\n private spaceService: SpaceService,\n private propertyService: PropertyService,\n private userService: BaseUserService,\n private fb: UntypedFormBuilder,\n private missionService: MissionService,\n private layerService: LayerService,\n public validatorsService: ValidatorsService\n ) {\n this.levels = enumToArray(LevelStatus);\n }\n\n ngOnInit(): void {\n if (this.location) {\n this.initEditForm();\n } else {\n this.initForm();\n }\n this.handleInputImageText();\n }\n\n initForm() {\n this.form = this.fb.group({\n name: [\"\", [Validators.required, Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n addresses: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n latitude: [null, [Validators.maxLength(255), noEmptyValidator(), floatValidator()]],\n longitude: [null, [Validators.maxLength(255), noEmptyValidator(), floatValidator()]],\n level: LevelStatus.LOW,\n classGes: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n classEnergyConsumption: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n constructionYear: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n });\n }\n\n initEditForm() {\n this.form = this.fb.group({\n id: this.location.id,\n name: [this.location.name, [Validators.required, Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n addresses: [this.location.addresses, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n latitude: [this.location.latitude, [Validators.maxLength(255), floatValidator()]],\n longitude: [this.location.longitude, [Validators.maxLength(255), floatValidator()]],\n level: this.location.level,\n classGes: [this.location.classGes, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n classEnergyConsumption: [this.location.classEnergyConsumption, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n constructionYear: [this.location.constructionYear, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n });\n }\n\n handleImageInput(target: EventTarget) {\n this.imageToUpload = (target as HTMLInputElement).files[0];\n if (this.imageToUpload) {\n this.imageInputContainer.nativeElement.style.display = \"none\";\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n this.currentImage = reader.result as string;\n });\n reader.readAsDataURL(this.imageToUpload);\n }\n }\n\n async uploadImage(spaceID: string) {\n if (this.imageToUpload) {\n uploadFileToS3(\"locations/\", this.imageToUpload, spaceID).then(\n async (url) => {\n if (url) {\n await this.spaceService.updateSpace({\n id: spaceID,\n annexes: url,\n });\n }\n },\n );\n } else if (this.imageToBeDeleted) {\n await this.spaceService.updateSpace({\n id: spaceID,\n annexes: null,\n });\n await deleteFromS3(this.location.annexes);\n }\n }\n\n clearImageFile() {\n this.imageToUpload = null;\n this.currentImage = null;\n this.imageInputContainer.nativeElement.style.display = \"flex\";\n this.imageInput.nativeElement.value = \"\";\n this.imageInputText = \"Add picture\";\n }\n\n async getLayerByName(name: string): Promise<Layer> {\n const currentOrgId = this.userService.currentOrganisation().id;\n const layers = await this.layerService.getLayerByNameForOrganisation(\n name,\n currentOrgId,\n );\n if (layers) {\n return layers[0];\n }\n // create then\n return this.layerService.createLayerForOrganisation(name, currentOrgId);\n }\n\n async onSubmit() {\n this.isSubmitted = true;\n if (!this.form.valid) {\n this.errorForm = true;\n return;\n }\n try {\n this.errorForm = false;\n let space;\n if (this.location) {\n this.changeCommaToDot();\n space = await this.spaceService.updateSpace(this.form.value);\n if (space) {\n await this.uploadImage(space.id);\n this.location = space;\n this.onChange.emit(space);\n }\n } else {\n this.changeCommaToDot();\n const spaceInput = this.form.value as Space;\n const currentOrgID = this.userService.currentOrganisation().id;\n spaceInput.organisationID = currentOrgID;\n let layer = await this.getLayerByName(\"BUILDING\");\n if (!layer) {\n layer = await this.layerService.createLayerForOrganisation(\n \"BUILDING\",\n currentOrgID,\n );\n }\n space = await this.spaceService.createSpace(\n spaceInput,\n layer,\n );\n\n const missions = this.userService.getManagerMissions();\n if (space && missions.length > 0) {\n const exampleMission = missions[0];\n await this.uploadImage(space.id);\n try {\n await this.propertyService.createProperty({\n type: PropertyType.PROPERTY,\n spaceID: space.id,\n organisationID: currentOrgID,\n });\n } catch (e) {\n console.log(\"API Service does not have Property requests\");\n }\n\n // add directly a mission for this space\n if (this.addMissionForNewSpace) {\n await this.missionService.create({\n spaceID: space.id,\n userID: exampleMission.userID,\n role: exampleMission.role,\n level: exampleMission.level,\n organisationID: exampleMission.organisationID,\n orderedOrganisationID:\n exampleMission.organisationID,\n });\n }\n this.onChange.emit(space);\n } else {\n this.onChange.emit(null);\n }\n }\n } catch (error) {\n console.error(error);\n this.onChange.emit(null);\n }\n }\n\n onCancel() {\n this.form.reset();\n this.onChange.emit(null);\n }\n\n get name(): AbstractControl {\n return this.form.get(\"name\");\n }\n\n changeCommaToDot() {\n const updatedSpace = this.form.value;\n if (\n updatedSpace.latitude &&\n updatedSpace.latitude.toString().includes(\",\")\n ) {\n updatedSpace.latitude = updatedSpace.latitude\n .toString()\n .replace(\",\", \".\");\n Number.parseFloat(updatedSpace.latitude);\n }\n if (\n updatedSpace.longitude &&\n updatedSpace.longitude.toString().includes(\",\")\n ) {\n updatedSpace.longitude = updatedSpace.longitude\n .toString()\n .replace(\",\", \".\");\n Number.parseFloat(updatedSpace.longitude);\n }\n }\n\n handleInputImageText() {\n if (this.location && this.location.annexes) {\n this.imageInputText = \"Change picture\";\n getSignedImageUrlForSpace(this.location).then((url) => {\n if (url) {\n this.currentImage = url;\n }\n });\n } else {\n this.imageInputText = \"Add picture\";\n }\n }\n\n\n isFormError(control) {\n return control && control.invalid && this.errorForm;\n }\n\n\n onFormChange() {\n if (this.errorForm && this.form.valid) {\n this.errorForm = false;\n }\n\n }\n}\n","<div class=\"col-md-6 form-new-loc\" *ngIf=\"form\">\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" data-testid=\"new-location-name\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['name'])|| isFormError(form.controls['name'])}\"\n required formControlName=\"name\">\n\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-name-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['name']) \n || isFormError(form.controls['name'])\">\n {{validatorsService.getError(form.controls['name']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"addresses\" data-testid=\"new-location-address\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['addresses']) || isFormError(form.controls['addresses'])}\">\n <div class=\"invalid-feedback\">\n <span data-testid=\"\" [translate]=\"validatorsService.getError(form.controls['addresses'])\"\n *ngIf=\" validatorsService.isControlError(form.controls['addresses'])\"></span>\n\n <ngb-alert data-testid=\"new-location-address-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['addresses']) \">\n\n {{validatorsService.getError(form.controls['addresses']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Construction year' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"constructionYear\"\n data-testid=\"new-location-constructionYear\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-constructionYear-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])\">\n {{validatorsService.getError(form.controls['constructionYear']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Latitude' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"latitude\" data-testid=\"new-location-latitude\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['latitude'])|| isFormError(form.controls['latitude'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-latitude-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['latitude']) || isFormError(form.controls['latitude'])\">\n {{validatorsService.getError(form.controls['latitude']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Longitude' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"longitude\" data-testid=\"new-location-longitude\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['longitude'])|| isFormError(form.controls['longitude'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-longitude-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['longitude']) || isFormError(form.controls['longitude'])\">\n {{validatorsService.getError(form.controls['longitude']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Access level' | translate}}</label>\n <div class=\"col-sm-9\">\n <select class=\"d-inline-block custom-select rounded-pill\" formControlName=\"level\">\n <option *ngFor=\"let level of levels\" [value]=\"level\">{{level | translate}}</option>\n </select>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Energy Class' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"classEnergyConsumption\"\n data-testid=\"new-location-classEnergyConsumption\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-classEnergyConsumption-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])\">\n {{validatorsService.getError(form.controls['classEnergyConsumption']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Greenhouse gas emission Class' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"classGes\" data-testid=\"new-location-classGes\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classGes'])|| isFormError(form.controls['classGes'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-classGes-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['classGes']) || isFormError(form.controls['classGes'])\">\n {{validatorsService.getError(form.controls['classGes']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Cover picture' | translate}}</label>\n <div class=\"col-sm-9\">\n <img #imageBasePreview *ngIf=\"currentImage\" class=\"image-preview\" [src]=\"currentImage\">\n <label #imageInputContainer for=\"image\"\n class=\"btn btn-label-file btn-outline-primary rounded-pill imageInputContainer\">\n <input #imageInput type=\"file\" id=\"image\" (change)=\"handleImageInput($event.target)\" />\n {{ imageInputText | translate}}</label>\n <button *ngIf=\"currentImage && !imageToUpload\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"imageToBeDeleted=true;clearImageFile()\">{{'Delete picture' | translate }}</button>\n <div class=\"image-name\" *ngIf=\"imageToUpload\">\n <p>{{ imageToUpload.name}}</p>\n <div (click)=\"clearImageFile()\" [style.cursor]=\"'pointer'\">\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"mb-3 row\" *ngIf=\"!location\">\n <label class=\"col-sm-3 col-form-label\">{{'Create mission for this space' | translate}}</label>\n <div class=\"col-sm-3\">\n <input type=\"checkbox\" [(ngModel)]=\"addMissionForNewSpace\" [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div>\n\n <button data-testid=\"new-location-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\" type=\"submit\"\n class=\"btn btn-outline-primary rounded-pill me-3\">{{'Save' | translate}}</button>\n\n <button data-testid=\"new-location-close-btn\" type=\"button\" (click)=\"onCancel()\"\n class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\n translate}}</button>\n\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\n <ngb-alert data-testid=\"new-location-form-invalid\" [dismissible]=\"false\" type=\"danger\">\n {{'errorForm.infoBtn' |translate}}\n\n </ngb-alert>\n </div>\n </form>\n</div>","import { Component, OnInit } from '@angular/core';\nimport { UntypedFormGroup } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { LevelStatus, Space, SpaceService, BaseUserService, ViewerService, NavigationService, NavigatorService, enumToArray, Visit, MenuItem, SearchObjectType, CaptureViewer } from '@smarterplan/ngx-smarterplan-core';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'lib-locations',\n templateUrl: './locations.component.html',\n styleUrls: ['./locations.component.scss']\n})\nexport class LocationsComponent implements OnInit {\n\n createForm: UntypedFormGroup;\n\n levels: Array<LevelStatus>;\n\n imageToUpload: File;\n\n isAdding = false;\n\n filteredLocations: Space[] = [];\n\n isManager = false;\n\n isMuseumUser = true;\n\n locations: Space[] = [];\n\n menuItems: MenuItem[] = [];\n\n userSubcription: Subscription;\n\n locationIDSubscription: Subscription;\n\n /** Last filtered Locations, used when we go back on all locations from the search bar location */\n lastFiltredLocations: Space[] = [];\n\n constructor(\n private spaceService: SpaceService,\n private router: Router,\n private userService: BaseUserService,\n private viewerService: ViewerService,\n private navigationService: NavigationService,\n private navigatorService: NavigatorService,\n ) {\n this.levels = enumToArray(LevelStatus);\n this.userSubcription = this.userService.isChanged.subscribe((isConnected) => {\n if (isConnected) {\n this.refresh();\n }\n });\n\n this.locationIDSubscription =\n this.navigatorService.locationIDChange.subscribe((id) => {\n this.changeSelectedLocation(id);\n this.setupMenuItems();\n });\n }\n\n async ngOnInit() {\n if (this.userService.cu) {\n this.resetList();\n this.updateUserRights();\n }\n this.setupMenuItems();\n }\n\n\n findSpaceById(id: string): Space {\n return this.locations.find((loc) => loc.id === id);\n }\n\n /**\n * Update when we change the selected location in filter (search bar)\n * @param id for a location, if null display all last filtred location\n */\n changeSelectedLocation(id?: string) {\n const space = id ? this.findSpaceById(id) : null;\n this.filteredLocations = space ? [space] : this.lastFiltredLocations; // New selected space or last filtered location\n }\n\n refresh() {\n this.updateUserRights();\n this.resetList();\n }\n\n\n ngOnDestroy() {\n this.userSubcription.unsubscribe();\n this.locationIDSubscription.unsubscribe();\n }\n\n setupMenuItems() {\n this.menuItems = [{ label: \"All Locations\", url: \"/localisation\" }];\n if (this.isAdding) {\n this.menuItems.push({ label: \"New\" });\n }\n if (this.filteredLocations.length === 1) {\n const selectedLoc = this.filteredLocations[0];\n this.menuItems.push({ label: selectedLoc.name });\n }\n }\n\n updateUserRights() {\n this.isManager = this.userService.hasManagerRoleInAnyMission();\n this.isMuseumUser = this.userService.hasOnlyMuseumRole();\n }\n\n isManagerForSpace(spaceID: string): boolean {\n return (\n this.userService.isManager(spaceID) ||\n this.userService.isGuide(spaceID)\n );\n }\n\n async resetList() {\n this.locations = await this.spaceService.getLocationsForCurrentUser();\n this.filteredLocations = this.locations;\n this.lastFiltredLocations = this.locations;\n this.isAdding = false;\n this.changeSelectedLocation(\n this.navigatorService.currentNavBarLocationID,\n ); // Set for the current selected location\n this.setupMenuItems();\n }\n\n onAddLocation() {\n this.isAdding = true;\n this.setupMenuItems();\n }\n\n handleImageInput(files: FileList) {\n this.imageToUpload = files.item(0);\n }\n\n onFormChange(event: any) {\n this.navigatorService.locationIDChange.next(\n null,\n ); /** Remove selected location */\n this.isAdding = false;\n if (event) {\n this.resetList();\n }\n this.setupMenuItems();\n }\n\n /**\n * The visits shown under a location.\n *\n * Everyone gets the first one, which is the location's main entry point. Managers also get the\n * rest, so a site carrying both a Matterport tour and one or more 3D models can be opened in\n * either without going through the admin screens.\n */\n visitsToShow(loc: Space): Visit[] {\n const visits = loc.visits ?? [];\n return this.isManagerForSpace(loc.id) ? visits : visits.slice(0, 1);\n }\n\n /** True when this visit opens in the Three.js viewer rather than Matterport. */\n isThreeJsVisit(visit: Visit): boolean {\n return visit?.viewer === CaptureViewer.THREEJS;\n }\n\n async onVisitClick(loc: Space, visit: Visit) {\n if (!this.userService.userHasAccessToAllZonesInSpace(loc.id)) {\n // get allowed sweep for the user\n const allowedSweeps =\n await this.navigationService.getAllowedSweepsIDsForUserInSpace(\n loc.id,\n );\n const firstSweep = allowedSweeps[0];\n this.viewerService.setSweepToMove(firstSweep);\n }\n if (this.userService.isGuide(loc.id)) {\n this.router.navigate([\"museum\", loc.id]);\n } else {\n this.router.navigate([\"visit\", loc.id], {\n queryParams: { model3D: visit.model3d },\n });\n }\n }\n\n applyResultsSearchBar(results: Space[]) {\n this.filteredLocations = results || this.locations;\n this.lastFiltredLocations = this.filteredLocations;\n this.navigatorService.locationIDChange.next(null); // When we search with keyword, we would like to search on all locations\n }\n\n getSearchType(): SearchObjectType {\n return SearchObjectType.LOCATION;\n }\n\n getStringNoSpace(data): string {\n return data.replace(/\\s/g, '');\n }\n\n onDetailViewClick(spaceID: string) {\n this.navigatorService.locationIDChange.next(spaceID); // Send update for the location filter bar\n this.router.navigate([\"dashboard/localisation\", spaceID]);\n }\n\n}\n","<div class=\"dashboard-tab\">\n <div class=\"header-dashboard-tab\">\n <div class=\"m-3\">\n <lib-tab-navigation (onGoBack)=\"onFormChange(null)\" [menuItems]='menuItems'></lib-tab-navigation>\n <span class=\"ml-3 refreshIcon\" (click)=\"refresh()\" *ngIf=\"!(isAdding)\" ngbTooltip=\"Refresh list\">\n <span class=\"iconify refreshIcon\" data-icon=\"ion:refresh-circle\" data-width=\"35\" data-rotate=\"90deg\"></span>\n </span>\n </div> \n <lib-search-bar *ngIf=\"!isAdding && !isMuseumUser\" [searchable]=\"locations\" [objectType]=\"getSearchType()\"\n (searchEvent)=\"applyResultsSearchBar($event)\"></lib-search-bar>\n \n <div class=\"col-md-8\">\n <div class=\"sp-row\" *ngIf=\"!isAdding && isManager\">\n <button data-testid=\"new-location-btn\" class=\"btn btn-outline-primary rounded-pill add-location\" (click)=\"onAddLocation()\">\n {{'Add location' | translate}}</button>\n <!-- <div class=\"outer_circle\">\n <button id='btn-icon' (click)=\"onAddLocation()\"></button>\n </div> -->\n </div>\n </div>\n </div>\n <hr>\n <div class=\"row\" *ngIf=\"isAdding\">\n <div class=\"col-md-6\">\n <h4>{{'New location' | translate}}</h4>\n </div>\n </div>\n <section *ngIf=\"!isAdding\">\n <div class=\"row\">\n <div class=\"col-sm-12 col-md-12 col-lg-6\" *ngIf=\"filteredLocations\">\n <ul data-testid=\"location-list-container\" class=\"list-group list-group-flush\">\n <li class=\"d-flex justify-content-between list-group-item\"\n *ngFor=\"let loc of filteredLocations; index as index\">\n <div class=\"d-flex\">\n <div class=\"col-md-5 img-main-container\">\n <div id=\"img_container\">\n <img class=\"location-img\" *ngIf=\"loc.annexes; else elseBlock\" [src]=\"loc.annexes\">\n <ng-template #elseBlock><img class=\"location-img\"\n src=\"./../../../../assets/images/visuel-off-big.jpg\" />\n </ng-template>\n <button [ngClass]=\"['open-btn-'+getStringNoSpace(loc.name)]\" *ngIf=\"isManagerForSpace(loc.id)\" class=\"btn-details\" (click)=\"onDetailViewClick(loc.id)\">\n {{'View details' | translate}}</button>\n </div>\n \n </div>\n <div class=\"col-md-7 location-info\">\n <p>{{loc.name}}</p>\n <p>{{loc.addresses}}</p>\n <!-- One entry per visit, labelled with the name the admin gave it. Everyone sees\n the first; managers also see the others, plus an icon telling the viewers\n apart - a visitor opens whichever they are given and does not need to know. -->\n <p [ngClass]=\"['view-btn-'+getStringNoSpace(loc.name)]\" *ngFor=\"let visit of visitsToShow(loc)\"\n (click)=\"onVisitClick(loc, visit)\" class=\"visit-name\" [style.cursor]=\"'pointer'\"\n [ngbTooltip]=\"isManagerForSpace(loc.id)\n ? (isThreeJsVisit(visit) ? ('3D model' | translate) : ('Matterport tour' | translate))\n : ''\">\n <span class=\"iconify visit-viewer-icon\" *ngIf=\"isManagerForSpace(loc.id)\"\n [attr.data-icon]=\"isThreeJsVisit(visit) ? 'mdi:cube-scan' : 'mdi:rotate-360'\"\n data-inline=\"false\"></span>\n {{ visit.name ? visit.name : loc.name }}\n </p>\n </div>\n </div>\n </li>\n \n </ul>\n </div>\n <div class=\"col-sm-12 col-md-12 col-lg-6\">\n <lib-map [spaces]=\"filteredLocations\"></lib-map>\n </div>\n </div>\n </section>\n <lib-form-location *ngIf=\"isAdding\" (onChange)=\"onFormChange($event)\"></lib-form-location>\n</div>\n","import {\n Component, Input, Output, EventEmitter, NgZone,\n AfterViewInit, OnChanges, OnDestroy, SimpleChanges, ViewChild, ElementRef\n} from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Vec3, ViewerService } from '@smarterplan/ngx-smarterplan-core';\n\n@Component({\n selector: 'lib-landmark-picker',\n templateUrl: './landmark-picker.component.html',\n styleUrls: ['./landmark-picker.component.scss']\n})\nexport class LandmarkPickerComponent implements OnChanges, AfterViewInit, OnDestroy {\n\n // --- Inputs / Outputs ---\n @Input() visit3dModel: string;\n @Input() sdkKey: string;\n @Input() title = '';\n\n // Allows a parent component to pre-fill a landmark (e.g. from a JSON import)\n @Input() set value(v: Vec3 | null) {\n if (v) {\n this.lastPicked = { ...v };\n this.manualX = v.x;\n this.manualY = v.y;\n this.manualZ = v.z;\n }\n }\n\n @Output() pointPicked = new EventEmitter<Vec3>();\n\n @ViewChild('mpFrame', { static: true }) iframeRef: ElementRef<HTMLIFrameElement>;\n\n // --- Public state (bound in the template) ---\n lastPicked: Vec3 | null = null;\n isReady = false;\n isPicking = false;\n loadError: string | null = null;\n\n // Manual entry fields (bound via ngModel in the template)\n manualX: number | null = null;\n manualY: number | null = null;\n manualZ: number | null = null;\n\n // --- Private state ---\n private mpSdk: any;\n private inputSceneObject: any;\n private inputComponent: any;\n private intersectionSub: any;\n private clickSpy: any;\n private currentIntersection: Vec3 | null = null;\n\n constructor(\n private viewerService: ViewerService,\n private translate: TranslateService,\n private ngZone: NgZone\n ) { }\n\n //\n // ---------- Lifecycle ----------\n //\n\n ngOnChanges(changes: SimpleChanges) {\n if ((changes['visit3dModel'] || changes['sdkKey']) && this.visit3dModel) {\n this.loadModel();\n }\n }\n\n ngAfterViewInit() {\n const iframe = this.iframeRef.nativeElement;\n\n iframe.addEventListener('load', async () => {\n if (this.mpSdk) {\n return;\n }\n try {\n const showcaseWindow = iframe.contentWindow as any;\n this.mpSdk = await showcaseWindow.MP_SDK.connect(iframe, this.sdkKey, '');\n await this.setupClickListener();\n this.isReady = true;\n } catch (err) {\n console.error('Failed to connect to Matterport SDK', err);\n this.loadError = this.translate.instant('landmarkPicker.loadError');\n }\n });\n }\n\n ngOnDestroy() {\n this.intersectionSub?.cancel();\n this.clickSpy?.cancel();\n this.inputSceneObject?.stop();\n }\n\n //\n // ---------- Public API (template-bound) ----------\n //\n\n /**\n * Starts landmark-picking mode. Native click-to-navigate is disabled for the\n * duration of the pick: otherwise the user's click can be partially consumed by\n * a camera navigation transition instead of being captured as a point selection.\n */\n startPicking() {\n if (!this.isReady) {\n return;\n }\n this.isPicking = true;\n this.setNavigationEnabled(false);\n }\n\n /** Called when the user validates manually typed x/y/z values. */\n applyManualCoordinates() {\n if (this.manualX == null || this.manualY == null || this.manualZ == null) {\n return;\n }\n this.confirmPoint({ x: this.manualX, y: this.manualY, z: this.manualZ });\n }\n\n //\n // ---------- Private helpers ----------\n //\n\n private loadModel() {\n const iframe = this.iframeRef.nativeElement;\n this.viewerService.setTourUrl({ model3d: this.visit3dModel });\n const url = this.viewerService.getTourUrl();\n iframe.setAttribute('src', url);\n }\n\n private async setupClickListener() {\n this.intersectionSub = this.mpSdk.Pointer.intersection.subscribe((intersection: any) => {\n if (intersection && intersection.position) {\n this.currentIntersection = { ...intersection.position };\n }\n });\n\n const [sceneObject] = await this.mpSdk.Scene.createObjects(1);\n const node = sceneObject.addNode();\n const inputComponent = node.addComponent('mp.input', {\n eventsEnabled: true,\n // Native navigation stays enabled by default (normal viewer behavior);\n // it is toggled off only while actively picking a landmark, see\n // setNavigationEnabled().\n userNavigationEnabled: true\n });\n sceneObject.start();\n\n const clickEmitPath = sceneObject.addEmitPath(inputComponent, 'INTERACTION.CLICK');\n this.clickSpy = sceneObject.spyOnEvent({\n path: clickEmitPath,\n // The Matterport SDK dispatches this callback outside Angular's zone\n // (it communicates with the host page via its own internal messaging,\n // not through zone-patched DOM events). Without ngZone.run(), the state\n // changes below happen correctly but Angular never re-renders the view\n // for them — the button label and \"Confirmed: ...\" text stay stale until\n // some unrelated DOM event (like clicking the button again) forces a\n // change detection cycle. Wrapping the call here fixes that: the pick is\n // reflected in the UI immediately, in a single click.\n onEvent: () => this.ngZone.run(() => this.onModelClicked())\n });\n\n this.inputSceneObject = sceneObject;\n this.inputComponent = inputComponent;\n }\n\n /**\n * Handles a click while in picking mode: confirms the point, exits picking mode,\n * and restores native navigation so the viewer behaves normally again.\n */\n private onModelClicked() {\n if (!this.isPicking || !this.currentIntersection) {\n return;\n }\n this.confirmPoint(this.currentIntersection);\n this.isPicking = false;\n this.setNavigationEnabled(true);\n }\n\n /** Common path for both click-picking and manual entry: updates state + notifies the parent. */\n private confirmPoint(point: Vec3) {\n this.lastPicked = { ...point };\n this.manualX = point.x;\n this.manualY = point.y;\n this.manualZ = point.z;\n this.pointPicked.emit(this.lastPicked);\n }\n\n /**\n * Toggles the viewer's native click-to-navigate behavior on the mp.input component.\n * Disabled while picking a landmark so the user's click can only be captured as a\n * point selection instead of being intercepted by a camera navigation transition.\n */\n private setNavigationEnabled(enabled: boolean) {\n if (this.inputComponent) {\n this.inputComponent.inputs.userNavigationEnabled = enabled;\n }\n }\n}","<div class=\"landmark-picker border rounded p-2\">\n <p *ngIf=\"title\" class=\"fw-bold small mb-1\">{{ title }}</p>\n\n <iframe #mpFrame width=\"100%\" height=\"380\" frameborder=\"0\" allow=\"xr-spatial-tracking\" allowfullscreen></iframe>\n\n <div *ngIf=\"loadError\" class=\"text-danger small mt-1\">{{ loadError }}</div>\n\n <div class=\"d-flex align-items-center mt-2 mb-2\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary me-3\" [disabled]=\"!isReady\"\n (click)=\"startPicking()\">\n {{ (isPicking ? 'landmarkPicker.pickButtonPicking' : (lastPicked ? 'landmarkPicker.pickButtonAgain' :\n 'landmarkPicker.pickButtonInitial')) | translate }}\n </button>\n </div>\n\n <!-- Manual coordinate entry -->\n <div class=\"row g-1 align-items-center\">\n <div class=\"col-3\">\n <input type=\"number\" step=\"0.001\" class=\"form-control form-control-sm\"\n [placeholder]=\"'landmarkPicker.placeholderX' | translate\" [(ngModel)]=\"manualX\">\n </div>\n <div class=\"col-3\">\n <input type=\"number\" step=\"0.001\" class=\"form-control form-control-sm\"\n [placeholder]=\"'landmarkPicker.placeholderY' | translate\" [(ngModel)]=\"manualY\">\n </div>\n <div class=\"col-3\">\n <input type=\"number\" step=\"0.001\" class=\"form-control form-control-sm\"\n [placeholder]=\"'landmarkPicker.placeholderZ' | translate\" [(ngModel)]=\"manualZ\">\n </div>\n <div class=\"col-3\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary w-100\" (click)=\"applyManualCoordinates()\">\n {{ 'landmarkPicker.apply' | translate }}\n </button>\n </div>\n </div>\n\n <span *ngIf=\"lastPicked\" class=\"text-success small d-block mt-1\">\n {{ 'landmarkPicker.confirmed' | translate: { x: lastPicked.x.toFixed(3), y: lastPicked.y.toFixed(3), z:\n lastPicked.z.toFixed(3) } }}\n </span>\n</div>","import { Component, Inject, OnInit, OnDestroy } from '@angular/core';\nimport { UntypedFormGroup } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\n\nimport {\n MATTERPORT_SDK_KEY,\n MenuItem, SpaceService, BaseUserService, NavigatorService, SpaceStatus, Space,\n MatterportTagCopyService, CopyProgress, CopyLogEntry,\n Vec3, distance,\n Visit,\n VisitService\n} from '@smarterplan/ngx-smarterplan-core';\nimport { Subject, takeUntil } from 'rxjs';\n\n// Minimum distance (in meters) required between the two landmarks for a reliable rotation calculation\nconst MIN_LANDMARK_DISTANCE = 1.5;\n\n@Component({\n selector: 'lib-detail-location',\n templateUrl: './detail-location.component.html',\n styleUrls: ['./detail-location.component.scss']\n})\nexport class DetailLocationComponent implements OnInit, OnDestroy {\n\n // --- Location details ---\n space: Space;\n editForm: UntypedFormGroup;\n isEditing = false;\n imageToUpload: File;\n id: string;\n menuItems: MenuItem[] = [];\n\n // --- DPE (energy diagnostic) ---\n isValidatingDpe = false;\n selectedDpeResult: any;\n gettingData = false;\n parsedMetadata: {\n geo_adresse: string;\n secteur_activite: string;\n annee_construction: string;\n classe_consommation_energie: string;\n classe_estimation_ges: string;\n selected: boolean;\n }[];\n\n guestLink: string;\n canArchive: boolean;\n destroy$ = new Subject();\n\n // --- Copy POIs between visits ---\n isAdmin: boolean = false;\n spaces: Space[] = [];\n\n // Whether the \"copy POIs\" admin form is currently visible (collapsed by default)\n showCopyPoisForm = false;\n\n // Selected source SPACE (a space may contain 0..N visits/models)\n selectedSourceSpaceId: string | null = null;\n\n // Selected 3D model ids (visit.model3d) — this is what actually gets loaded in the viewer\n selectedSource3dModel: string | null = null;\n selectedTarget3dModel: string | null = null;\n\n // Visits available for the selected source space, and for the current (target) space\n sourceVisits: Visit[] = [];\n visits: Visit[] = [];\n\n // 3D landmark points picked directly in each viewer (source and target)\n landmarkSourceA: Vec3 | null = null;\n landmarkTargetA: Vec3 | null = null;\n landmarkSourceB: Vec3 | null = null;\n landmarkTargetB: Vec3 | null = null;\n\n isCopyingPois = false;\n copyPoisResultMsg: string | null = null;\n copyProgress: CopyProgress | null = null;\n copyLog: CopyLogEntry[] = [];\n\n constructor(\n @Inject(MATTERPORT_SDK_KEY) public readonly sdkKey: string,\n private route: ActivatedRoute,\n private spaceService: SpaceService,\n private visitService: VisitService,\n private router: Router,\n private userService: BaseUserService,\n private translate: TranslateService,\n private navigatorService: NavigatorService,\n private tagCopyService: MatterportTagCopyService\n ) {\n this.navigatorService.locationIDChange\n .pipe(takeUntil(this.destroy$))\n .subscribe((spaceID) => {\n this.router.navigate([\"dashboard/localisation\", spaceID]);\n });\n\n this.route.params.subscribe((params) => {\n this.id = params.id;\n this.setup();\n });\n\n this.tagCopyService.copyProgress$\n .pipe(takeUntil(this.destroy$))\n .subscribe((progress) => {\n this.copyProgress = progress;\n });\n\n this.tagCopyService.copyLog$\n .pipe(takeUntil(this.destroy$))\n .subscribe((log) => {\n this.copyLog = log;\n });\n }\n\n //\n // ---------- Lifecycle ----------\n //\n\n ngOnInit() { }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n //\n // ---------- Setup ----------\n //\n\n async setup() {\n this.space = await this.spaceService.getSpace(this.id);\n this.setupMenuItems();\n this.setGuestLink();\n this.setCanArchive();\n this.isAdmin = this.userService.isSPAdmin();\n if (this.isAdmin) {\n const spaces = await this.spaceService.getLocationsForCurrentUser();\n this.spaces = spaces.filter((space) => space.id !== this.id).sort((a, b) => (a.name || '').localeCompare(b.name || ''));\n }\n // Visits (3D models) belonging to the CURRENT space, used as copy targets\n this.visits = await this.visitService.getVisitsForSpaceForUser(this.id);\n }\n\n setupMenuItems() {\n this.menuItems = [\n { label: \"Locations\", url: \"/localisation\" },\n {\n label: this.space.name,\n url: `/localisation/${this.space.id}`,\n },\n ];\n\n if (this.isEditing) {\n this.menuItems.push({ label: \"Edit\" });\n } else {\n this.menuItems.push({ label: \"Information\" });\n }\n }\n\n async setCanArchive() {\n this.canArchive = this.userService.isSPAdmin()\n ? true\n : await this.spaceService.canArchiveSpace(this.id);\n }\n\n setGuestLink() {\n if (this.space.guestLink) {\n const { origin } = document.location;\n this.guestLink = `${origin}/${this.space.guestLink}`;\n setTimeout(() => {\n const hyperlink = document.querySelector(\n \"#linkHref\",\n ) as HTMLLinkElement;\n const message = this.translate.instant(\"confirm.followLink\");\n hyperlink.addEventListener(\"click\", async () => {\n if (window.confirm(message)) {\n window.location.href = this.guestLink;\n await this.userService.logoutCurrentAndSignOutAuth();\n this.router.navigate([\"auth\"]);\n }\n });\n }, 0);\n }\n }\n\n //\n // ---------- Edit / archive / navigation ----------\n //\n\n onEdit() {\n this.isEditing = true;\n this.setupMenuItems();\n }\n\n onReturn() {\n this.router.navigate([\"dashboard/localisation\"]);\n }\n\n reset() {\n this.isEditing = false;\n this.setupMenuItems();\n }\n\n async onArchive() {\n const message = this.translate.instant(\"confirm.archiveSpace\");\n if (window.confirm(message)) {\n await this.spaceService.softDeleteSpace(this.id);\n this.onReturn();\n }\n }\n\n onFormChange(event: Space) {\n this.isEditing = false;\n if (event) {\n this.space = event;\n }\n this.setupMenuItems();\n }\n\n //\n // ---------- DPE (energy diagnostic) ----------\n //\n\n onDpeValidate() {\n this.isValidatingDpe = true;\n this.parsedMetadata = JSON.parse(this.space.metadata);\n this.parsedMetadata = this.parsedMetadata.filter(\n (result) => result.geo_adresse,\n );\n }\n\n onSelectChange(selectedResult: any) {\n for (const result of this.parsedMetadata) {\n if (result !== selectedResult && result.selected) {\n result.selected = false;\n }\n }\n this.selectedDpeResult = selectedResult;\n }\n\n async onSaveResult() {\n if (this.selectedDpeResult) {\n const input = {\n id: this.space.id,\n constructionYear: this.selectedDpeResult.annee_construction,\n classEnergyConsumption:\n this.selectedDpeResult.classe_consommation_energie,\n classGes: this.selectedDpeResult.classe_estimation_ges,\n status: SpaceStatus.DPE_VALIDATED,\n };\n const updatedLoc = await this.spaceService.updateSpace(input);\n this.space = updatedLoc;\n this.isValidatingDpe = false;\n }\n }\n\n onCancel() {\n this.isValidatingDpe = false;\n }\n\n async onErase() {\n await this.spaceService.updateSpace({\n id: this.space.id,\n status: SpaceStatus.DPE_VALIDATED,\n });\n this.space.status = SpaceStatus.DPE_VALIDATED;\n this.isValidatingDpe = false;\n }\n\n async onGetDpeData() {\n this.gettingData = true;\n await this.spaceService.updateSpace({\n id: this.space.id,\n status: SpaceStatus.DPE_FETCH,\n });\n\n setTimeout(async () => {\n this.space = await this.spaceService.getSpace(this.space.id);\n this.gettingData = false;\n }, 1500);\n }\n\n //\n // ---------- Copy POIs between visits ----------\n //\n\n /** Toggles visibility of the admin \"copy POIs from another location\" form. */\n toggleCopyPoisForm() {\n this.showCopyPoisForm = !this.showCopyPoisForm;\n }\n\n onSourceLandmarkPicked(slot: 'A' | 'B', point: Vec3) {\n if (slot === 'A') {\n this.landmarkSourceA = point;\n } else {\n this.landmarkSourceB = point;\n }\n }\n\n onTargetLandmarkPicked(slot: 'A' | 'B', point: Vec3) {\n if (slot === 'A') {\n this.landmarkTargetA = point;\n } else {\n this.landmarkTargetB = point;\n }\n }\n\n /** Loads the visits (3D models) available for the newly selected source space. */\n async onSourceSpaceChange() {\n this.sourceVisits = this.selectedSourceSpaceId\n ? await this.visitService.getVisitsForSpaceForUser(this.selectedSourceSpaceId)\n : [];\n this.selectedSource3dModel = null;\n this.onModelSelectionChange();\n }\n\n /** Resets landmark selections whenever the source or target 3D model changes. */\n onModelSelectionChange() {\n this.landmarkSourceA = null;\n this.landmarkTargetA = null;\n this.landmarkSourceB = null;\n this.landmarkTargetB = null;\n }\n\n /** True once both models are selected, all 4 landmarks are picked, and A/B pairs are far enough apart. */\n get canCopyPois(): boolean {\n if (!this.selectedSourceSpaceId || !this.selectedSource3dModel || !this.selectedTarget3dModel) {\n return false;\n }\n if (!this.landmarkSourceA || !this.landmarkTargetA || !this.landmarkSourceB || !this.landmarkTargetB) {\n return false;\n }\n const sourceDist = distance(this.landmarkSourceA, this.landmarkSourceB);\n const targetDist = distance(this.landmarkTargetA, this.landmarkTargetB);\n return sourceDist >= MIN_LANDMARK_DISTANCE && targetDist >= MIN_LANDMARK_DISTANCE;\n }\n\n async onCopyPois() {\n const selectedTargetSpaceId = this.id;\n\n if (!this.selectedSourceSpaceId || !selectedTargetSpaceId || !this.selectedSource3dModel || !this.selectedTarget3dModel) {\n return;\n }\n if (this.selectedSourceSpaceId === selectedTargetSpaceId) {\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorSameSpace');\n return;\n }\n if (!this.canCopyPois) {\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorLandmarksTooClose');\n return;\n }\n\n this.isCopyingPois = true;\n this.copyPoisResultMsg = null;\n try {\n const success = await this.tagCopyService.copyTagsFromVisit(\n this.selectedSourceSpaceId,\n selectedTargetSpaceId,\n this.landmarkSourceA,\n this.landmarkTargetA,\n this.landmarkSourceB,\n this.landmarkTargetB\n );\n this.copyPoisResultMsg = this.translate.instant(\n success ? 'matterportCopy.successMsg' : 'matterportCopy.errorMsg'\n );\n } catch (error) {\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorMsg');\n }\n this.isCopyingPois = false;\n\n setTimeout(() => {\n this.copyPoisResultMsg = null;\n }, 5000);\n }\n\n /** Downloads the current source/target selection + all 4 landmarks as a JSON file. */\n exportLandmarkConfig() {\n if (!this.selectedSourceSpaceId || !this.selectedSource3dModel || !this.selectedTarget3dModel) {\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorExportMissingSelection');\n return;\n }\n\n const config = {\n sourceSpaceId: this.selectedSourceSpaceId,\n sourceVisit3dModel: this.selectedSource3dModel,\n targetVisit3dModel: this.selectedTarget3dModel,\n landmarkSourceA: this.landmarkSourceA,\n landmarkTargetA: this.landmarkTargetA,\n landmarkSourceB: this.landmarkSourceB,\n landmarkTargetB: this.landmarkTargetB\n };\n\n const blob = new Blob([JSON.stringify(config, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `landmarks_${this.selectedSource3dModel}_to_${this.selectedTarget3dModel}.json`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n /** Downloads the full copy log (step lines, errors, and repaired-item notices) as a text\n * file — the on-screen panel is capped to a small scrollable area and loses lines once\n * a new run starts, this keeps the full report. */\n downloadCopyLog() {\n this.tagCopyService.downloadLog();\n }\n\n /** Triggered by the hidden file input; reads and applies a previously exported JSON config. */\n async onImportLandmarkConfigSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (!file) {\n return;\n }\n\n try {\n const text = await file.text();\n const config = JSON.parse(text);\n\n // Basic shape validation before applying\n const requiredKeys = ['sourceSpaceId', 'sourceVisit3dModel', 'targetVisit3dModel',\n 'landmarkSourceA', 'landmarkTargetA', 'landmarkSourceB', 'landmarkTargetB'];\n const missing = requiredKeys.filter(k => !(k in config));\n if (missing.length > 0) {\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorInvalidConfig', { keys: missing.join(', ') });\n return;\n }\n\n this.selectedSourceSpaceId = config.sourceSpaceId;\n // Reload the source space's visit list so the select has the right options\n this.sourceVisits = await this.visitService.getVisitsForSpaceForUser(this.selectedSourceSpaceId);\n\n this.selectedSource3dModel = config.sourceVisit3dModel;\n this.selectedTarget3dModel = config.targetVisit3dModel;\n this.landmarkSourceA = config.landmarkSourceA;\n this.landmarkTargetA = config.landmarkTargetA;\n this.landmarkSourceB = config.landmarkSourceB;\n this.landmarkTargetB = config.landmarkTargetB;\n\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.successImport');\n } catch (err) {\n console.error('Failed to import landmark config', err);\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorImportRead');\n } finally {\n // Reset the input so re-selecting the same file re-triggers the change event\n input.value = '';\n }\n }\n}","<div class=\"container-fluid\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\n </div>\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\n translate}}</button>\n <div class=\"row\" *ngIf=\"!isEditing && space\">\n <div class=\"col-md-5\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\n {{space.constructionYear ?\n space.constructionYear : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\n {{space.latitude ?\n space.latitude : \"No data\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\n space.longitude : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\n }} </li>\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\n {{space.classEnergyConsumption ?\n space.classEnergyConsumption : \"No data\" | translate}}\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\n {{'Get data from API DPE' | translate}}</button>\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\n style=\"cursor: pointer;\">\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\n data-height=\"25\"></span>\n {{'DPE data found. Click to validate' | translate}}\n </a>\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\n triggers=\"click:blur\">\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\n data-height=\"20\"></span>\n </div>\n </div>\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\n </p>\n </li>\n\n </ul>\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <hr>\n <div class=\"d-flex\">\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\n data-testid=\"location-edit-btn\">{{'Edit' |\n translate}}</button>\n <div class=\"tooltip-wrapper\"\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\n {{'Archive' | translate}}</button>\n </div>\n </div>\n\n\n </div>\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\n <h6>{{'Most relevant results for' | translate}} :\n <b>diagnostics de performance énergétique (DPE) des bâtiments tertiaires</b>\n </h6>\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\n <th scope=\"col\">{{'Address' | translate}}</th>\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\n <th scope=\"col\">{{'Construction year' | translate}}</th>\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\n <th scope=\"row\">{{ i + 1 }}</th>\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\n (change)=\"onSelectChange(result)\"></td>\n <td>{{result.geo_adresse}}</td>\n <td>{{result.secteur_activite}}</td>\n <td>{{ result.annee_construction }}</td>\n <td>{{ result.classe_consommation_energie }}</td>\n <td>{{ result.classe_estimation_ges }}</td>\n </tr>\n </tbody>\n </table>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\n translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\n {{'No match (erase data)' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n\n <!-- Toggle button for the admin \"Copy POIs\" form -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0\" class=\"mt-4\">\n <button class=\"btn btn-outline-secondary rounded-pill\" (click)=\"toggleCopyPoisForm()\">\n {{ (showCopyPoisForm ? 'matterportCopy.hideForm' : 'matterportCopy.showForm') | translate }}\n </button>\n </div>\n\n <!-- Admin Form to Copy POIs -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0 && showCopyPoisForm\" class=\"mt-3 p-4 border rounded bg-light\">\n <h6>{{ 'matterportCopy.formTitle' | translate }}</h6>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceSpace' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSourceSpaceId\" (ngModelChange)=\"onSourceSpaceChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectSpace' | translate }}</option>\n <option *ngFor=\"let space of spaces\" [ngValue]=\"space.id\">{{space.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\" *ngIf=\"sourceVisits\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSource3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of sourceVisits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.targetVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedTarget3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div *ngIf=\"selectedSourceSpaceId && selectedSource3dModel && selectedTarget3dModel\"\n class=\"border rounded p-3 mb-3 bg-white\">\n <p class=\"small text-muted mb-2\">\n {{ 'matterportCopy.landmarkInstructions' | translate }}\n </p>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkA' | translate }}</p>\n <div class=\"row mb-4\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceA\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetA\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkB' | translate }}</p>\n <div class=\"row\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceB\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetB\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex align-items-center pt-2\">\n <button class=\"btn btn-primary rounded-pill me-3\" [disabled]=\"!canCopyPois || isCopyingPois\"\n (click)=\"onCopyPois()\">\n {{ 'matterportCopy.copyButton' | translate }}\n </button>\n <div class=\"d-flex align-items-center gap-2 mb-3\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"exportLandmarkConfig()\">\n {{ 'matterportCopy.exportLandmarks' | translate }}\n </button>\n\n <label class=\"btn btn-sm btn-outline-secondary mb-0\">\n {{ 'matterportCopy.importLandmarks' | translate }}\n <input type=\"file\" accept=\"application/json\" hidden\n (change)=\"onImportLandmarkConfigSelected($event)\">\n </label>\n </div>\n <div *ngIf=\"isCopyingPois\" class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n <div *ngIf=\"copyPoisResultMsg\" class=\"mt-2 text-success fw-bold\">\n {{ copyPoisResultMsg }}\n </div>\n <div *ngIf=\"copyProgress\" class=\"mt-3\">\n <div class=\"d-flex justify-content-between small mb-1\">\n <span>\n <ng-container [ngSwitch]=\"copyProgress.phase\">\n <span *ngSwitchCase=\"'collecting'\">{{ 'Collecting information from both visits...' | translate\n }}</span>\n <span *ngSwitchCase=\"'tickets'\">{{ 'Copying tickets' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'equipments'\">{{ 'Copying equipments' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'pois'\">{{ 'Copying standalone POIs' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'objects3d'\">{{ 'Copying 3D objects' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'features'\">{{ 'Copying features' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'measurements'\">{{ 'Copying measurements' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'done'\">{{ 'Done!' | translate }}</span>\n </ng-container>\n </span>\n <span>{{ copyProgress.percent }}%</span>\n </div>\n <div class=\"progress\" style=\"height: 6px;\">\n <div class=\"progress-bar\" [class.progress-bar-striped]=\"copyProgress.phase === 'collecting'\"\n [class.progress-bar-animated]=\"copyProgress.phase === 'collecting'\"\n [class.bg-warning]=\"copyProgress.errorCount > 0\" role=\"progressbar\"\n [style.width.%]=\"copyProgress.phase === 'collecting' ? 100 : copyProgress.percent\">\n </div>\n </div>\n\n <!-- Detailed step-by-step log -->\n <div *ngIf=\"copyLog.length > 0\" class=\"mt-2 p-2 bg-white border rounded small\"\n style=\"max-height: 200px; overflow-y: auto; font-family: monospace;\">\n <div *ngFor=\"let entry of copyLog\" [class.text-danger]=\"entry.type === 'error'\"\n [class.text-warning]=\"entry.type === 'healed'\">\n {{ entry.text }}\n </div>\n </div>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary mt-2\" *ngIf=\"copyLog.length > 0\"\n (click)=\"downloadCopyLog()\">\n {{ 'matterportCopy.downloadLog' | translate }}\n </button>\n </div>\n </div>\n\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\n</div>","import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { getDocument, PDFDocumentProxy } from 'pdfjs-dist';\n// import { PDFDocumentProxy } from 'ng2-pdf-viewer';\nimport {\n Zone,\n MenuItem,\n Plan,\n Space,\n Navigation,\n PlanService,\n ZoneService,\n SpaceService,\n NavigationService,\n getMetaForImage,\n MatterportImportService,\n} from '@smarterplan/ngx-smarterplan-core';\nimport panzoom from 'panzoom';\n\n@Component({\n selector: 'lib-calibration',\n templateUrl: './calibration.component.html',\n styleUrls: ['./calibration.component.scss'],\n})\nexport class CalibrationComponent implements OnInit {\n /** Item to display for the navbar */\n menuItems: MenuItem[] = [];\n\n /** Canvas (Plan) */\n canvas;\n\n /** CanvasDiv (Div that contain the canvas + matterport iframe) */\n @ViewChild('canvasDiv') canvasDiv: ElementRef;\n\n /** Size of the canvas & matterport iframe */\n canvasSize: { w: number; h: number; };\n\n /** Zoom ratio of the canvas/plan */\n canvasZoom = 0;\n\n /** Opacity for matterport iframe */\n opacity: number = 50;\n\n /** Current rotation for matterport, [0-360], matterport rotation is bind to input range */\n rotation: number = 180;\n\n /** Previous rotation, use to calculate the deltaRotation to rotate, when user change rotation value using range input */\n prevRotation: number = 180;\n\n /** Current Camera Pose */\n cameraPose: any;\n\n /** True when the user is currently rotating with the input range, the matterport rotation events will be ignored */\n isRotatingRange: boolean = false;\n\n /** Rotating queue event to send to matterport */\n rotatingQueueEvent: number[] = [];\n\n /** True when Vertical symmetry is enabled */\n reflectV = false;\n\n /** True when Horizontal symmetry is enabled */\n reflectH = false;\n\n chosenPlan: Plan;\n\n spaceID: string;\n\n currentSpace: Space;\n\n currentZone: Zone;\n\n chosenPlanIsPdf = false;\n\n /** First Point in visit, used to determine the calibration */\n firstMarkVisit = { x: 0, y: 0 };\n\n /** Second Point in visit, used to determine the calibration */\n secondMarkVisit = { x: 0.5, y: 0.5 };\n\n /** Equivalent of 'firstMarkVisit' in canvas */\n firstMarkPlan: { x: number; y: number; } = { x: 0, y: 0 };\n\n /** Equivalent of 'secondMarkVisit' in canvas */\n secondMarkPlan: { x: number; y: number; } = { x: 0, y: 0 };\n\n /** Calibration result, (offsetX, offsetY, x, y) */\n calibrage: any = {};\n\n /** Is in preview mode (see scan result) */\n preview = false;\n\n /** Matterport is loading */\n loading = true;\n\n /* for pan and zoom of canvas */\n panzoom: any;\n\n currentNavigations: Navigation[];\n\n positions: { navID: string; planID: string; x: number; y: number; }[] = [];\n\n floors: any[] = [];\n\n currentFloor;\n\n zoomCanBeChanged: boolean = false;\n\n constructor(\n private matterportImportService: MatterportImportService,\n private planService: PlanService,\n private route: ActivatedRoute,\n private router: Router,\n private zoneService: ZoneService,\n private spaceService: SpaceService,\n private navigationService: NavigationService,\n private translate: TranslateService\n ) { }\n\n ngOnDestroy(): void {\n if (!this.loading) {\n this.matterportImportService.removeFrame();\n }\n }\n\n async ngOnInit(): Promise<void> {\n this.spaceID = this.route.snapshot.queryParams.spaceID;\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\n\n /** Menu nav bar */\n this.setupMenuItems();\n\n this.chosenPlan = this.planService.getChosenPlan();\n\n if (this.chosenPlan) {\n this.chosenPlanIsPdf = this.chosenPlan.annexe.includes('pdf');\n this.launchViewer();\n setTimeout(() => {\n this.configureCanvas().then(() => {\n this.panzoom = panzoom(this.canvas, {\n bounds: true,\n boundsPadding: 0,\n maxZoom: 2.5,\n minZoom: 0.1,\n initialZoom: 1,\n zoomSpeed: 0.02,\n });\n });\n }, 500);\n } else {\n this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);\n }\n }\n\n /** **********************************************************************************************\n * MENU NAV BAR\n *********************************************************************************************** */\n setupMenuItems() {\n this.menuItems = [\n { label: 'Locations', url: '/localisation' },\n {\n label: this.currentSpace.name,\n url: `/localisation/${this.spaceID}`,\n },\n {\n label: 'Plans',\n url: `/localisation/${this.currentSpace.id}/plans`,\n },\n {\n label: 'Calibration',\n url: `/localisation/${this.currentSpace.id}/plan-calibration?spaceID=${this.currentSpace.id}`,\n },\n ];\n }\n\n /** **********************************************************************************************\n * CANVAS\n *********************************************************************************************** */\n\n /** Display the plan */\n async configureCanvas() {\n /** Get canvas */\n if (!this.canvas) {\n const canvas = document.querySelector('#canvas') as HTMLCanvasElement;\n this.canvas = canvas;\n }\n\n if (!this.chosenPlanIsPdf) {\n const image = await getMetaForImage(this.chosenPlan.filepath);\n /** Compute the new size for the canvas/matterport, base on the dimension of the plan, keeping the ratio */\n const size = this.getSizeForCanvas(image.width, image.height);\n\n /** Compute the plan zoom ratio (use for the calibration later) */\n this.canvasZoom = size.w / image.width;\n\n this.resizeView(size);\n\n /** Draw Plan on the canvas */\n this.drawImage(this.chosenPlan.filepath);\n } else {\n // TODO\n this.pdfToCanvas();\n }\n }\n\n /** Update size of the canvas/matterport */\n resizeView(size) {\n this.canvasDiv.nativeElement.style.width = `${size.w}px`;\n this.canvasDiv.nativeElement.style.height = `${size.h}px`;\n this.canvas.style.width = `${size.w}px`;\n this.canvas.style.height = `${size.h}px`;\n this.canvas.width = size.w;\n this.canvas.height = size.h;\n this.canvasSize = size;\n }\n\n /** Draw something on the canvas */\n drawImage(url: string, x = 0, y = 0, icone = false) {\n const image = new Image();\n const size = this.canvasSize;\n const context = this.canvas.getContext('2d');\n\n /** Flip the context, for symmetry */\n // if (this.reflectV) {\n // context.translate(size.w, 0);\n // context.scale(-1, 1);\n // }\n // if (this.reflectH) {\n // context.translate(0, size.h);\n // context.scale(1, -1);\n // }\n\n let imageWidth = size.w;\n let imageHeight = size.h;\n image.addEventListener('load', () => {\n if (icone) {\n imageWidth = image.width;\n imageHeight = image.height;\n }\n context.drawImage(\n image,\n 0,\n 0,\n image.width,\n image.height,\n x,\n y,\n imageWidth,\n imageHeight\n );\n });\n image.src = url;\n }\n\n /** Get the size for the canvas, based on the plan size, keeping the ratio */\n getSizeForCanvas(w, h) {\n let canvasW = this.canvasDiv.nativeElement.offsetWidth;\n let canvasH = this.canvasDiv.nativeElement.offsetHeight;\n\n const imageRatio = w / h;\n const canvasRatio = canvasW / canvasH;\n\n if (imageRatio > canvasRatio) {\n canvasH = canvasW / imageRatio;\n } else {\n canvasW = canvasH * imageRatio;\n }\n return { w: canvasW, h: canvasH };\n }\n\n /** [TODO] Convert a PDF to a Canvas */\n async pdfToCanvas() {\n const pdfjs = await import('pdfjs-dist');\n pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/4.4.168/pdf.worker.min.mjs`;\n\n const pdf: PDFDocumentProxy = await getDocument(this.chosenPlan.filepath)\n .promise;\n const page = await pdf.getPage(1);\n\n const viewPortParameters = { scale: 1 };\n const viewport = page.getViewport(viewPortParameters);\n\n this.canvas.height = viewport.height;\n this.canvas.width = viewport.width;\n\n const size = this.getSizeForCanvas(viewport.width, viewport.height);\n console.log(size);\n this.canvasSize = size;\n\n this.canvasZoom = size.w / viewport.width;\n\n const context = this.canvas.getContext('2d') as CanvasRenderingContext2D;\n const renderContext = {\n canvasContext: context,\n viewport,\n };\n const renderTask = page.render(renderContext).promise;\n\n renderTask.then(() => console.log('Page rendered'));\n\n // const res = canvas.toDataURL();\n // if (pdf != null) pdf.destroy();\n // return res;\n }\n\n /** User click to user Symmetry Vertical */\n onReflectV() {\n this.reflectV = !this.reflectV;\n this.configureCanvas();\n }\n\n /** User click to user Symmetry Horizontal */\n onReflectH() {\n this.reflectH = !this.reflectH;\n this.configureCanvas();\n }\n\n /** **********************************************************************************************\n * MATTERPORT\n *********************************************************************************************** */\n\n /** Launch matterport */\n async launchViewer() {\n await this.matterportImportService.initSdkForModel(this.chosenPlan.model3d);\n\n const { sdk } = this.matterportImportService;\n this.floors = Object.values(this.matterportImportService.floors);\n // console.log(this.floors);\n setTimeout(async () => {\n /** Move Floor mode */\n sdk.Mode.moveTo(sdk.Mode.Mode.FLOORPLAN).then(async (nextMode) => {\n /** Display the correct floor for the plan */\n try {\n const matterportFloor = this.chosenPlan.zone.metadata ?\n JSON.parse(this.chosenPlan.zone.metadata).matterportFloorSequence : null;\n await this.matterportImportService.moveToFloor(this.chosenPlan.zone.name, matterportFloor);\n\n /** When the user try to change the view mode we set it back to floorpan */\n sdk.on(sdk.Mode.Event.CHANGE_END, (oldMode, newMode) => {\n if (newMode !== sdk.Mode.Mode.FLOORPLAN) {\n sdk.Mode.moveTo(sdk.Mode.Mode.FLOORPLAN, {\n transition: 'transition.instant',\n });\n }\n });\n } catch {\n console.log('couldnot move to floor');\n }\n });\n\n /** We can display the matterport view now */\n this.loading = false;\n }, 1000);\n\n /** Update current camera pose and rotation */\n sdk.Camera.pose.subscribe((event) => {\n /** We update only if the user is not changing the rotation with the <input> range, to not override the <input> value */\n if (!this.isRotatingRange) {\n this.rotation = event.rotation.y + 180;\n this.prevRotation = this.rotation;\n this.cameraPose = event;\n }\n });\n }\n\n /** When the <input> range, for rotation, change */\n async onRotationChange() {\n const rotationDelta = this.rotation - this.prevRotation;\n this.prevRotation = this.rotation;\n\n /** Send the rotationDelta to th queue event in order to be send to matterport */\n this.rotatingQueueEvent.push(rotationDelta);\n\n /** Start to process the queue, if it's the first event */\n if (!this.isRotatingRange) {\n this.isRotatingRange = true;\n this.processRotatingQueueEvent();\n }\n }\n\n /** Process the rotating event queue, send event one by one to matterport */\n async processRotatingQueueEvent() {\n const { sdk } = this.matterportImportService;\n\n /** While the queue is not empty */\n while (this.rotatingQueueEvent.length > 0) {\n /** Rotate matterport by deltaRotation and remove event from queue */\n await sdk.Camera.rotate(this.rotatingQueueEvent.shift(), 0, {\n speed: 360,\n });\n }\n\n /** When the queue is empty, then the user is not rotating with the <input> range anymore */\n this.isRotatingRange = false;\n }\n\n /** **********************************************************************************************\n * USER ACTIONS\n *********************************************************************************************** */\n\n /** Preview calibration */\n async onPreview() {\n this.preview = true;\n /** Place sweeps */\n this.onPlaceSweeps();\n }\n\n async calibrate() {\n const [navigation] = this.currentNavigations;\n const position = JSON.parse(navigation.position);\n this.firstMarkPlan =\n await this.matterportImportService.sdk.Renderer.getScreenPosition({\n x: position.x,\n y: position.y,\n z: position.z,\n });\n this.secondMarkPlan =\n await this.matterportImportService.sdk.Renderer.getScreenPosition({\n x: position.x,\n y: 0,\n z: 0,\n });\n const deltaZVisit = 0 - position.z;\n let deltaXPlan = this.secondMarkPlan.x - this.firstMarkPlan.x;\n if (deltaXPlan === 0) {\n // console.log(\"we moved along Y axis on Plan\");\n const deltaYPlan = this.secondMarkPlan.y - this.firstMarkPlan.y;\n this.calibrage.nameYAxis = 'z';\n this.calibrage.nameXAxis = 'x';\n this.calibrage.offsetY = this.secondMarkPlan.y;\n this.calibrage.scaleY = deltaYPlan / deltaZVisit;\n } else {\n // console.log(\" we moved along X axis on Plan\");\n this.calibrage.nameYAxis = 'x';\n this.calibrage.nameXAxis = 'z';\n this.calibrage.offsetX = this.secondMarkPlan.x;\n this.calibrage.scaleX = deltaXPlan / deltaZVisit;\n }\n const thirdMarkPlan =\n await this.matterportImportService.sdk.Renderer.getScreenPosition({\n x: 0,\n y: 0,\n z: position.z,\n });\n const deltaXVisit = 0 - position.x;\n if (deltaXPlan === 0) {\n // console.log(\" we moved along X axis on Plan\");\n deltaXPlan = thirdMarkPlan.x - this.firstMarkPlan.x;\n this.calibrage.offsetX = thirdMarkPlan.x;\n this.calibrage.scaleX = deltaXPlan / deltaXVisit;\n } else {\n const deltaYPlan = thirdMarkPlan.y - this.firstMarkPlan.y;\n this.calibrage.offsetY = thirdMarkPlan.y;\n this.calibrage.scaleY = deltaYPlan / deltaXVisit;\n }\n\n /** Take considiration of pan and zoom of plan on canvas */\n const transformInfo = this.panzoom.getTransform();\n const { scale, x, y } = transformInfo;\n // console.log(transformInfo);\n this.calibrage.offsetXPlan = x;\n this.calibrage.offsetYPlan = y;\n this.calibrage.scalePlan = scale;\n console.log(this.calibrage);\n }\n\n /** Place sweeps */\n async onPlaceSweeps() {\n /** Display all scan */\n const zone = await this.zoneService.getZone(this.chosenPlan.zoneID);\n\n if (zone) {\n this.currentZone = zone;\n const navigations = await this.navigationService.getNavigationsForZone(\n this.currentZone\n );\n this.currentNavigations = navigations;\n await this.calibrate();\n if (navigations.length > 0) {\n for (const navigation of navigations) {\n const testPosition = JSON.parse(navigation.position);\n const positionX =\n this.calibrage.nameXAxis === 'x' ? testPosition.x : testPosition.z;\n const positionY =\n this.calibrage.nameYAxis === 'x' ? testPosition.x : testPosition.z;\n const testX =\n positionX * this.calibrage.scaleX + this.calibrage.offsetX;\n const testY =\n positionY * this.calibrage.scaleY + this.calibrage.offsetY;\n // console.log(\"test position GREEN\", testX, testY);\n const transformedX =\n (testX - this.calibrage.offsetXPlan) / this.calibrage.scalePlan; // we are undoing the pan and zoom\n const transformedY =\n (testY - this.calibrage.offsetYPlan) / this.calibrage.scalePlan;\n this.positions.push({\n navID: navigation.id,\n planID: this.chosenPlan.id,\n x: transformedX,\n y: transformedY,\n });\n const iconSize = 30 * this.calibrage.scalePlan;\n const shift = iconSize / 2;\n this.drawImage(\n 'https://api.iconify.design/mdi:adjust.svg?color=green&height=30&width=30',\n transformedX - shift,\n transformedY - shift,\n true\n );\n }\n }\n }\n }\n\n /** Save calibration */\n async onSave() {\n if (this.currentZone) {\n /** Normalize with the zoom */\n // this.calibrage.offsetX /= this.canvasZoom;\n // this.calibrage.offsetY /= this.canvasZoom;\n // this.calibrage.x /= this.canvasZoom;\n // this.calibrage.y /= this.canvasZoom;\n this.calibrage.new = true;\n this.calibrage.imgWidth = this.canvasSize.w;\n this.calibrage.imgHeight = this.canvasSize.h;\n\n await this.planService.updatePlan({\n id: this.chosenPlan.id,\n calibration: JSON.stringify(this.calibrage),\n });\n await Promise.all(\n this.positions.map(async (position) => {\n const { navID } = position;\n delete position.navID;\n const nav = this.currentNavigations.find((_nav) => _nav.id === navID);\n let positionsDataToUpdate;\n if (nav.positionOnPlan) {\n const positionOnPlan = nav.positionOnPlan.map((entry) =>\n JSON.parse(entry)\n );\n const positionForCurrentPlan = positionOnPlan.find(\n (entry) => entry.planID === this.chosenPlan.id\n );\n if (positionForCurrentPlan) {\n positionOnPlan.splice(\n positionOnPlan.indexOf(positionForCurrentPlan),\n 1,\n position\n );\n } else {\n positionOnPlan.push(position);\n }\n positionsDataToUpdate = [...positionOnPlan];\n } else {\n positionsDataToUpdate = [position];\n }\n // console.log(positionsDataToUpdate);\n await this.navigationService.updateNavigation({\n id: navID,\n positionOnPlan: positionsDataToUpdate.map((entry) =>\n JSON.stringify(entry)\n ),\n });\n })\n );\n }\n this.matterportImportService.removeFrame();\n\n this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);\n alert(this.translate.instant('calibration.success'));\n }\n\n /** Reset the canvas */\n onReset() {\n this.reflectH = false;\n this.reflectV = false;\n this.preview = false;\n\n this.configureCanvas();\n }\n\n /** Cancel, leave */\n onCancel() {\n this.matterportImportService.removeFrame();\n this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);\n alert(this.translate.instant('calibration.canceled'));\n }\n\n async onFloorClick(floor) {\n this.currentFloor = floor;\n await this.matterportImportService.moveToFloor(floor.id);\n }\n\n onActivateZoomChange() {\n this.zoomCanBeChanged = !this.zoomCanBeChanged;\n const iframe = document.querySelector('#viewer-frame') as HTMLElement;\n if (iframe) {\n iframe.style.zIndex = this.zoomCanBeChanged ? '1' : '0';\n }\n }\n}\n","<div class=\"row mt-3\">\n <div class=\"col\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems'></lib-tab-navigation>\n </div>\n </div>\n</div>\n\n<div id=\"rowCanvas\">\n <div #canvasDiv id=\"canvasDiv\">\n\n <div id=\"viewer-frame\" [style.pointer-events]=\"zoomCanBeChanged?'auto':'none'\">\n <!-- <div class=\"blur\"></div> -->\n </div>\n <canvas id=\"canvas\" [ngStyle]=\"{'opacity': (preview||loading) ? '1' : 'calc(' + opacity + '/ 100)'}\"></canvas>\n </div>\n\n <div class=\"calibration-tools container-fluid\" *ngIf=\"!(preview || loading)\">\n <h1>{{'Calibration tool' | translate}}</h1>\n <div class=\"tool\">\n <div class=\"row ms-0 me-0 legend\">\n <div class=\"legend-bar-indicator\" [ngStyle]=\"{'opacity': 'calc(' + (-(opacity-100)+10) + '/ 100)'}\">\n {{'Less' | translate}}</div>\n <div class=\"legend-title\">{{'Plan Opacity' | translate }}</div>\n <div class=\"legend-bar-indicator\" [ngStyle]=\"{'opacity': 'calc(' + (opacity+10) + '/ 100)'}\">{{'More' |\n translate}}</div>\n </div>\n <div class=\"row ms-0 me-0 \">\n <input [disabled]=\"false\" [ngModelOptions]=\"{standalone: true}\" [(ngModel)]=\"opacity\" type=\"range\"\n class=\"form-range\" min=\"0\" max=\"100\" value=\"50\" id=\"opacity\">\n </div>\n </div>\n <div class=\"tool\">\n <div class=\"row ms-0 me-0 \">\n <div class=\"label-legend\">{{'Change Visit Floor' | translate}}</div>\n <div ngbDropdown class=\"d-inline-block ms-3\">\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" ngbDropdownToggle>\n {{currentFloor ? currentFloor.id : ('Floor' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button ngbDropdownItem *ngFor=\"let floor of floors\" (click)=\"onFloorClick(floor)\">\n {{ floor.name.length > 0 ? floor.name : ('Floor ' + floor.id) }}\n </button>\n </div>\n </div>\n </div>\n\n </div>\n <div class=\"tool\">\n <div class=\"row ms-0 me-0 \">\n <div class=\"tool-checkbox-container\">\n <div class=\"tool-checkbox-subcontainer\">\n <div class=\"label-legend me-3\">{{'Pan/Zoom Visit' | translate}} {{zoomCanBeChanged ? \"ON\" :\n \"OFF\"}}\n </div>\n <input type=\"checkbox\" (change)=\"onActivateZoomChange()\" style=\"margin-top: 5px;\">\n </div>\n <div class=\"card border-warning mb-3 mt-3\" *ngIf=\"zoomCanBeChanged\">\n <div class=\"card-body text-warning\">\n <h5 class=\"card-title\">{{\"calibration.wait-message\" | translate}}</h5>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"action\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onPreview()\"\n [disabled]=\"zoomCanBeChanged\">{{'Preview' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'Cancel' |\n translate}}</button>\n\n </div>\n\n </div>\n <div class=\"calibration-tools container-fluid\" *ngIf=\"preview\">\n <h1>{{'Validation' | translate}}</h1>\n <div class=\"action\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onSave()\">{{'Validate' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onReset()\">{{'Reset' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'Cancel' |\n translate}}</button>\n\n </div>\n </div>\n\n\n <div class=\"calibration-tools container-fluid\" *ngIf=\"loading\">\n <h3>{{\"Waiting for Matterport\" | translate}}...</h3>\n <div class=\"d-flex justify-content-center\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n </div>\n</div>","import { Component, OnInit } from '@angular/core';\nimport { UntypedFormGroup, UntypedFormBuilder, Validators } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Zone, Space, Plan, MenuItem, SpaceService, PlanService, getMetaForImage, getSignedFile, downloadFileAsObject, downloadBlob, NavigatorService } from '@smarterplan/ngx-smarterplan-core';\nimport panzoom from 'panzoom';\nimport { Subject, takeUntil } from 'rxjs';\n\n@Component({\n selector: 'lib-plans',\n templateUrl: './plans.component.html',\n styleUrls: ['./plans.component.scss']\n})\nexport class PlansComponent implements OnInit {\n\n spaceID: string;\n\n currentSpace: Space;\n\n plans: Plan[];\n\n // chosenPlan: Plan;\n\n indexDetails = -1;\n\n loading = false;\n\n uploadingPlan = false;\n\n planForm: UntypedFormGroup;\n\n isCurrentPlanForZone = false;\n\n canvas;\n\n scale: number;\n\n panzoom: any;\n\n currentZone: Zone;\n\n fileToUpload: File;\n\n chosenPlanIsPdf = false;\n\n zones: Zone[];\n\n menuItems: MenuItem[] = [];\n\n destroy$ = new Subject();\n\n constructor(\n private route: ActivatedRoute,\n private router: Router,\n private spaceService: SpaceService,\n private planService: PlanService,\n private fb: UntypedFormBuilder,\n private translate: TranslateService,\n private navigatorService: NavigatorService\n ) {\n this.navigatorService.locationIDChange\n .pipe(takeUntil(this.destroy$))\n .subscribe((spaceID) => {\n this.router.navigate([\"dashboard/localisation\", spaceID, \"plans\"]);\n });\n\n this.route.params.subscribe((params) => {\n this.spaceID = params.id;\n this.getPlans();\n });\n }\n\n ngOnInit(): void {\n if (\n this.planService.getPlanFileCache() &&\n this.planService.getChosenPlan()\n ) {\n this.addPlanFromCache(\n this.planService.getPlanFileCache(),\n this.planService.getChosenPlan(),\n );\n this.planService.setPlanFileCache(null);\n }\n this.planService.setChosenPlan(null);\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n setupMenuItems() {\n this.menuItems = [\n { label: \"Locations\", url: \"/localisation\" },\n {\n label: this.currentSpace.name,\n url: `/localisation/${this.currentSpace.id}`,\n },\n {\n label: \"Plans\",\n url: `/localisation/${this.currentSpace.id}/plans`,\n },\n ];\n }\n\n onGoBack() { }\n\n async onPlanClick(plan?: Plan) {\n if (plan) this.planService.setChosenPlan(plan);\n this.chosenPlanIsPdf = plan.annexe.includes(\"pdf\");\n if (!this.chosenPlanIsPdf) {\n setTimeout(() => {\n this.configureCanvas().then(() => {\n this.panzoom = panzoom(this.canvas, {\n bounds: true,\n boundsPadding: 0,\n maxZoom: 3.5,\n minZoom: 0.1,\n initialZoom: 0.5,\n });\n });\n }, 500);\n }\n }\n\n async configureCanvas() {\n this.uploadingPlan = true;\n const canvas = document.querySelector(\"#canvas\") as HTMLCanvasElement;\n const image = await getMetaForImage(this.getChoosenPlan().filepath);\n canvas.width = image.width;\n canvas.height = image.height;\n this.canvas = canvas;\n this.drawImage(this.getChoosenPlan().filepath);\n this.uploadingPlan = false;\n }\n\n drawImage(url: string, x = 0, y = 0) {\n const image = new Image();\n const context = this.canvas.getContext(\"2d\");\n const imageWidth = this.canvas.width;\n const imageHeight = this.canvas.height;\n image.addEventListener(\"load\", () => {\n context.drawImage(\n image,\n 0,\n 0,\n image.width,\n image.height,\n x,\n y,\n imageWidth,\n imageHeight,\n );\n });\n image.src = url;\n // image.crossOrigin = \"*\"; //need to download as png,\n // BUT: https://stackoverflow.com/questions/49503171/the-image-tag-with-crossorigin-anonymous-cant-load-success-from-s3\n }\n\n async getPlans() {\n this.loading = true;\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\n this.setupMenuItems();\n\n this.zones = this.currentSpace.zones.items;\n this.plans = await this.planService.getSingedPlansForSpace(this.spaceID);\n this.loading = false;\n if (this.plans.length === 1) {\n this.onPlanClick(this.plans[0]);\n }\n }\n\n getChoosenPlan() {\n return this.planService.getChosenPlan();\n }\n\n removeImage() {\n const context = this.canvas.getContext(\"2d\");\n context.clearRect(0, 0, 4096, 4096);\n }\n\n /**\n *\n */\n onCalibrateClick() {\n if (this.getChoosenPlan()) {\n this.router.navigate(\n [\"/dashboard/localisation\", this.spaceID, \"plan-calibration\"],\n { queryParams: { spaceID: this.spaceID } },\n );\n }\n }\n\n /**\n *\n */\n onEditClick() {\n if (this.getChoosenPlan()) {\n this.router.navigate(\n [\"/dashboard/localisation\", this.spaceID, \"plan-edit\"],\n { queryParams: { spaceID: this.spaceID } },\n );\n }\n }\n\n onUploadClick() {\n const inputFile = document.querySelector(\n \"#upload-file\",\n ) as HTMLInputElement;\n inputFile.click();\n }\n\n addPlan(target: EventTarget) {\n this.fileToUpload = (target as HTMLInputElement).files[0];\n this.planForm = this.fb.group({\n name: [this.fileToUpload.name, [Validators.required]],\n zoneID: [null, [Validators.required]],\n spaceID: this.spaceID,\n isModified: false,\n calibration: \"\",\n });\n }\n\n addPlanFromCache(file: File, plan: Plan) {\n this.fileToUpload = file;\n this.planForm = this.fb.group({\n name: [this.fileToUpload.name, [Validators.required]],\n zoneID: [plan ? plan.zoneID : null, [Validators.required]],\n spaceID: this.spaceID,\n isModified: !!plan,\n calibration:\n plan && plan.isModified && plan.calibration\n ? plan.calibration\n : \"\",\n });\n }\n\n async onSavePlan() {\n const formValue = this.planForm.value as Plan;\n formValue.isCurrentForZone = this.isCurrentPlanForZone;\n const createdPlan = await this.planService.createPlanWithAnnexe(\n formValue,\n this.fileToUpload,\n );\n const filepath = await getSignedFile(createdPlan.annexe);\n if (filepath) {\n createdPlan.filepath = filepath;\n }\n if (formValue.isCurrentForZone) {\n // set all other plans to not current\n this.planService.setAllPlansForZoneNotCurrent(\n createdPlan.zoneID,\n createdPlan.id,\n );\n }\n this.plans.push(createdPlan);\n this.planForm = null;\n this.fileToUpload = null;\n }\n\n onCancelUpload() {\n this.fileToUpload = null;\n this.planForm = null;\n }\n\n async onCurrentPlanClick() {\n await this.planService.updatePlan({\n id: this.getChoosenPlan().id,\n isCurrentForZone: this.getChoosenPlan().isCurrentForZone,\n });\n if (this.getChoosenPlan().isCurrentForZone) {\n this.planService.setAllPlansForZoneNotCurrent(\n this.getChoosenPlan().zoneID,\n this.getChoosenPlan().id,\n );\n }\n }\n\n async onDownloadClick() {\n const signedFile = await downloadFileAsObject(\n this.getChoosenPlan().annexe,\n );\n if (signedFile) {\n // @ts-ignore\n downloadBlob(signedFile.Body, this.getChoosenPlan().name);\n }\n }\n\n async onDownloadAsPng() {\n const canvas = document.querySelector(\"#canvas\") as HTMLCanvasElement;\n canvas.toBlob(function (blob) {\n downloadBlob(blob, \"plan-as-png.png\");\n });\n }\n\n async onRemoveClick() {\n const message = this.translate.instant(\"confirm.deletePlan\");\n if (window.confirm(message)) {\n await this.planService.deletePlan(this.getChoosenPlan());\n this.removeImage();\n this.planService.setChosenPlan(null);\n this.getPlans();\n }\n }\n}\n","<div class=\"container-fluid\" *ngIf=\"currentSpace\" class=\"dashboard-tab\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <div class=\"mt-3\" *ngIf=\"!plans && !loading\">\n <h4 style=\"font-weight: bold;\">{{'No imported plans' | translate }}</h4>\n <p>{{'For import from 3D visit: go Virtual Visits => Import Images' | translate}}</p>\n </div>\n <div class=\"row ms-1\">\n <div ngbDropdown class=\"d-inline-block me-3\">\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" ngbDropdownToggle>{{getChoosenPlan() ?\n getChoosenPlan().name: ('Choose Plan' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button ngbDropdownItem *ngFor=\"let plan of plans\" (click)=\"onPlanClick(plan)\">{{plan.name }}\n </button>\n </div>\n </div>\n <div class=\"d-inline-block\" ngbDropdown #myDrop=\"ngbDropdown\">\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownManual\" ngbDropdownToggle>{{'Choose action' |\n translate}}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownManual\">\n <button (click)=\"onCalibrateClick()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">{{'Calibrate' |\n translate}}</button>\n <button (click)=\"onEditClick()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">{{'Edit plan' |\n translate}}\n </button>\n <button (click)=\"onUploadClick()\" ngbDropdownItem>{{'Upload new plan' | translate}}</button>\n <button (click)=\"onDownloadClick()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">{{'Download plan' |\n translate}}</button>\n <button (click)=\"onRemoveClick()\" ngbDropdownItem\n [disabled]=\"!getChoosenPlan() || getChoosenPlan().isImportedMatterport\">{{'Delete plan' |\n translate}}</button>\n <!-- <button (click)=\"onDownloadAsPng()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">\n {{'Download plan as PNG' | translate}}</button> -->\n </div>\n </div>\n </div>\n <div class=\"row mt-3 ms-0\">\n <h4 *ngIf=\"fileToUpload\">{{'New plan' | translate }}</h4>\n <input class=\"hidden\" type=\"file\" id=\"upload-file\" name=\"upload-file\" accept=\"image/png, image/jpeg, .pdf, .svg\"\n ngf-max-size=\"6MB\" (change)=\"addPlan($event.target)\">\n </div>\n <div class=\"col-md-6 mt-3\" *ngIf=\"planForm\">\n <form (ngSubmit)=\"onSavePlan()\" [formGroup]=\"planForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3\">{{'Name' | translate}} </label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3\">{{'Zone' | translate}} </label>\n <div class=\"col-sm-9\">\n <select class=\"form-control\" formControlName=\"zoneID\">\n <option *ngFor=\"let zone of zones\" [ngValue]=\"zone.id\">\n {{ zone.name }}\n </option>\n </select>\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3\">{{'Set as current plan for zone' | translate}}</label>\n <div class=\"col-sm-3\">\n <input type=\"checkbox\" [(ngModel)]=\"isCurrentPlanForZone\" [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div>\n <button [disabled]=\"planForm.invalid\" type='submit' class=\"btn btn-label-file rounded-pill\">{{'Save' |\n translate}}</button>\n <button class=\"btn btn-label-file rounded-pill ms-3\" type=\"button\" (click)=\"onCancelUpload()\">{{'Cancel' |\n translate}}</button>\n </form>\n </div>\n <ul class=\"col-md-6 list-group list-group-flush\" *ngIf=\"getChoosenPlan()\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate }} : {{getChoosenPlan().name}} </li>\n <li class=\"list-group-item bg-transparent\"> {{'Plan is ' | translate }} :\n {{getChoosenPlan().calibration ? ('Calibrated' | translate) : ('Not calibrated' | translate)}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Attributed to zone ' | translate }} :\n {{getChoosenPlan().zone ? getChoosenPlan().zone.name : 'None'}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Is current plan for zone ' | translate }} :\n <input type=\"checkbox\" [(ngModel)]=\"getChoosenPlan().isCurrentForZone\" (change)=\"onCurrentPlanClick()\">\n </li>\n\n </ul>\n\n <div class=\"row mt-4\">\n <div class=\"col-md-10\">\n <embed *ngIf=\"getChoosenPlan() && chosenPlanIsPdf\" [src]=\"getChoosenPlan().filepath | safeUrl\"\n type=\"application/pdf\" frameBorder=\"0\" scrolling=\"auto\" height=\"650px;\" width=\"100%\" />\n <div *ngIf=\"!chosenPlanIsPdf\" class=\"row\" style=\"height: 500px; overflow: hidden;\" id=\"canvasDiv\">\n <canvas id=\"canvas\" width=\"4096px\" height=\"4096px\">\n <!-- <img *ngIf=\"chosenPlan\" id=\"plan-image\" [src]=\"chosenPlan.filepath\" style=\"width: 100%;\"> -->\n </canvas>\n\n </div>\n </div>\n </div>\n</div>\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'lib-chevron',\n templateUrl: './chevron.component.html',\n styleUrls: ['./chevron.component.scss']\n})\nexport class ChevronComponent implements OnInit {\n\n @Input() conditionShowing = false;\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","<div style=\"height: 30px; width: 30px;\">\n <span class=\"icon-container\" >\n <div [class]=\"conditionShowing ? 'icon-img-up' : 'icon-img-down'\"></div>\n </span>\n</div>\n","import { Component, OnInit, ViewChild } from '@angular/core';\nimport {\n UntypedFormGroup,\n UntypedFormBuilder,\n Validators,\n AbstractControl,\n} from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { NgbModal, ModalDismissReasons } from '@ng-bootstrap/ng-bootstrap';\nimport {\n Node,\n Visit,\n MenuItem,\n MatterportImportService,\n ThreeJsImportService,\n CaptureService,\n NodeService,\n SpaceService,\n VisitService,\n CaptureViewer,\n Capture,\n ValidatorsService,\n NavigatorService,\n} from '@smarterplan/ngx-smarterplan-core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Subject, takeUntil } from 'rxjs';\n\n@Component({\n selector: 'lib-visits',\n templateUrl: './visits.component.html',\n styleUrls: ['./visits.component.scss'],\n})\nexport class VisitsComponent implements OnInit {\n spaceId: string;\n\n visitIndexDetails = -1;\n\n visitForm: UntypedFormGroup;\n\n isEditing: boolean = false;\n\n visitSubmitted: boolean = false;\n\n captureDate: number;\n\n currentSpace = { zones: [] } as any;\n\n visits: Visit[] = [];\n\n closeResult: string;\n\n @ViewChild('content', { static: false }) private content;\n\n modalReference: any;\n\n canCancelImport = false;\n\n imagesProcessed: number = 0;\n\n totalImages: number = 0;\n\n imagesUploaded: number = 0;\n\n menuItems: MenuItem[] = [];\n\n errorForm: boolean = false;\n\n isProcessing = false;\n\n destroy$ = new Subject();\n\n constructor(\n private fb: UntypedFormBuilder,\n private matterportImportService: MatterportImportService,\n private threejsImportService: ThreeJsImportService,\n private captureService: CaptureService,\n private nodeService: NodeService,\n private spaceService: SpaceService,\n private route: ActivatedRoute,\n private modalService: NgbModal,\n private visitService: VisitService,\n public validatorsService: ValidatorsService,\n private translate: TranslateService,\n private navigatorService: NavigatorService,\n private router: Router,\n ) {\n this.matterportImportService.importingImages.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.canCancelImport = true;\n });\n this.matterportImportService.sweepProcessedCount.pipe(takeUntil(this.destroy$)).subscribe((count) => {\n this.imagesProcessed = count + 1;\n });\n this.matterportImportService.totalSweepsCount.pipe(takeUntil(this.destroy$)).subscribe((count) => {\n this.totalImages = count;\n });\n\n this.navigatorService.locationIDChange\n .pipe(takeUntil(this.destroy$))\n .subscribe((spaceID) => {\n this.router.navigate([\"dashboard/localisation\", spaceID, \"visits\"]);\n });\n\n this.route.params.subscribe((params) => {\n this.spaceId = params.id;\n this.resetVisits();\n });\n }\n\n async ngOnInit(): Promise<void> {\n this.spaceId = this.route.snapshot.paramMap.get('id');\n await this.resetVisits();\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n /*\n Visit = {\n captureID: string,\n model3d: string,\n takenAt: number,\n spaceID: string,\n viewer: CaptureViewer,\n surface: number,\n node: Node,\n name?: string | null\n }\n */\n setupMenuItems() {\n this.menuItems = [\n { label: 'Locations', url: '/localisation' },\n {\n label: this.currentSpace.name,\n url: `/localisation/${this.currentSpace.id}`,\n },\n {\n label: 'Virtual visits',\n url: `/localisation/${this.currentSpace.id}/visits`,\n },\n ];\n }\n\n onGoBack() {\n this.onCancel();\n }\n\n async resetVisits() {\n this.visits = [];\n this.currentSpace = await this.spaceService.getSpace(this.spaceId);\n this.setupMenuItems();\n await this.visitService\n .getVisitsForSpaceForUser(this.spaceId)\n .then((visits) => {\n if (visits) {\n this.visits = visits;\n }\n });\n }\n\n initVisitForm(input: Visit = null) {\n if (input) {\n this.visitForm = this.fb.group({\n captureID: input.captureID,\n nodeID: input.node.id,\n name: [input.name, [Validators.required]],\n model3D: [input.model3d, [Validators.required]],\n viewer: input.viewer ? input.viewer : CaptureViewer.MATTERPORT,\n surface: input.surface ? input.surface : null,\n threeJsPlacement: input.captureMetadata ?? null,\n });\n this.captureDate = input.takenAt;\n } else {\n this.visitForm = this.fb.group({\n model3D: [null, [Validators.required]],\n viewer: CaptureViewer.MATTERPORT,\n surface: null,\n name: [null, [Validators.required]],\n threeJsPlacement: null,\n });\n }\n }\n\n /** True while the form is set to create a Three.js visit, which asks for different fields. */\n get isThreeJsVisit(): boolean {\n return this.visitForm?.value.viewer === CaptureViewer.THREEJS;\n }\n\n /** Validation error for the 3D model field, or null. Only meaningful for Three.js visits. */\n get modelKeyError(): string | null {\n if (!this.isThreeJsVisit) {\n return null;\n }\n return this.threejsImportService.validateModelKey(this.visitForm.value.model3D);\n }\n\n async onToggleDetail(index) {\n this.visitIndexDetails = index === this.visitIndexDetails ? -1 : index;\n this.imagesUploaded = await this.matterportImportService.getUploadedImageCount(this.visits[index].model3d);\n }\n\n onAddVisit() {\n this.initVisitForm();\n this.menuItems.push({ label: 'New' });\n }\n\n onEdit(visit) {\n this.initVisitForm(visit);\n this.isEditing = true;\n this.menuItems.push({ label: visit.name });\n }\n\n async onSubmitVisit() {\n this.visitSubmitted = true;\n if (!this.visitForm.valid) {\n this.errorForm = true;\n return;\n }\n // A Three.js visit points at a file rather than a Matterport model, so the reference is\n // checked before anything is written - otherwise a typo creates zones and navigation for a\n // model that 404s the first time someone opens the visit.\n if (this.modelKeyError) {\n this.errorForm = true;\n return;\n }\n this.errorForm = false;\n const formValue = this.visitForm.value;\n const capture = {\n viewer: formValue.viewer,\n takenAt: this.captureDate,\n surface: formValue.surface,\n spaceID: this.currentSpace.id,\n metadata: this.isThreeJsVisit ? formValue.threeJsPlacement : null,\n } as Capture;\n\n if (this.isEditing) {\n capture.id = formValue.captureID;\n await this.captureService.updateCapture(capture);\n const node = {\n id: formValue.nodeID,\n model3D: formValue.model3D,\n metadata: formValue.name,\n } as Node;\n await this.nodeService.updateNode(node);\n } else {\n let createdNode;\n await this.captureService.createCapture(capture).then(async (res) => {\n if (res) {\n const node = {\n model3D: formValue.model3D,\n captureID: res.id,\n metadata: formValue.name,\n } as Node;\n createdNode = await this.nodeService.createNode(node);\n }\n });\n this.launchImport(\n formValue.model3D,\n formValue.surface,\n createdNode,\n formValue.viewer,\n false,\n false,\n formValue.threeJsPlacement\n )\n .then((success) => {\n this.modalReference.close('import ended with success');\n })\n .catch((e) => {\n this.modalReference.close(`Error while import: ${e}`);\n alert(`Error while import: ${e} ${JSON.stringify(e)}`);\n this.onDelete({\n node: createdNode,\n captureID: createdNode.captureID,\n } as Visit, false);\n });\n }\n await this.resetVisits();\n this.onCancel();\n }\n\n get model3D(): AbstractControl {\n return this.visitForm.get('model3D');\n }\n\n get name(): AbstractControl {\n return this.visitForm.get('name');\n }\n\n onCancel() {\n this.visitSubmitted = false;\n this.visitForm = null;\n this.isEditing = false;\n this.canCancelImport = false;\n this.totalImages = 0;\n this.imagesProcessed = 0;\n this.errorForm = false;\n this.setupMenuItems();\n }\n\n async onDelete(visit: Visit, needPermission = true) {\n const message = this.translate.instant('confirm.deleteVisit');\n // eslint-disable-next-line no-alert\n if (window.confirm(message) || !needPermission) {\n console.log(this.visitIndexDetails);\n this.isProcessing = true;\n await this.visitService.deleteVisit(visit, this.spaceId);\n await this.resetVisits();\n this.isProcessing = false;\n }\n }\n\n private getDismissReason(reason: any): string {\n if (reason === ModalDismissReasons.ESC) {\n return 'by pressing ESC';\n }\n if (reason === ModalDismissReasons.BACKDROP_CLICK) {\n return 'by clicking on a backdrop';\n }\n return `with: ${reason}`;\n }\n\n async launchImport(\n model3D,\n surface,\n node,\n viewerType: CaptureViewer,\n imagesOnly = false,\n overrideExisting = false,\n placementMetadata: string = null,\n ) {\n this.modalReference = this.modalService.open(this.content, {\n ariaLabelledBy: \"modal-basic-title\",\n });\n this.modalReference.result.then(\n (result) => {\n this.closeResult = `Closed with: ${result}`;\n console.log(this.closeResult);\n this.cancelImport();\n },\n (error) => {\n this.closeResult = `Dismissed ${this.getDismissReason(error)}`;\n console.log(this.closeResult);\n this.cancelImport();\n },\n );\n try {\n if (viewerType === CaptureViewer.THREEJS) {\n // Route the import to the new Three.js Import Service\n await this.threejsImportService.importData(\n this.spaceId,\n surface,\n imagesOnly,\n node,\n overrideExisting,\n placementMetadata\n );\n } else {\n // Route the import to the existing Matterport Import Service\n await this.matterportImportService.initSdkForModel(model3D);\n\n await this.matterportImportService.importData(\n this.spaceId,\n surface,\n imagesOnly,\n node,\n overrideExisting\n );\n }\n\n this.modalReference.close();\n\n } catch (error) {\n console.log(error);\n Promise.reject(error);\n }\n }\n\n private cancelImport() {\n this.matterportImportService.abandon();\n this.onCancel();\n this.resetVisits();\n }\n\n onImportImages(visit: Visit, overrideExisting) {\n this.launchImport(visit.model3d, null, visit.node.id, visit.viewer, true, overrideExisting, visit.captureMetadata);\n }\n\n isFormError(control) {\n return control && control.invalid && this.errorForm;\n }\n}\n","<div class=\"container-fluid\" class=\"dashboard-tab\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\n </div>\n\n <div class=\"row main-form-container\">\n <div class=\"col-md-6 form-container\">\n <ul class=\"list-group list-group-flush\" *ngIf=\"!visitForm\">\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let visit of visits; index as index\">\n <div class=\"d-flex justify-content-between align-items-center\" (click)=\"onToggleDetail(index)\">\n {{visit.name ? visit.name : visit.model3d }}\n <lib-chevron [conditionShowing]=\"index==visitIndexDetails\"></lib-chevron>\n </div>\n <div *ngIf=\"index==visitIndexDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}} : {{ visit.name ?\n visit.name : \"Not provided\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'3D Model' | translate}} : {{ visit.model3d }}\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Surface' | translate}}, m<sup>2</sup>: {{\n visit.surface ?\n visit.surface : 'Not provided' | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Viewer' | translate}} : {{ visit.viewer }}\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Date of capture' | translate}} : {{\n visit.takenAt | timeDateString | async}}\n <li class=\"list-group-item bg-transparent\">{{'Images are imported' | translate}} : {{\n imagesUploaded }}\n </li>\n </ul>\n \n <lib-loader *ngIf=\"isProcessing\"></lib-loader>\n\n <div class=\"action-button-container mt-3\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onImportImages(visit, true)\" [disabled]=\"isProcessing\">{{'Import all images' |\n translate}}</button>\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' |\n translate}} {{imagesUploaded}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" [disabled]=\"isProcessing\"\n (click)=\"onEdit(visit)\">{{'Edit' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" [disabled]=\"isProcessing\"\n (click)=\"onDelete(visit)\">{{'Delete' | translate}}</button>\n </div>\n </div>\n </li>\n </ul>\n <div *ngIf=\"visitForm\">\n <form (ngSubmit)=\"onSubmitVisit()\" [formGroup]=\"visitForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}}</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Reference 3D model' | translate}} *</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" [readonly]=\"isEditing\"\n [class.is-invalid]=\"model3D.invalid && visitSubmitted\" required\n formControlName=\"model3D\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-name-invalid\" [dismissible]=\"false\" type=\"danger\" \n *ngIf=\"validatorsService.isControlError(visitForm.controls['name']) \n || isFormError(visitForm.controls['name'])\">\n {{validatorsService.getError(visitForm.controls['name']) | translate}}\n </ngb-alert>\n </div>\n <div *ngIf=\"isEditing\" class=\"text-danger\">\n {{'Cannot change 3D model reference. Please add new model.' | translate}}\n </div>\n <!-- A Three.js visit stores an S3 key here instead of a Matterport model ID,\n so the field means something different depending on the viewer above. -->\n <div *ngIf=\"isThreeJsVisit\" class=\"form-text\">\n {{'S3 key of the .glb file, for example visits/my-model.glb' | translate}}\n </div>\n <div *ngIf=\"modelKeyError && visitSubmitted\" class=\"text-danger\">\n {{modelKeyError | translate}}\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Viewer' | translate}}</label>\n <div class=\"col-sm-10\">\n <select class=\"form-select\" formControlName=\"viewer\">\n <option value=\"MATTERPORT\">Matterport</option>\n <option value=\"THREEJS\">Modèle 3D (Three.js)</option>\n <option value=\"CUPIX\">Cupix</option>\n </select>\n </div>\n </div>\n\n <div class=\"mb-3 row\" *ngIf=\"isThreeJsVisit\">\n <label class=\"col-sm-2 col-form-label\">{{'Initial placement' | translate}}</label>\n <div class=\"col-sm-10\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"threeJsPlacement\"\n placeholder='{\"cameraPosition\": {\"x\": 0, \"y\": 5, \"z\": 15}, \"rotation\": {\"x\": 0, \"y\": 0, \"z\": 0}}'></textarea>\n <div class=\"form-text\">\n {{'Optional. Leave empty to frame the model automatically.' | translate}}\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Surface' | translate}}</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" formControlName=\"surface\">\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Capture Date' | translate}}</label>\n <div class=\"input-group\">\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"captureDate\" ngbDatepicker\n #d1=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\n <div class=\"input-group-append\">\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\"\n type=\"button\"></button>\n </div>\n </div>\n </div>\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill me-2\">{{'Save' |\n translate}}</button>\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\n translate}}</button>\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\n <ngb-alert data-testid=\"new-location-form-invalid\" [dismissible]=\"false\" type=\"danger\">\n {{'errorForm.infoBtn' |translate}}\n \n </ngb-alert>\n </div>\n </form>\n </div>\n <div *ngIf=\"!visitForm\">\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onAddVisit()\">{{'Add 3D visit' |\n translate}}</button>\n </div>\n </div>\n <div id=\"viewer-frame\" style=\"width: 100%; aspect-ratio: 2/1;\"></div>\n </div>\n <ng-template #content let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\" id=\"modal-basic-title\">{{'Importing Data' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n {{'Please do not leave or refresh this page...' | translate}}\n <div *ngIf=\"totalImages != 0\">Imported {{imagesProcessed}} out of {{totalImages}} images.</div>\n <div class=\"d-flex justify-content-center\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">{{'Loading' | translate}}...</span>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-dark\" [disabled]=\"!canCancelImport\"\n (click)=\"modal.close('Cancel click')\">{{'Cancel import of images' | translate}}</button>\n </div>\n </ng-template>\n</div>","import { Component, OnInit, ViewChild } from '@angular/core';\nimport {\n UntypedFormGroup,\n UntypedFormBuilder,\n Validators,\n} from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { NgbModal, ModalDismissReasons } from '@ng-bootstrap/ng-bootstrap';\nimport {\n Node,\n Visit,\n MenuItem,\n ThreeJsImportService,\n CaptureService,\n NodeService,\n SpaceService,\n VisitService,\n CaptureViewer,\n Capture,\n Space,\n ValidatorsService,\n uploadFileToS3WithProgress,\n} from '@smarterplan/ngx-smarterplan-core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Subject, takeUntil } from 'rxjs';\n\n/**\n * Admin screen for the 3D models a site can be visited with.\n *\n * These are stored the same way Matterport visits are - a Capture plus a Node - with the viewer set\n * to THREEJS and the .glb's S3 key in the node's model3D. Sharing the storage is what lets a site\n * carry several models and what makes tags follow the same POI records in either viewer; the split\n * here is only in the form: a 3D model is a name and a file, where a Matterport visit is a model ID\n * and capture details. Placement and alignment are not asked for here - the viewer's alignment tool\n * writes them into the capture's metadata once someone calibrates against a real scene.\n */\n@Component({\n selector: 'lib-models3d',\n templateUrl: './models3d.component.html',\n})\nexport class Models3dComponent implements OnInit {\n @ViewChild('content', { static: true }) content;\n\n menuItems: MenuItem[] = [];\n\n currentSpace: Space;\n\n spaceId: string;\n\n /** Only the visits captured as 3D models; Matterport ones stay on the Virtual Visits screen. */\n models: Visit[] = [];\n\n modelForm: UntypedFormGroup;\n\n modelIndexDetails = -1;\n\n isEditing = false;\n\n isProcessing = false;\n\n submitted = false;\n\n errorMessage: string | null = null;\n\n modalReference: any;\n\n destroy$ = new Subject();\n\n constructor(\n private fb: UntypedFormBuilder,\n private route: ActivatedRoute,\n private router: Router,\n private modalService: NgbModal,\n private spaceService: SpaceService,\n private visitService: VisitService,\n private captureService: CaptureService,\n private nodeService: NodeService,\n private threejsImportService: ThreeJsImportService,\n public validatorsService: ValidatorsService,\n private translate: TranslateService,\n ) {}\n\n async ngOnInit() {\n this.spaceId = this.route.snapshot.paramMap.get('id');\n await this.reload();\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n async reload() {\n this.currentSpace = await this.spaceService.getSpace(this.spaceId);\n this.setupMenuItems();\n const visits = await this.visitService.getVisitsForSpaceForUser(this.spaceId);\n this.models = (visits ?? []).filter((visit) => visit.viewer === CaptureViewer.THREEJS);\n }\n\n setupMenuItems() {\n this.menuItems = [\n { label: 'Locations', url: '/localisation' },\n { label: this.currentSpace.name, url: `/localisation/${this.currentSpace.id}` },\n { label: '3D Models', url: `/localisation/${this.currentSpace.id}/models3d` },\n ];\n }\n\n onGoBack() {\n this.router.navigate(['/dashboard/localisation', this.spaceId]);\n }\n\n onToggleDetail(index: number) {\n this.modelIndexDetails = index === this.modelIndexDetails ? -1 : index;\n }\n\n onAdd() {\n this.initForm();\n this.menuItems.push({ label: 'New' });\n }\n\n onEdit(model: Visit) {\n this.initForm(model);\n this.isEditing = true;\n this.menuItems.push({ label: model.name });\n }\n\n onCancel() {\n this.modelForm = null;\n this.isEditing = false;\n this.submitted = false;\n this.errorMessage = null;\n this.setupMenuItems();\n }\n\n initForm(input: Visit = null) {\n this.submitted = false;\n this.errorMessage = null;\n if (input) {\n this.modelForm = this.fb.group({\n captureID: input.captureID,\n nodeID: input.node.id,\n name: [input.name, [Validators.required]],\n modelKey: [input.model3d, [Validators.required]],\n });\n } else {\n this.modelForm = this.fb.group({\n name: [null, [Validators.required]],\n modelKey: [null, [Validators.required]],\n });\n }\n }\n\n /** Upload progress as a percentage, or null when nothing is uploading. */\n uploadPercent: number | null = null;\n\n uploadedFileName: string | null = null;\n\n /**\n * Uploads the chosen .glb and puts the resulting key on the form.\n *\n * Storage.put authenticates with the signed-in user's session rather than separate S3\n * credentials, so anyone who can reach this screen can upload - which is what makes picking a\n * file a better ask than typing a key someone else had to produce.\n */\n async onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (!file) {\n return;\n }\n\n const name = file.name.toLowerCase();\n if (!name.endsWith('.glb') && !name.endsWith('.gltf')) {\n this.errorMessage = this.translate.instant('Only .glb or .gltf files can be used as a 3D model.');\n input.value = '';\n return;\n }\n\n this.errorMessage = null;\n this.uploadPercent = 0;\n this.uploadedFileName = file.name;\n\n try {\n const key = await uploadFileToS3WithProgress(\n `models3d/${this.spaceId}/`,\n file,\n (fraction) => {\n this.uploadPercent = Math.round(fraction * 100);\n },\n );\n this.modelForm.patchValue({ modelKey: key });\n // Name the model after the file when the field is still empty, so the common case needs\n // no extra typing.\n if (!this.modelForm.value.name) {\n this.modelForm.patchValue({ name: file.name.replace(/\\.(glb|gltf)$/i, '') });\n }\n } catch (error) {\n this.errorMessage = this.describeError(error);\n this.uploadedFileName = null;\n } finally {\n this.uploadPercent = null;\n }\n }\n\n /** Validation error for the .glb key, or null. */\n get modelKeyError(): string | null {\n return this.threejsImportService.validateModelKey(this.modelForm?.value.modelKey);\n }\n\n async onSubmit() {\n this.submitted = true;\n this.errorMessage = null;\n\n if (!this.modelForm.valid || this.modelKeyError) {\n return;\n }\n\n const formValue = this.modelForm.value;\n const capture = {\n viewer: CaptureViewer.THREEJS,\n takenAt: Date.now(),\n spaceID: this.currentSpace.id,\n } as Capture;\n\n this.isProcessing = true;\n try {\n if (this.isEditing) {\n capture.id = formValue.captureID;\n // metadata is left untouched on edit: the alignment tool writes the visit's tag\n // transform there, and resending the form's idea of it would wipe that.\n await this.captureService.updateCapture(capture);\n await this.nodeService.updateNode({\n id: formValue.nodeID,\n model3D: formValue.modelKey,\n metadata: formValue.name,\n } as Node);\n } else {\n await this.createModel(formValue);\n }\n await this.reload();\n this.onCancel();\n } catch (error) {\n // The most likely failure is the backend rejecting the THREEJS enum value, which has not\n // shipped yet - say so rather than leaving an empty screen.\n this.errorMessage = this.describeError(error);\n } finally {\n this.isProcessing = false;\n }\n }\n\n /** Creates the capture, its node, and the zone/plan/navigation the viewer needs. */\n private async createModel(formValue: any) {\n const capture = await this.captureService.createCapture({\n viewer: CaptureViewer.THREEJS,\n takenAt: Date.now(),\n spaceID: this.currentSpace.id,\n } as Capture);\n\n if (!capture) {\n throw new Error('Could not create the capture for this 3D model.');\n }\n\n const node = await this.nodeService.createNode({\n model3D: formValue.modelKey,\n captureID: capture.id,\n metadata: formValue.name,\n } as Node);\n\n await this.threejsImportService.importData(\n this.spaceId,\n null,\n false,\n node,\n true,\n );\n }\n\n async onDelete(model: Visit) {\n this.modalReference = this.modalService.open(this.content);\n try {\n await this.modalReference.result;\n } catch {\n return; // dismissed\n }\n\n this.isProcessing = true;\n try {\n await this.nodeService.deleteNode(model.node.id);\n await this.captureService.deleteCapture(model.captureID);\n await this.reload();\n } catch (error) {\n this.errorMessage = this.describeError(error);\n } finally {\n this.isProcessing = false;\n }\n }\n\n /**\n * Turns whatever was thrown into something readable.\n *\n * AppSync rejections arrive as { errors: [{ message }] } with no `message` of their own, so the\n * obvious `error.message ?? String(error)` renders them as \"[object Object]\" - which hides\n * exactly the cases worth reading, like the backend refusing an enum value it does not know.\n */\n private describeError(error: any): string {\n if (typeof error === 'string') {\n return error;\n }\n const graphQlErrors = error?.errors;\n if (Array.isArray(graphQlErrors) && graphQlErrors.length > 0) {\n return graphQlErrors.map((e: any) => e?.message ?? JSON.stringify(e)).join(' | ');\n }\n if (error?.message) {\n return error.message;\n }\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n }\n\n getDismissReason(reason: any): string {\n if (reason === ModalDismissReasons.ESC) {\n return 'by pressing ESC';\n }\n if (reason === ModalDismissReasons.BACKDROP_CLICK) {\n return 'by clicking on a backdrop';\n }\n return `with: ${reason}`;\n }\n}\n","<div class=\"container-fluid\" class=\"dashboard-tab\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\n </div>\n\n <div class=\"row main-form-container\">\n <div class=\"col-md-6 form-container\">\n\n <!-- List -->\n <ul class=\"list-group list-group-flush\" *ngIf=\"!modelForm\">\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let model of models; index as index\">\n <div class=\"d-flex justify-content-between align-items-center\" (click)=\"onToggleDetail(index)\">\n {{ model.name ? model.name : model.model3d }}\n <lib-chevron [conditionShowing]=\"index == modelIndexDetails\"></lib-chevron>\n </div>\n <div *ngIf=\"index == modelIndexDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}} :\n {{ model.name ? model.name : ('Not provided' | translate) }}</li>\n <li class=\"list-group-item bg-transparent\">{{'3D model file' | translate}} :\n {{ model.model3d }}</li>\n <li class=\"list-group-item bg-transparent\">{{'Surface' | translate}}, m<sup>2</sup> :\n {{ model.surface ? model.surface : ('Not provided' | translate) }}</li>\n <li class=\"list-group-item bg-transparent\">{{'Initial placement' | translate}} :\n {{ model.captureMetadata ? model.captureMetadata : ('Automatic' | translate) }}</li>\n </ul>\n\n <lib-loader *ngIf=\"isProcessing\"></lib-loader>\n\n <div class=\"action-button-container mt-3\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n [disabled]=\"isProcessing\" (click)=\"onEdit(model)\">{{'Edit' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n [disabled]=\"isProcessing\" (click)=\"onDelete(model)\">{{'Delete' | translate}}</button>\n </div>\n </div>\n </li>\n </ul>\n\n <!-- An empty list with a button under it reads as \"nothing here\" and the button gets\n missed. With nothing to list, the action is the whole screen. -->\n <div *ngIf=\"!modelForm && models.length === 0\" class=\"text-center py-5\">\n <p class=\"text-muted\">{{'No 3D model yet for this location.' | translate}}</p>\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\n (click)=\"onAdd()\">{{'Add a 3D model' | translate}}</button>\n </div>\n\n <div class=\"action-button-container mt-3\" *ngIf=\"!modelForm && models.length > 0\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"onAdd()\">{{'Add a 3D model' | translate}}</button>\n </div>\n\n <!-- Form -->\n <form *ngIf=\"modelForm\" [formGroup]=\"modelForm\" (ngSubmit)=\"onSubmit()\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"name\"\n [class.is-invalid]=\"submitted && modelForm.controls['name'].invalid\">\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'3D model file' | translate}} *</label>\n <div class=\"col-sm-9\">\n <!-- styles.scss hides every input[type=file] app-wide; the convention here is a\n styled label wrapping the hidden input, as on the profile screen. -->\n <label for=\"model3d-file\" class=\"btn btn-outline-primary rounded-pill\">\n <input type=\"file\" id=\"model3d-file\" accept=\".glb,.gltf\"\n [disabled]=\"uploadPercent !== null\" (change)=\"onFileSelected($event)\">\n {{'Choose a file' | translate}}\n </label>\n <span *ngIf=\"uploadedFileName && uploadPercent === null\" class=\"ms-2\">{{uploadedFileName}}</span>\n\n <div *ngIf=\"uploadPercent !== null\" class=\"mt-2\">\n <div class=\"progress\" style=\"height: 6px;\" role=\"progressbar\"\n [attr.aria-valuenow]=\"uploadPercent\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n <div class=\"progress-bar\" style=\"transition: none;\"\n [style.width.%]=\"uploadPercent\"></div>\n </div>\n <div class=\"form-text\">{{'Uploading' | translate}} {{uploadedFileName}} — {{uploadPercent}}%</div>\n </div>\n\n <div *ngIf=\"uploadPercent === null && modelForm.value.modelKey\" class=\"form-text text-success\">\n {{ modelForm.value.modelKey }}\n </div>\n\n <div *ngIf=\"submitted && modelKeyError\" class=\"text-danger\">\n {{ modelKeyError | translate }}\n </div>\n </div>\n </div>\n\n <ngb-alert *ngIf=\"errorMessage\" type=\"danger\" [dismissible]=\"false\">\n {{ errorMessage }}\n </ngb-alert>\n\n <lib-loader *ngIf=\"isProcessing\"></lib-loader>\n\n <div class=\"action-button-container mt-3\">\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill me-2\"\n [disabled]=\"isProcessing\">{{'Save' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-secondary rounded-pill\"\n [disabled]=\"isProcessing\" (click)=\"onCancel()\">{{'Cancel' | translate}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n<ng-template #content let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Delete' | translate}}</h4>\n </div>\n <div class=\"modal-body\">\n <p>{{'This 3D model will be removed from this location.' | translate}}</p>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary rounded-pill\"\n (click)=\"modal.dismiss()\">{{'Cancel' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"modal.close('confirmed')\">{{'Delete' | translate}}</button>\n </div>\n</ng-template>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\n@Component({\n selector: 'lib-carousel',\n templateUrl: './carousel.component.html',\n styleUrls: ['./carousel.component.scss']\n})\nexport class CarouselComponent implements OnInit {\n\n @Input() images;\n\n @Output() currentScan = new EventEmitter<number>();\n\n dataEvent: string;\n\n constructor() { }\n\n ngOnInit(): void {\n this.currentScan.emit(0);\n }\n\n onSlide(event) {\n this.dataEvent = JSON.stringify(event);\n const imageIndex = Number.parseInt(\n event.current.replace(\"slideId_\", \"\"),\n 10,\n );\n this.currentScan.emit(imageIndex);\n }\n\n}\n","<ngb-carousel [interval]=\"5000\" *ngIf=\"images && images.length > 1\" (slide)=\"onSlide($event)\">\n <ng-template *ngFor=\"let image of images; let i = index\" ngbSlide [id]=\"'slideId_' + i\">\n <div class=\"picsum-img-wrapper\">\n <img [src]=\"image.path\" alt=\"Scan\" class=\"d-block w-100\">\n </div>\n <div class=\"carousel-caption\">\n <h3>{{image.title}}</h3>\n <p>{{image.description}}</p>\n </div>\n </ng-template>\n</ngb-carousel>\n\n<img *ngIf=\"images.length === 1\" [src]=\"images[0].path\" alt=\"Scan\" class=\"d-block w-100\">\n","export type Rectangle = {\n top: number;\n left: number;\n width: number;\n height: number;\n};\n\nexport enum SweepState {\n ADDED,\n REMOVED,\n DISABLED,\n OCCUPIED,\n STARTPOINT\n}\n\nexport function isInPolygon(p: { x: any; y: any; }, polygon: string | any[]): boolean {\n\n let isInside = false;\n let minX = polygon[0].x;\n let maxX = polygon[0].x;\n let minY = polygon[0].y;\n let maxY = polygon[0].y;\n for (let n = 1; n < polygon.length; n++) {\n const q = polygon[n];\n minX = Math.min(q.x, minX);\n maxX = Math.max(q.x, maxX);\n minY = Math.min(q.y, minY);\n maxY = Math.max(q.y, maxY);\n }\n\n if (p.x < minX || p.x > maxX || p.y < minY || p.y > maxY) {\n return false;\n }\n\n for (\n let index = 0, index_ = polygon.length - 1;\n index < polygon.length;\n index_ = index++\n ) {\n if (\n polygon[index].y > p.y !== polygon[index_].y > p.y &&\n p.x <\n ((polygon[index_].x - polygon[index].x) *\n (p.y - polygon[index].y)) /\n (polygon[index_].y - polygon[index].y) +\n polygon[index].x\n ) {\n isInside = !isInside;\n }\n }\n return isInside;\n}\n\nexport function rotate(point: { x: any; y: any; }, center: { x: any; y: any; }, angle: number) {\n let xM;\n let yM;\n let x;\n let y;\n angle *= Math.PI / 180;\n xM = point.x - center.x;\n yM = point.y - center.y;\n x = xM * Math.cos(angle) + yM * Math.sin(angle) + center.x;\n y = -xM * Math.sin(angle) + yM * Math.cos(angle) + center.y;\n return { x: Math.round(x), y: Math.round(y) };\n}\n\n/**\n * Check if an HtmlElement is inside a selection\n * @param button HTMLElement\n * @param selection\n * @returns true if the element is inside the selection, false otherwise\n */\nexport function buttonIsInSelection(\n button: HTMLButtonElement,\n selection: Rectangle,\n): boolean {\n const bounds = button.getBoundingClientRect();\n return (\n bounds.bottom > selection.top &&\n bounds.top < selection.top + selection.height &&\n bounds.right > selection.left &&\n bounds.left < selection.left + selection.width\n );\n}\n\n/**\n * Styles the button that represents a sweep on the plan: green-added to zone, red -not added, gray - disabled, orange - occupied\n * @param button HTMLButtonElement, button on the plan, \n * @param isAdded boolean, if the sweep added to the zone\n * @param isOccupied boolean, if the sweep added to any other zone (but not current)\n */\nexport function styleButton(button: HTMLButtonElement, state: SweepState) {\n switch (state) {\n case SweepState.ADDED:\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\n break;\n case SweepState.DISABLED:\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=black&height=17&width=17\")`;\n button.style.cursor = \"auto\";\n break;\n case SweepState.OCCUPIED:\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`;\n break;\n case SweepState.STARTPOINT:\n button.style.backgroundImage = `url('https://api.iconify.design/ic/baseline-flag-circle.svg?color=white&width=17&height=17')`;\n break;\n case SweepState.REMOVED:\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\n break;\n default:\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\n break;\n }\n // if (disabled) {\n // button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=#636363&height=17&width=17\")`;\n // button.style.cursor = \"auto\";\n // } else if (isOccupied) {\n // button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`;\n // } else {\n // button.style.backgroundImage = isAdded\n // ? `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`\n // : `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\n // }\n button.style.backgroundColor = \"transparent\";\n button.style.position = \"absolute\";\n button.style.border = \"none\";\n button.style.width = \"17px\";\n button.style.height = \"17px\";\n button.disabled = false;\n button.type = \"button\";\n}\n\n/**\n * Check if sweep (button) is chosen; it is reprsented by image style \"mdi:adjust\"\n * @param button HTMLElement\n * @returns boolean, if button was selected\n */\nexport function buttonIsChosen(button: HTMLElement): boolean {\n return button.style.backgroundImage.includes(\"adjust\");\n}\n\n/**\n * Visually change the state of a scan button, a selected button is blue\n * @param button HTMLElement\n * @param selected if true the button will be blue, otherwise it will red or green\n */\nexport function setVisuallySelected(button: HTMLElement, selected: boolean) {\n if (selected) {\n /** Color in blue */\n button.style.backgroundImage = button.style.backgroundImage\n .replace(\"red\", \"blue\")\n .replace(\"green\", \"blue\");\n } else {\n /** Get back in red or green */\n const color = buttonIsChosen(button) ? \"green\" : \"red\";\n button.style.backgroundImage = button.style.backgroundImage.replace(\n \"blue\",\n color,\n );\n }\n}","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport { Rectangle } from '../../../../helper.service';\n\n@Component({\n selector: 'lib-selection',\n templateUrl: './selection.component.html',\n styleUrls: ['./selection.component.scss']\n})\nexport class SelectionComponent implements OnInit {\n constructor(){}\n\n /**Emit a new selection */\n @Output() onSelectionChanged = new EventEmitter<Rectangle>();\n\n /**Zone wich you can use a selection inside, must have the class \".selectZone\" */\n selectionableZone : HTMLElement;\n\n /**HtmlElement use to display the selected zone (blue) */\n selectionElement : HTMLElement;\n\n isMousedown : boolean = false;\n\n selection = {startX: 0, startY: 0, endX: 0, endY: 0};\n\n selectionRectangle : Rectangle = {top : 0, left: 0, width: 0, height: 0};\n\n ngOnInit(): void {\n this.selectionableZone = document.querySelector(\".selectZone\");\n\n this.selectionElement = document.querySelector(\"#selection\");\n\n this.selectionableZone.addEventListener(\"mousedown\",this.mousedown.bind(this));\n\n this.selectionableZone.addEventListener(\"mousemove\",this.mousemove.bind(this));\n\n this.selectionableZone.addEventListener(\"mouseup\",this.mouseup.bind(this));\n }\n \n /**\n * Update the current selection\n * Will update the selectionRectangle and Selection HTML element\n * @param shouldEmit if true an event will be emitted through onSelectionChanged (true by default)\n */\n updateSelectionElement(shouldEmit=true){\n this.selectionRectangle.width = Math.abs(this.selection.endX - this.selection.startX);\n this.selectionRectangle.height = Math.abs(this.selection.endY - this.selection.startY);\n this.selectionRectangle.top = Math.min(this.selection.endY, this.selection.startY);\n this.selectionRectangle.left = Math.min(this.selection.endX, this.selection.startX);\n\n this.selectionElement.style.top = `${this.selectionRectangle.top}px`;\n this.selectionElement.style.left = `${this.selectionRectangle.left}px`;\n this.selectionElement.style.width = `${this.selectionRectangle.width}px`;\n this.selectionElement.style.height = `${this.selectionRectangle.height}px`;\n\n if(shouldEmit){\n this.onSelectionChanged.emit(this.selectionRectangle);\n }\n }\n\n /**\n * Trigger when mouse is press down on selectionableZone\n * @param event \n */\n mousedown(event : MouseEvent){\n if(event.button !== 2){ /**Selection with the right click, so ignore all other event */\n return;\n }\n this.isMousedown = true;\n this.selection = {startY : event.clientY, startX : event.clientX, endX:event.clientX, endY:event.clientY};\n this.updateSelectionElement(); \n }\n\n /**\n * Trigger when mouse is release on selectionableZone\n * @param event \n */\n mouseup(event : MouseEvent){\n this.isMousedown = false;\n this.selection = {startX :0, startY : 0, endX:0, endY:0};\n this.updateSelectionElement(false); \n }\n\n /**\n * Trigger when mouse is moving on selectionableZone\n * @param event \n */\n mousemove(event : MouseEvent){\n if(this.isMousedown){\n this.selection.endX = event.clientX;\n this.selection.endY = event.clientY;\n this.updateSelectionElement();\n }\n }\n\n}\n","<ng-content></ng-content>\n\n<div id=\"selection\"></div>","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\n@Component({\n selector: 'lib-radio-button',\n templateUrl: './radio-button.component.html',\n styleUrls: ['./radio-button.component.scss']\n})\nexport class RadioButtonComponent implements OnInit {\n\n @Input() label: string;\n\n @Output() isCheckedEvent = new EventEmitter<boolean>();\n\n isChecked: boolean;\n\n constructor() { }\n\n ngOnInit(): void {\n this.isChecked = false;\n }\n\n onChecked() {\n this.isCheckedEvent.emit(this.isChecked);\n }\n\n}\n","<div class=\"checkboxContainer\">\n <div class=\"switchContainer\">\n <label class=\"switch switch-success\">\n <input type=\"checkbox\" [(ngModel)]=\"isChecked\" (change)=\"onChecked()\">\n <span class=\"slider round\"></span>\n </label>\n </div>\n <span class=\"label right\">{{label | translate}}</span>\n</div>","import { Component, OnInit, Input, OnChanges } from '@angular/core';\nimport { TranslateService } from \"@ngx-translate/core\";\n\n@Component({\n selector: 'lib-plan-legend',\n templateUrl: './plan-legend.component.html',\n styleUrls: ['./plan-legend.component.scss']\n})\nexport class PlanLegendComponent implements OnInit {\n @Input() isAudioZone?:boolean = false;\n\n buttonsToRender = [];\n\n colorToText = {};\n\n constructor(\n private translate: TranslateService,\n ) {}\n\n async ngOnInit() {\n this.render()\n }\n\n async render() {\n this.buttonsToRender = [\n {\n url: `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`,\n text: this.translate.instant(\"legend.green\")\n },\n {\n url: `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`,\n text: this.translate.instant(\"legend.red\")\n }\n ]\n if (this.isAudioZone) {\n let audioPoints = [{\n url: `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=black&height=17&width=17\")`,\n text: this.translate.instant(\"legend.black\")\n },\n {\n url: `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`,\n text: this.translate.instant(\"legend.orange\")\n }]\n this.buttonsToRender = this.buttonsToRender.concat(audioPoints)\n }\n }\n\n //styleButton(element, SweepState.DISABLED);\n\n}\n","<div class=\"mt-3 ms-3\" class=\"legendContainer\">\n <h5>{{\"legend.title\" | translate}}</h5>\n <div class=\"legendBox\">\n <div class=\"legendRow\" *ngFor=\"let elemnt of buttonsToRender\">\n <button class=\"legendIcon\" [ngStyle] = \"{'background-image': elemnt.url}\"></button>\n <span>{{elemnt.text}}</span>\n </div>\n </div>\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { getCoefficientsForImage, getMetaForImage, Navigation, NavigationService, Plan, Zone, showScanPointsOnPlanInDiv, ZoneService, PlanService } from '@smarterplan/ngx-smarterplan-core';\nimport panzoom, { PanZoom } from 'panzoom';\nimport { buttonIsInSelection, isInPolygon, Rectangle, rotate, setVisuallySelected, styleButton, SweepState } from '../../../../helper.service';\n\n@Component({\n selector: 'lib-sweep-plan-selection',\n templateUrl: './sweep-plan-selection.component.html',\n styleUrls: ['./sweep-plan-selection.component.scss']\n})\nexport class SweepPlanSelectionComponent implements OnInit {\n\n plans: Plan[];\n\n @Input() spaceID: string;\n\n @Input() chosenScansOnPlan: string[] = [];\n\n /** if comming from Edit Plan SVG Zone creation */\n @Input() newZoneData: any;\n\n navIDsZoneEdit: string[] = [];\n\n // sweeps belonging to any audio zone\n @Input() occupiedSweeps: string[] = [];\n\n // sweeps unavailable (cannot be chosen)\n @Input() unavailableSweeps: string[] = [];\n\n // if choosing sweeps for audio zone\n @Input() editingAudioZone: boolean = false;\n\n @Input() inputZone: Zone;\n\n @Input() multipleFloors: boolean = false;\n\n chosenPlan: Plan;\n\n /** panZoom element for adding scans */\n panZoom: PanZoom;\n\n /** divPlan (use By panZoom) */\n divPlan: HTMLElement;\n\n /** all scan buttons Element */\n buttonElements: HTMLButtonElement[] = [];\n\n /** Scan buttons that are in the current selection */\n buttonsInSelection: HTMLButtonElement[] = [];\n\n @Output() sweepsSelected = new EventEmitter<{ sweeps: string[]; startSweepID: string; }>();\n\n isSettingStartSweep = false;\n\n startSweepID: string;\n\n chosenSweepsPerFloor = new Map<string, string[]>(); // map matching floorID to sweeps selected\n\n inputSweepsPerFloor = new Map<string, string[]>(); // map matching floorID to sweeps selected for zone in edition\n\n selectionChanged = false;\n\n constructor(\n private zoneService: ZoneService,\n private navigationService: NavigationService,\n private planService: PlanService,\n private translate: TranslateService,\n ) { }\n\n async ngOnInit() {\n await this.getPlans();\n this.setSweepsOfInputZone();\n }\n\n ngOnChanges() {\n if (this.chosenPlan) {\n this.setSweepsOfInputZone();\n this.chosenScansOnPlan = [];\n this.clearDivPlan();\n this.addScanPoints();\n }\n }\n\n setSweepsOfInputZone() {\n this.navIDsZoneEdit = this.inputZone ? this.inputZone.sweepIDs : [];\n if (this.multipleFloors) {\n this.plans.forEach((plan) => {\n if (!this.inputSweepsPerFloor.get(plan.zoneID)) {\n this.inputSweepsPerFloor.set(plan.zoneID,\n this.navIDsZoneEdit.filter((sweep) => plan.zone.sweepIDs.includes(sweep)));\n }\n });\n } else {\n if (this.inputZone) {\n //filter plans only for the parent Zone\n this.plans = this.plans.filter((p) => p.zoneID === this.inputZone.parentID);\n }\n }\n }\n\n async getPlans() {\n this.plans = await this.planService.getSingedPlansForSpace(\n this.spaceID,\n );\n }\n\n async onPlanClick(plan: Plan) {\n const switchPlan = () => {\n this.selectionChanged = false;\n this.chosenPlan = plan;\n this.chosenScansOnPlan = [];\n this.clearDivPlan();\n this.addScanPoints();\n };\n if (this.selectionChanged) {\n const message = this.translate.instant(\"confirm.cancelModifZoneSweeps\");\n if (window.confirm(message)) {\n switchPlan();\n }\n } else {\n switchPlan();\n }\n }\n\n async addScanPoints() {\n let wasModified = false;\n if (this.multipleFloors) {\n // check if we have already validated buttons for this floor\n if (this.chosenSweepsPerFloor.get(this.chosenPlan.zoneID)) {\n this.chosenScansOnPlan = this.chosenSweepsPerFloor.get(this.chosenPlan.zoneID);\n wasModified = true;\n }\n }\n this.divPlan = document.querySelector(\"#planDiv\") as HTMLElement;\n const zoneOfPlan = await this.zoneService.getZone(\n this.chosenPlan.zoneID,\n );\n const navigations = await this.navigationService.getNavigationsForZone(\n zoneOfPlan,\n );\n if (this.newZoneData) await this.setScanByDraw(navigations);\n this.buttonElements = await showScanPointsOnPlanInDiv(\n this.chosenPlan,\n this.divPlan,\n navigations,\n );\n for (const element of this.buttonElements) {\n if (this.unavailableSweeps && this.unavailableSweeps.includes(element.id)) {\n styleButton(element, SweepState.DISABLED);\n } else {\n\n if (wasModified) {\n if (this.chosenScansOnPlan.includes(element.id)) {\n styleButton(element, SweepState.ADDED);\n } else {\n styleButton(element, SweepState.REMOVED);\n }\n } else {\n if (\n this.navIDsZoneEdit.length > 0 &&\n this.navIDsZoneEdit.includes(element.id)) {\n styleButton(element, SweepState.ADDED);\n if (!this.chosenScansOnPlan.includes(element.id)) {\n this.chosenScansOnPlan.push(element.id);\n }\n } else if (this.occupiedSweeps && this.occupiedSweeps.includes(element.id)) {\n styleButton(element, SweepState.OCCUPIED);\n } else {\n styleButton(element, SweepState.REMOVED);\n }\n }\n\n //start point should be last condition \n if (this.inputZone && this.inputZone.startSweepID === element.id) {\n console.log(\"setting start point\");\n styleButton(element, SweepState.STARTPOINT);\n }\n element.addEventListener(\"click\", (event) =>\n this.onButtonScanClicked(event.target as HTMLElement),\n );\n }\n }\n this.panZoom = panzoom(this.divPlan, {\n bounds: true,\n boundsPadding: 0,\n maxZoom: 3.5,\n beforeMouseDown(e: MouseEvent) {\n return (\n e.button === 2\n ); /** Ignore event for right click (use for selecting) */\n },\n });\n if (this.multipleFloors) {\n this.chosenSweepsPerFloor.set(this.chosenPlan.zoneID, [...this.chosenScansOnPlan]);\n }\n }\n\n /** Function if we are coming for svg editor workflow */\n setScanByDraw(navigations: any[]): Promise<void> {\n return new Promise(async (resolve) => {\n const rect = {\n width: this.newZoneData.width,\n height: this.newZoneData.height,\n };\n const img = await getMetaForImage(this.chosenPlan.filepath);\n const { coeffX, coeffY } = getCoefficientsForImage(img, rect);\n\n const draw = this.newZoneData.elements;\n\n draw.map(async (element: any) => {\n switch (element.nodeName) {\n case \"rect\":\n await this.setScanInRect(\n img,\n coeffX,\n coeffY,\n element,\n navigations,\n );\n break;\n\n case \"ellipse\":\n await this.setScanInCircle(\n img,\n coeffX,\n coeffY,\n element,\n navigations,\n );\n break;\n\n case \"path\":\n await this.setScanInPolygon(\n img,\n coeffX,\n coeffY,\n element,\n navigations,\n );\n break;\n default:\n break;\n }\n });\n\n resolve();\n });\n }\n\n async setScanInRect(img: any, coeffX: number, coeffY: number,\n element: { angle: any; cx: any; cy: any; x: number; width: any; y: number; height: any; }, navigations: any[]) {\n const calibrage = JSON.parse(this.chosenPlan.calibration);\n navigations.map((navigation) => {\n const positionsOnPlan = navigation.positionOnPlan.map((entry) =>\n JSON.parse(entry),\n );\n const positionOnPlan = positionsOnPlan.find(\n (data) => data.planID === this.chosenPlan.id,\n );\n if (positionOnPlan) {\n const realWidth = img.width / coeffX;\n const realHeight = img.height / coeffY;\n const navY = (positionOnPlan.y * realHeight) / calibrage.imgHeight;\n const navX = (positionOnPlan.x * realWidth) / calibrage.imgWidth;\n if (\n navX > element.x &&\n navX < element.x + element.width &&\n navY > element.y &&\n navY < element.y + element.height &&\n !this.navIDsZoneEdit.includes(navigation.id)\n ) {\n this.navIDsZoneEdit.push(navigation.id);\n }\n }\n\n // old calibration:\n // const position = JSON.parse(navigation.position);\n // let navX = (calibrage.offsetX + position.x * calibrage.x) / coeffX;\n // let navY = (calibrage.offsetY + position.z * calibrage.y) / coeffY;\n // if (element.angle) {\n // const rotatePos = rotate(\n // { x: navX, y: navY },\n // { x: element.cx, y: element.cy },\n // element.angle,\n // );\n // navX = rotatePos.x;\n // navY = rotatePos.y;\n // }\n /**\n * TODO calculer la rotation du rectangle\n */\n // if (\n // navX > element.x &&\n // navX < element.x + element.width &&\n // navY > element.y &&\n // navY < element.y + element.height &&\n // !this.navIDsZoneEdit.includes(navigation.id)\n // ) {\n // this.navIDsZoneEdit.push(navigation.id);\n // }\n });\n } // EO\n\n async setScanInCircle(img: any, coeffX: number, coeffY: number,\n element: { angle: any; cx: number; cy: number; rx: number; ry: number; }, navigations: Navigation[]) {\n const calibrage = JSON.parse(this.chosenPlan.calibration);\n navigations.map(navigation => {\n const positionsOnPlan = navigation.positionOnPlan.map((entry) =>\n JSON.parse(entry),\n );\n const positionOnPlan = positionsOnPlan.find(\n (data) => data.planID === this.chosenPlan.id,\n );\n if (positionOnPlan) {\n const realWidth = img.width / coeffX;\n const realHeight = img.height / coeffY;\n let navY = (positionOnPlan.y * realHeight) / calibrage.imgHeight;\n let navX = (positionOnPlan.x * realWidth) / calibrage.imgWidth;\n if (element.angle) {\n const rotatePos = rotate(\n { x: navX, y: navY },\n { x: element.cx, y: element.cy },\n element.angle,\n );\n navX = rotatePos.x;\n navY = rotatePos.y;\n }\n\n const valueX =\n Math.pow(navX - element.cx, 2) / Math.pow(element.rx, 2);\n const valueY =\n Math.pow(navY - element.cy, 2) / Math.pow(element.ry, 2);\n const result = valueX + valueY;\n if (result <= 1 && !this.navIDsZoneEdit.includes(navigation.id)) {\n this.navIDsZoneEdit.push(navigation.id);\n }\n }\n\n // old calibration\n // const position = JSON.parse(navigation.position);\n // let navX = (calibrage.offsetX + position.x * calibrage.x) / coeffX;\n // let navY = (calibrage.offsetY + position.z * calibrage.y) / coeffY;\n // if (element.angle) {\n // const rotatePos = rotate(\n // { x: navX, y: navY },\n // { x: element.cx, y: element.cy },\n // element.angle,\n // );\n // navX = rotatePos.x;\n // navY = rotatePos.y;\n // }\n\n // const valueX =\n // Math.pow(navX - element.cx, 2) / Math.pow(element.rx, 2);\n // const valueY =\n // Math.pow(navY - element.cy, 2) / Math.pow(element.ry, 2);\n // const result = valueX + valueY;\n // if (result <= 1 && !this.navIDsZoneEdit.includes(navigation.id)) {\n // this.navIDsZoneEdit.push(navigation.id);\n // }\n });\n } // EO\n\n async setScanInPolygon(img: any, coeffX: number, coeffY: number, element: { segList: any; }, navigations: any[]) {\n const calibrage = JSON.parse(this.chosenPlan.calibration);\n navigations.map(async (navigation) => {\n\n const positionsOnPlan = navigation.positionOnPlan.map((entry) =>\n JSON.parse(entry),\n );\n const positionOnPlan = positionsOnPlan.find(\n (data) => data.planID === this.chosenPlan.id,\n );\n if (positionOnPlan) {\n const realWidth = img.width / coeffX;\n const realHeight = img.height / coeffY;\n let navY = (positionOnPlan.y * realHeight) / calibrage.imgHeight;\n let navX = (positionOnPlan.x * realWidth) / calibrage.imgWidth;\n\n const p = {\n x: navX,\n y: navY,\n };\n if (\n isInPolygon(p, element.segList) &&\n !this.navIDsZoneEdit.includes(navigation.id)\n ) {\n this.navIDsZoneEdit.push(navigation.id);\n }\n }\n\n // old calibration\n // const position = JSON.parse(navigation.position);\n // const p = {\n // x: (calibrage.offsetX + position.x * calibrage.x) / coeffX,\n // y: (calibrage.offsetY + position.z * calibrage.y) / coeffY,\n // };\n // if (element.angle) {\n // p = this.rotate(\n // p,\n // { x: element.cx, y: element.cy },\n // element.angle,\n // );\n // }\n // if (\n // isInPolygon(p, element.segList) &&\n // !this.navIDsZoneEdit.includes(navigation.id)\n // ) {\n // this.navIDsZoneEdit.push(navigation.id);\n // }\n });\n }\n\n clearDivPlan() {\n if (this.divPlan) this.divPlan.innerHTML = \"\";\n }\n\n\n /**\n * Trigger each by the selectionComponent when selection change\n * Update the current selected scan buttons\n * @param selection new selection\n */\n onSelectionChanged(selection: Rectangle) {\n const unselectedButtons: HTMLButtonElement[] = [];\n const newSelectedButtons = [];\n\n /** For each button, decide whether will be add to selected list or unselected list */\n for (const button of this.buttonElements) {\n const isSelected = buttonIsInSelection(button, selection);\n if (this.buttonsInSelection.includes(button)) {\n /** If the button is already in the selected list, we check if it should be unselect */\n if (!isSelected) {\n unselectedButtons.push(button);\n }\n } else if (isSelected) {\n newSelectedButtons.push(button);\n }\n }\n\n /** Visually Update unselected list */\n for (const button of unselectedButtons) {\n setVisuallySelected(button, false);\n }\n\n /** Visually Update selected list */\n for (const button of newSelectedButtons) {\n setVisuallySelected(button, true);\n }\n\n /** Remove unselected list */\n this.buttonsInSelection = this.buttonsInSelection.filter((button) => {\n return !unselectedButtons.includes(button);\n });\n /** Add new selected buttons */\n this.buttonsInSelection = [\n ...this.buttonsInSelection,\n ...newSelectedButtons,\n ];\n }\n\n\n\n /**\n * Trigger when the user click to add the selected scans\n */\n onSelectionAdd() {\n for (const button of this.buttonsInSelection) {\n if (!this.chosenScansOnPlan.includes(button.id)) {\n this.onButtonScanClicked(button);\n }\n }\n\n this.onSelectionChanged({ top: 0, left: 0, width: 0, height: 0 });\n }\n\n /**\n * Trigger when the user click to remove the selected scans\n */\n onSelectionRemove() {\n for (const button of this.buttonsInSelection) {\n if (this.chosenScansOnPlan.includes(button.id)) {\n this.onButtonScanClicked(button);\n }\n }\n this.onSelectionChanged({ top: 0, left: 0, width: 0, height: 0 });\n }\n\n /**\n * Trigger when the user click to select all scans\n */\n onSelectAll() {\n this.buttonsInSelection = [...this.buttonElements];\n for (const button of this.buttonsInSelection) {\n setVisuallySelected(button, true);\n }\n }\n\n /**\n * Trigger when the user change the size of the scan points\n * @param event\n */\n onChangeScanSize(event: any) {\n const factor = event.target.value;\n\n for (const button of this.buttonElements) {\n button.style.transform = `scale(${factor})`;\n }\n }\n\n /**\n * When a button representing a scan is clicked\n * @param button\n */\n onButtonScanClicked(button: HTMLElement) {\n this.selectionChanged = true;\n if (this.isSettingStartSweep) {\n if (this.startSweepID === button.id) {\n // we deselect the starting point\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\n this.startSweepID = null;\n return;\n }\n button.style.backgroundImage = `url('https://api.iconify.design/ic/baseline-flag-circle.svg?color=white&width=17&height=17')`;\n if (!this.chosenScansOnPlan.includes(button.id)) {\n this.chosenScansOnPlan.push(button.id);\n }\n if (this.startSweepID) {\n // we are changing start sweep\n const btnChanged = this.buttonElements.find((btn) => btn.id === this.startSweepID);\n btnChanged.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\n }\n this.startSweepID = button.id;\n return;\n }\n if (!this.chosenScansOnPlan.includes(button.id)) {\n // add to selection\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\n this.chosenScansOnPlan.push(button.id);\n } else {\n // remove from selection\n if (this.occupiedSweeps.includes(button.id) && !this.navIDsZoneEdit.includes(button.id)) {\n // the sweep belongs to another zone => set orange\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`;\n } else {\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\n }\n const index = this.chosenScansOnPlan.indexOf(button.id);\n this.chosenScansOnPlan.splice(index, 1);\n }\n }\n\n onSaveSelection() {\n if (this.multipleFloors) {\n // rassemble all sweeps per floors\n let finalSweeps = [];\n Array.from(this.inputSweepsPerFloor.keys()).forEach(floorID => {\n if (this.chosenSweepsPerFloor.get(floorID)) {\n // the sweeps for this floor were modified, we take them\n finalSweeps = [...finalSweeps, ...this.chosenSweepsPerFloor.get(floorID)];\n } else {\n // was not modified, we take the previous values\n finalSweeps = [...finalSweeps, ...this.inputSweepsPerFloor.get(floorID)];\n }\n });\n // console.log(\"final sweeps\", finalSweeps);\n this.sweepsSelected.emit({ \"sweeps\": finalSweeps, \"startSweepID\": this.startSweepID });\n } else {\n this.sweepsSelected.emit({ \"sweeps\": this.chosenScansOnPlan, \"startSweepID\": this.startSweepID });\n }\n }\n\n onCancel() {\n if (this.selectionChanged) {\n const message = this.translate.instant(\"confirm.cancelModifZoneSweeps\");\n if (window.confirm(message)) {\n this.sweepsSelected.emit(null);\n }\n } else {\n this.sweepsSelected.emit(null);\n }\n }\n\n /**\n * Adds current selection of sweeps for current floor (plan) for multifloor zone.\n * It has to be saved anyway with onSaveSelection!\n */\n onValidateForFloor() {\n if (this.multipleFloors) {\n this.chosenSweepsPerFloor.set(this.chosenPlan.zoneID, [...this.chosenScansOnPlan]);\n this.selectionChanged = false;\n }\n }\n}\n","<div ngbDropdown class=\"sp-row d-inline-block\">\n <div class=\"col-sm-3\" *ngIf=\"plans\">\n <button type=\"button\" class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\"\n ngbDropdownToggle>{{chosenPlan ?\n chosenPlan.name : ('Choose Plan' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button type=\"button\" ngbDropdownItem *ngFor=\"let plan of plans\" (click)=\"onPlanClick(plan)\"\n [disabled]=\"!plan.calibration\">{{ plan.name }}\n </button>\n </div>\n </div>\n</div>\n<div class=\"sp-row\">\n <lib-selection class=\"col-md-8\" (onSelectionChanged)=\"onSelectionChanged($event)\">\n <lib-plan-legend [isAudioZone]=\"editingAudioZone\" *ngIf=\"buttonElements.length > 0\"></lib-plan-legend>\n <div class=\"selectZone\" oncontextmenu=\"return false;\">\n <div class=\"sp-row\">\n <div style=\"overflow: hidden;width:100%;\">\n <div style=\"height: 400px; width: 100%;\" id=\"planDiv\">\n </div>\n </div>\n </div>\n </div>\n </lib-selection>\n \n <div class=\"col-md-4 scanTool\" *ngIf=\"buttonElements.length > 0\">\n <div class=\"sp-row d-inline-block\">\n <h2>{{'selectTool.title' | translate}}</h2>\n <div class=\"protip\">{{'selectTool.tip' | translate}}.</div>\n </div>\n \n <div class=\"sp-row\">\n <div class=\"col-3\" style=\"padding:0px\">\n <label class=\"tool-label\" for=\"scanSize\">{{'selectTool.size' | translate}}</label>\n </div>\n <div class=\"col-9\">\n <input type=\"range\" class=\"form-range\" min=\"0.001\" max=\"5\" step=\"0.01\" value=\"1\"\n id=\"scanSize\" (input)=\"onChangeScanSize($event)\">\n </div>\n </div>\n \n <div class=\"sp-row\">\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onSelectAll()\">{{'selectTool.selectAll' | translate}}</button>\n </div>\n \n <div *ngIf=\"buttonsInSelection.length > 0\" class=\"edit-selected\">\n <span class=\"tool-label\">{{'selectTool.edit' | translate}} : </span>\n <div class=\"sp-row\">\n <button class=\"btn rounded-pill btn-primary ms-3 me-2\" (click)=\"onSelectionAdd()\">{{'selectTool.add' | translate}}</button>\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onSelectionRemove()\">{{'selectTool.undo' | translate}}</button>\n </div>\n </div>\n\n <div class=\"sp-row\">\n <div *ngIf=\"multipleFloors\"> \n {{ chosenSweepsPerFloor.get(chosenPlan.zoneID) ? chosenSweepsPerFloor.get(chosenPlan.zoneID).length : \"0\"}} {{'scan points selected on this floor' | translate}} \n <button class=\"btn btn-primary rounded-pill\" (click)=\"onValidateForFloor()\" [disabled]=\"!selectionChanged\">{{'Update selection for this floor' | translate}}</button>\n </div>\n <div *ngIf=\"!multipleFloors\">\n {{ chosenScansOnPlan.length }} {{'scan points chosen' | translate}} \n </div>\n </div>\n <div *ngIf=\"!editingAudioZone\" class=\"sp-row\">\n <lib-radio-button label=\"{{ 'selectTool.chooseStartPoint' | translate }}\" (isCheckedEvent)=\"isSettingStartSweep=!isSettingStartSweep\"></lib-radio-button>\n </div>\n <div class=\"sp-row\">\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onSaveSelection()\">{{'selectTool.saveSelection' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'selectTool.cancelSelection' | translate}}</button>\n </div>\n </div>\n\n</div>\n \n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport {\n UntypedFormGroup,\n UntypedFormBuilder,\n Validators,\n AbstractControl,\n ValidatorFn,\n ValidationErrors,\n} from '@angular/forms';\nimport {\n Zone,\n Plan,\n Layer,\n ZoneService,\n LayerService,\n BaseUserService,\n NavigationService,\n} from '@smarterplan/ngx-smarterplan-core';\n@Component({\n selector: 'lib-add-zone',\n templateUrl: './add-zone.component.html',\n styleUrls: ['./add-zone.component.scss'],\n})\nexport class AddZoneComponent implements OnInit {\n @Input() zoneEdit: Zone;\n\n @Input() spaceID: string;\n\n @Input() images360: { path: string; filename: string }[];\n\n @Input() navigationIDs: string[];\n\n @Input() zones: Zone[];\n\n @Input() newZoneDataFromEditor: any;\n\n @Output() updatedZone = new EventEmitter<any>();\n\n @Input() chosenPlan: Plan;\n\n @Input() isMuseumVisit: boolean = false;\n\n @Input() defaultZone: Zone;\n\n parentZones: Zone[] = [];\n\n carouselIsVisible = false;\n\n zoneForm: UntypedFormGroup;\n\n isSubmitted = false;\n\n currentScanShowing: number;\n\n chosenScans: number[] = [];\n\n layers: Layer[];\n\n fromPlan: boolean = false;\n\n chosenScansOnPlan: string[] = [];\n\n currentOrgId: string;\n\n zoneInitialNavCount = 0;\n\n zoneIsMatterportFloor = false;\n\n multipleFloors = false;\n\n constructor(\n private fb: UntypedFormBuilder,\n private zoneService: ZoneService,\n private layerService: LayerService,\n private userService: BaseUserService,\n private navigationService: NavigationService\n ) { }\n\n async ngOnInit() {\n this.parentZones = this.zones.filter(\n (zone) => zone.layer && zone.layer.name === 'FLOOR'\n );\n if (!this.defaultZone) {\n this.defaultZone = this.getDefaultZone();\n }\n this.parentZones.unshift(this.defaultZone);\n await this.updateLayers();\n this.initZoneForm();\n }\n\n async updateLayers() {\n this.currentOrgId = this.userService.currentOrganisation(this.spaceID).id;\n const layers = await this.layerService.getLayerForOrganisation(\n this.currentOrgId\n );\n // filter out layers created by the system\n this.layers = layers.filter(\n (l) => l.name !== 'BUILDING' && l.name !== 'FLOOR'\n );\n }\n\n async initZoneForm() {\n if (this.zoneEdit) {\n if (this.zoneEdit.metadata) {\n const metadata = JSON.parse(this.zoneEdit.metadata);\n this.zoneIsMatterportFloor = metadata.hasOwnProperty(\n 'matterportFloorSequence'\n );\n }\n const isVirtual = this.zoneService.zoneIsVirtual(this.zoneEdit);\n if (!isVirtual) {\n await this.loadNavigations();\n }\n this.isMuseumVisit = this.zoneEdit.isMuseumVisitZone === true;\n this.multipleFloors = this.zoneEdit.isMultipleFloorZone === true;\n this.zoneForm = this.fb.group({\n id: this.zoneEdit.id,\n name: [this.zoneEdit.name, [Validators.required]],\n code_ref: this.zoneEdit.code_ref ? this.zoneEdit.code_ref : null,\n layerID: this.zoneEdit.layer ? this.zoneEdit.layer.id : null,\n surface: this.zoneEdit.surface ? this.zoneEdit.surface : 0,\n parentID: this.zoneEdit.parentID,\n parent: { value: this.zoneEdit.parent.name, disabled: true },\n newLayer: [null, [this.layerNameValidator()]],\n isMuseumVisitZone: this.isMuseumVisit,\n startSweepID: this.zoneEdit.startSweepID,\n });\n this.onChangeMultipleFloors();\n } else {\n this.zoneForm = this.fb.group({\n name: [\n this.newZoneDataFromEditor ? this.newZoneDataFromEditor.name : '',\n [Validators.required],\n ],\n code_ref: null,\n layerID: null,\n surface: 0,\n parentID: this.defaultZone.id,\n newLayer: [null, [this.layerNameValidator()]],\n isMuseumVisitZone: this.isMuseumVisit,\n startSweepID: null,\n });\n }\n }\n\n async onSubmitZone() {\n this.isSubmitted = true;\n if (!this.zoneForm.valid) {\n return;\n }\n const formValue = this.zoneForm.getRawValue(); //because we need values of disables controls as well\n if (formValue.newLayer) {\n await this.createLayer(formValue.newLayer).then((layer) => {\n formValue.layerID = layer.id;\n });\n }\n\n const zoneInput = {\n name: formValue.name,\n surface: Math.round(formValue.surface * 100) / 100,\n spaceID: this.spaceID,\n layerID: formValue.layerID,\n parentID: formValue.parentID,\n isMuseumVisitZone: this.isMuseumVisit,\n isMultipleFloorZone: this.multipleFloors,\n sweepIDs: [],\n startSweepID: formValue.startSweepID,\n } as Zone;\n\n if (formValue.code_ref) {\n zoneInput.code_ref = formValue.code_ref;\n }\n\n try {\n this.zoneForm = null;\n this.isSubmitted = false;\n if (this.zoneEdit) {\n const zoneUpdate = zoneInput;\n zoneUpdate.sweepIDs = this.zoneEdit.sweepIDs;\n zoneUpdate.id = formValue.id;\n await this.setSweepsAndNodeForZoneInput(zoneUpdate);\n await this.zoneService.updateZone(zoneUpdate);\n this.zoneEdit = null;\n this.updatedZone.emit(zoneUpdate.id);\n } else {\n await this.setSweepsAndNodeForZoneInput(zoneInput);\n if (!zoneInput.parentID) {\n // set building as parent\n zoneInput.parentID = this.defaultZone.id;\n }\n await this.zoneService.create(zoneInput).then((zoneCreated) => {\n this.updatedZone.emit(zoneCreated.id);\n });\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n onCancel() {\n this.isSubmitted = false;\n this.zoneForm = null;\n this.chosenScansOnPlan = [];\n this.chosenScans = [];\n this.updatedZone.emit(false);\n }\n\n get name(): AbstractControl {\n return this.zoneForm.get('name');\n }\n\n get newLayer(): AbstractControl {\n return this.zoneForm.get('newLayer');\n }\n\n toggleCarousel() {\n this.carouselIsVisible = true;\n this.chosenScansOnPlan = [];\n }\n\n togglePlan() {\n this.fromPlan = true;\n this.chosenScans = [];\n }\n\n onAddScan() {\n if (!this.chosenScans.includes(this.currentScanShowing)) {\n // console.log(\"adding scan\", this.currentScanShowing);\n this.chosenScans.push(this.currentScanShowing);\n } else {\n alert('Scan already added!');\n }\n }\n\n onRemoveScanImage(scan: any) {\n const index = this.chosenScans.indexOf(scan);\n this.chosenScans.splice(index, 1);\n }\n\n onRemoveScanPlan(scan: any) {\n const index = this.chosenScansOnPlan.indexOf(scan);\n this.chosenScansOnPlan.splice(index, 1);\n }\n\n async setSweepsAndNodeForZoneInput(zoneInput: Zone) {\n if (\n this.chosenScans.length > 0 &&\n this.chosenScans.length !== this.zoneInitialNavCount &&\n !this.fromPlan\n ) {\n // if we chose scans from the carousel\n const sweepIDs: string[] = [];\n this.chosenScans.map(async (scan) => {\n const imageUuid = this.images360[scan].filename.split('_')[0];\n const sweepID = this.navigationIDs.find((nav) => {\n return nav.includes(imageUuid);\n });\n if (sweepID) {\n sweepIDs.push(sweepID);\n }\n });\n zoneInput.sweepIDs = sweepIDs;\n } else {\n // we are not coming from gallery choice\n if (this.chosenScansOnPlan.length > 0) {\n zoneInput.sweepIDs = this.chosenScansOnPlan;\n }\n }\n\n if (zoneInput.sweepIDs && zoneInput.sweepIDs.length > 0) {\n const navForSweep =\n await this.navigationService.getNavigationsForMatterportIDForSpace(\n zoneInput.sweepIDs[0],\n this.spaceID\n );\n zoneInput.nodeIDs = [navForSweep[0].nodeID];\n }\n }\n\n async createLayer(name: string): Promise<Layer> {\n return this.layerService.createLayerForOrganisation(\n name,\n this.currentOrgId\n );\n }\n\n async loadNavigations(): Promise<any> {\n if (this.zoneEdit.sweepIDs.length > 0) {\n this.zoneInitialNavCount = this.zoneEdit.sweepIDs.length;\n const navList: number[] = [];\n const scansZoneEdit: string[] = [];\n await Promise.all(\n this.zoneEdit.sweepIDs.map(async (sweepID: string) => {\n scansZoneEdit.push(sweepID);\n const index = this.images360.findIndex((im) => {\n return im.filename.includes(sweepID.slice(0, 8));\n });\n if (index !== -1) {\n navList.push(index);\n }\n })\n );\n this.chosenScans = navList;\n this.chosenScansOnPlan = scansZoneEdit;\n return Promise.resolve();\n }\n return Promise.resolve();\n }\n\n // iniPlanForDraw() {\n // this.togglePlan();\n // setTimeout(() => {\n // this.onPlanClick();\n // }, 500);\n // }\n\n /**\n * Adds all sweeps of the space\n */\n onAddAll() {\n const defaultZone = this.getDefaultZone();\n if (defaultZone) {\n this.chosenScansOnPlan = defaultZone.sweepIDs;\n this.zoneForm.get('parentID').setValue(defaultZone.id);\n this.zoneForm.get('parentID').disable();\n this.multipleFloors = true;\n }\n }\n\n getDefaultZone(): Zone {\n return this.zones.find(\n (zone) =>\n zone.layer &&\n zone.layer.name === 'BUILDING' &&\n zone.sweepIDs &&\n zone.sweepIDs.length > 0\n );\n }\n /**\n * Multiple floors\n */\n onChangeMultipleFloors() {\n if (this.multipleFloors) {\n const defaultZone = this.getDefaultZone();\n if (defaultZone) {\n this.zoneForm.get('parentID').setValue(defaultZone.id);\n this.zoneForm.get('parentID').disable();\n }\n } else {\n this.zoneForm.get('parentID').enable();\n }\n }\n\n onSelectedSweepsFromPlan(result: { sweeps: string[]; startSweepID: string }) {\n if (result) {\n if (result.sweeps) {\n this.chosenScansOnPlan = result.sweeps;\n }\n if (result.startSweepID) {\n this.zoneForm.controls.startSweepID.setValue(result.startSweepID);\n }\n }\n this.fromPlan = false;\n }\n\n layerNameValidator(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n if (!control.value) {\n return null;\n }\n const forbidden = this.layers\n .map((l) => l.name.toLowerCase())\n .includes(control.value.toLowerCase());\n return forbidden ? { forbiddenName: { value: control.value } } : null;\n };\n }\n}\n","<div class=\"main-container\" *ngIf=\"zoneForm\">\n <div class=\"col-7\">\n <form (ngSubmit)=\"onSubmitZone()\" [formGroup]=\"zoneForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" required formControlName=\"name\">\n <!-- <div class=\"invalid-feedback\">\n {{'A name is required' | translate}}\n </div> -->\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'codeRef' | translate}}</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" formControlName=\"code_ref\">\n </div>\n </div>\n <div class=\"mb-3 row\" *ngIf=\"!isMuseumVisit && !zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{'Type of zone' | translate}}</label>\n <div class=\"col-sm-10\">\n <select class=\"form-control\" formControlName=\"layerID\">\n <option value=\"null\" selected disabled hidden> {{ zoneEdit && zoneEdit.layer ?\n zoneEdit.layer.name : 'Choose type'}}</option>\n <option *ngFor=\"let layer of layers\" [value]=\"layer.id\">\n {{ layer.name }}\n </option>\n </select>\n <p class=\"mt-1 new-type-text\">{{'or add new type of zone' | translate }}</p>\n <input type=\"text\" class=\"form-control new-type-input\" formControlName=\"newLayer\">\n <div *ngIf=\"newLayer.invalid && (newLayer.dirty || newLayer.touched)\" class=\"text-danger\">\n <div *ngIf=\"newLayer.errors?.['forbiddenName']\">\n {{'Layer exists already' | translate}}\n </div>\n </div>\n </div>\n </div>\n <!--If Editing Zone possibility to assign it to museum itinerary-->\n <div class=\"mb-3 row\" *ngIf=\"zoneEdit && !zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{ 'Museum Itinerary' | translate }}</label>\n <div class=\"col-sm-10\">\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"isMuseumVisit\"\n [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div>\n\n <div class=\"mb-3 row\" *ngIf=\"!zoneEdit || zoneEdit.isMultipleFloorZone\">\n <label class=\"col-sm-2 col-form-label\">{{ 'Multiple Floors' | translate }}</label>\n <div class=\"col-sm-10\">\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"multipleFloors\"\n [disabled]=\"zoneEdit !== undefined && zoneEdit !== null\" (change)=\"onChangeMultipleFloors()\"\n [ngModelOptions]=\"{standalone: true}\">\n <div class='text-danger' *ngIf=\"zoneEdit\">\n {{'cannotChangeMultifloor' | translate}}\n </div>\n </div>\n\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Surface' | translate}}</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" formControlName=\"surface\">\n </div>\n </div>\n\n <div class=\"mb-3 row\" *ngIf=\"!zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{'Parent zone' | translate}}</label>\n <div class=\"col-sm-10\">\n <input *ngIf=\"zoneEdit\" type=\"text\" class=\"form-control\" formControlName=\"parent\">\n <div class=\"text-danger\" *ngIf=\"zoneEdit\">\n {{'cannotChangeParent' | translate}}\n </div>\n <select *ngIf=\"!zoneEdit\" class=\"form-control\" formControlName=\"parentID\">\n <option *ngFor=\"let zone of parentZones\" [ngValue]=\"zone.id\">\n {{ zone.name }}\n </option>\n </select>\n\n </div>\n </div>\n\n <div class=\"mb-3 row\" style=\"max-height: 200px; overflow: auto;\" *ngIf=\"!zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{'Scan Points' | translate}}</label>\n <!-- <p class=\"col-sm-2\" *ngIf=\"zoneEdit\">{{ zoneEdit.sweepIDs.length }} scans</p> -->\n <p class=\"col\" *ngIf=\"chosenScansOnPlan.length === 0 && chosenScans.length === 0\">\n {{'No scan points chosen' | translate}}</p>\n <div class=\"col-sm-5\" *ngIf=\"chosenScansOnPlan && chosenScansOnPlan.length > 0\">\n <p>{{ chosenScansOnPlan.length }} {{'scan points chosen' | translate}}</p>\n <!-- <div *ngFor=\"let scan of chosenScansOnPlan\">\n <div class=\"row\">\n <p class=\"me-2\">{{ scan | slice:0:8 }}</p>\n <div (click)=\"onRemoveScanPlan(scan)\" [style.cursor]=\"'pointer'\">\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\n </div>\n </div>\n </div> -->\n </div>\n <div class=\"col-sm-5\" *ngIf=\"carouselIsVisible && chosenScans && chosenScans.length > 0\">\n <p>{{ chosenScans.length }} {{'scan points chosen' | translate}}</p>\n <div *ngFor=\"let scan of chosenScans\">\n <div class=\"row\">\n <p class=\"me-2\">{{ images360[scan].filename }}</p>\n <div (click)=\"onRemoveScanImage(scan)\" [style.cursor]=\"'pointer'\">\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"row mb-3 mt-3\" *ngIf=\"!zoneIsMatterportFloor\">\n <div class=\"col\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n (click)=\"togglePlan()\">{{'Choose scan points on plan' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"toggleCarousel()\"\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\n {{'Choose scan points from gallery' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAll()\"\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\n {{'add-all-scans' | translate}}</button>\n </div>\n </div>\n\n <!-- <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'No visible scan points' | translate}}</label>\n <div class=\"col-sm-3\">\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"noScanPoints\"\n [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div> -->\n\n <div *ngIf=\"carouselIsVisible\" class=\"mb-2\">\n <lib-carousel *ngIf=\"images360 && images360.length > 0\" [images]=\"images360\"\n (currentScan)=\"currentScanShowing=$event\"></lib-carousel>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2 mt-3\"\n (click)=\"onAddScan()\">{{'Add to zone' | translate}}</button>\n </div>\n <div class=\"mt-3\">\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\"\n [disabled]=\"fromPlan || !zoneForm.valid\">{{'Save' | translate}}</button>\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </form>\n </div>\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\n <lib-sweep-plan-selection style=\"width: 100%;\" [newZoneData]=\"newZoneDataFromEditor\" [spaceID]=\"spaceID\"\n [multipleFloors]=\"multipleFloors\" [inputZone]=\"zoneEdit\"\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\n </div>\n</div>","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { UntypedFormGroup, UntypedFormBuilder, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ZoneService, LayerService, BaseUserService, NavigationService, Layer, Zone, CommentType, CommentService, Comment, filterUniqueArrayByID } from '@smarterplan/ngx-smarterplan-core';\n\n\n@Component({\n selector: 'lib-add-audio-zone',\n templateUrl: './add-audio-zone.component.html',\n styleUrls: ['./add-audio-zone.component.scss'],\n})\nexport class AddAudioZoneComponent implements OnInit {\n\n @Input() spaceID: string;\n\n @Output() updatedZone = new EventEmitter<any>();\n\n @Input() defaultZone: Zone;\n\n @Input() zones: Zone[];\n\n @Input() parentZone: Zone;\n\n isSubmitted = false;\n\n fromPlan: boolean = false;\n\n chosenScansOnPlan: string[] = [];\n\n currentOrgId: string;\n\n audioLayer: Layer;\n\n commentForm: UntypedFormGroup;\n\n fileToUpload: File;\n\n audiosForSpace: Comment[];\n\n isAddingAudio = false;\n\n chosenAudio: Comment;\n\n audioZones: Zone[];\n\n @Input() currentAudioZone: Zone;\n\n scansModified = false;\n\n occupiedSweeps: string[] = [];\n\n unavailableSweeps: string[] = [];\n\n working = false;\n\n audioUploaded = false;\n\n constructor(\n private fb: UntypedFormBuilder,\n private zoneService: ZoneService,\n private layerService: LayerService,\n private userService: BaseUserService,\n private navigationService: NavigationService,\n private commentService: CommentService,\n private translate: TranslateService,\n ) { }\n\n ngOnInit(): void {\n if (this.currentAudioZone) {\n // we are editing zone\n this.chosenAudio = this.currentAudioZone.audio;\n this.chosenScansOnPlan = this.currentAudioZone.sweepIDs;\n this.parentZone = this.currentAudioZone.parent;\n }\n this.setup();\n }\n\n async setup() {\n const mission = this.userService.currentMission(this.spaceID);\n this.currentOrgId = mission.organisationID;\n let layers = await this.layerService.getLayerForOrganisation(\n this.currentOrgId,\n );\n this.audioLayer = layers.find((layer) => layer.name === \"AUDIO\");\n if (!this.audioLayer) {\n // first time creating Audio Zone \n this.audioLayer = await this.layerService.createLayerForOrganisation(\"AUDIO\", this.currentOrgId);\n }\n if (!this.parentZone) {\n this.parentZone = this.defaultZone;\n }\n this.audioZones = this.zones.filter((zone) => zone.audioID && zone.parentID === this.parentZone.id);\n this.occupiedSweeps = this.audioZones.flatMap((zone) => zone.sweepIDs);\n // unavailable sweeps: sweeps that do not belong to parent zone\n this.unavailableSweeps = this.defaultZone.sweepIDs.filter((sweep) => !this.parentZone.sweepIDs.includes(sweep));\n await this.getAudios();\n this.commentForm = this.fb.group({\n title: [null, Validators.required],\n spaceID: this.spaceID,\n type: CommentType.AUDIO,\n ownerID: mission.id,\n });\n }\n\n async onSubmit() {\n this.isSubmitted = true;\n this.working = true;\n if (this.currentAudioZone) {\n await this.zoneService.updateZone({\n id: this.currentAudioZone.id,\n sweepIDs: this.chosenScansOnPlan,\n });\n await this.removeTakenSweepsFromOtherZones();\n this.updatedZone.emit(this.currentAudioZone.id);\n this.working = false;\n } else {\n const zoneInput = {\n name: `${this.parentZone.name} - ${this.chosenAudio.title}`,\n surface: 0,\n spaceID: this.spaceID,\n layerID: this.audioLayer.id,\n parentID: this.parentZone.id,\n isMuseumVisitZone: false,\n isMultipleFloorZone: this.parentZone.isMultipleFloorZone,\n audioID: this.chosenAudio.id,\n } as Zone;\n try {\n await this.setSweepsAndNodeForZoneInput(zoneInput);\n await this.zoneService\n .create(zoneInput)\n .then(async (zoneCreated) => {\n this.currentAudioZone = zoneCreated;\n await this.removeTakenSweepsFromOtherZones();\n this.updatedZone.emit(zoneCreated.id);\n });\n this.working = false;\n } catch (error) {\n console.error(error);\n this.working = false;\n }\n }\n }\n\n async setSweepsAndNodeForZoneInput(zoneInput: Zone) {\n if (this.chosenScansOnPlan.length > 0) {\n zoneInput.sweepIDs = this.chosenScansOnPlan;\n }\n if (zoneInput.sweepIDs && zoneInput.sweepIDs.length > 0) {\n const navForSweep =\n await this.navigationService.getNavigationsForMatterportIDForSpace(\n zoneInput.sweepIDs[0],\n this.spaceID,\n );\n zoneInput.nodeIDs = [navForSweep[0].nodeID];\n }\n }\n\n onCancel() {\n if (this.scansModified) {\n const message = this.translate.instant(\"confirm.cancelEditZone\");\n if (!window.confirm(message)) {\n return;\n }\n }\n this.commentForm = null;\n this.chosenScansOnPlan = [];\n this.updatedZone.emit(false);\n }\n\n togglePlan() {\n this.fromPlan = true;\n }\n\n onSelectedSweepsFromPlan(result: { \"sweeps\": string[]; \"startSweepID\": string; }) {\n if (result && result.sweeps) {\n this.chosenScansOnPlan = result.sweeps;\n this.scansModified = true;\n }\n this.fromPlan = false;\n }\n\n handleFileInput(event: Event) {\n const target = event.target as HTMLInputElement;\n this.fileToUpload = (target.files as FileList)[0];\n }\n\n async onUploadAudio() {\n this.working = true;\n const commentInput = this.commentForm.value;\n try {\n const newAudio = await this.commentService.createCommentWithFile(\n commentInput,\n this.fileToUpload,\n );\n this.audiosForSpace.push(newAudio);\n this.isAddingAudio = false;\n this.working = false;\n this.audioUploaded = true;\n } catch (e) {\n this.working = false;\n this.audioUploaded = false;\n console.log(e);\n }\n\n }\n\n async getAudios() {\n const attachments = await this.commentService.getCommentsBySpaceID(this.spaceID);\n if (attachments) {\n this.audiosForSpace = attachments.filter((attachment) => attachment.type === CommentType.AUDIO);\n }\n }\n\n onCancelAudioUpload() {\n this.commentForm = null;\n this.isAddingAudio = false;\n this.fileToUpload = null;\n }\n\n onChooseAudio(audio: Comment) {\n this.chosenAudio = audio;\n this.currentAudioZone = this.audioZones.find((zone) => zone.audioID === this.chosenAudio.id);\n if (this.currentAudioZone) {\n this.chosenScansOnPlan = this.currentAudioZone.sweepIDs;\n } else {\n this.chosenScansOnPlan = [];\n }\n }\n\n /**\n * Removes newly selected sweeps for current zone (they are in chosenScansOnPlan) from other audio zones. \n * Rule: one sweep = one audio.\n */\n async removeTakenSweepsFromOtherZones() {\n await Promise.all(this.audioZones.map(async (zone) => {\n if (zone.id !== this.currentAudioZone.id) {\n const newSweeps = zone.sweepIDs.filter((sweepID) => !this.chosenScansOnPlan.includes(sweepID));\n if (newSweeps.length !== zone.sweepIDs.length) {\n await this.zoneService.updateZone({ id: zone.id, sweepIDs: newSweeps });\n }\n }\n }));\n }\n\n /**\n * Delete audio as Comment, all its audio Zones and file from S3 (using lambda function)\n */\n async onDeleteAudio() {\n const message = this.translate.instant(\"confirm.deleteAudio\");\n if (window.confirm(message)) {\n await this.commentService.deleteComment(this.chosenAudio.id);\n const index = this.audiosForSpace.indexOf(this.chosenAudio);\n this.audiosForSpace.splice(index, 1);\n\n // delete all zones with this comment audio\n const audioZonesToDelete = this.zones.filter((z) => z.audioID === this.chosenAudio.id);\n await Promise.all(audioZonesToDelete.map(async (zone) => {\n await this.zoneService.deleteZone(zone.id);\n const indexZone = this.audioZones.indexOf(this.currentAudioZone);\n if (indexZone !== -1) {\n this.audioZones.slice(indexZone, 1);\n }\n }));\n this.currentAudioZone = null;\n this.chosenAudio = null;\n }\n }\n\n}\n","<div class=\"main-container\">\n <div class=\"col-lg-6 col-md-6 col-sm-7\" *ngIf=\"isAddingAudio\">\n <form (ngSubmit)=\"onUploadAudio()\" [formGroup]=\"commentForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" required formControlName=\"title\">\n </div>\n </div>\n <div>\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\n {{'Choose File' | translate}}</label>\n <p *ngIf=\"fileToUpload\">{{ fileToUpload.name}}</p>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\n <lib-loader></lib-loader>\n </div>\n \n <div class=\"mt-3\">\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || working\">{{'Upload' | translate}}</button>\n <button type=\"button\" (click)=\"onCancelAudioUpload()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </form>\n </div>\n <ngb-alert type=\"success\" [dismissible]=\"true\" *ngIf=\"!working && audioUploaded\" (closed)=\"audioUploaded=false\">\n {{ 'add-audio.success' | translate }} !\n </ngb-alert>\n <div class=\"col-7\" *ngIf=\"!isAddingAudio && audiosForSpace\">\n \n <div class=\"instruction-row\" >\n <p>1.</p>\n <div ngbDropdown class=\"d-inline-block\">\n <div>\n <button type=\"button\" class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\"\n ngbDropdownToggle>{{chosenAudio ?\n chosenAudio.title : ('choose-audio' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button type=\"button\" ngbDropdownItem *ngFor=\"let audio of audiosForSpace\" \n (click)=\"onChooseAudio(audio)\">{{ audio.title }}\n </button>\n </div>\n </div>\n </div>\n <p>{{'or' | translate}}</p>\n <button (click)=\"isAddingAudio=true\" class=\"btn btn-primary rounded-pill me-2\"> {{'add-audio.add' | translate}}</button>\n </div>\n <div class=\"instruction-row\">\n <p>2.</p>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"togglePlan()\" [disabled]=\"!chosenAudio\">\n {{'Choose scan points on plan' | translate}}</button>\n\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onDeleteAudio()\" [disabled]=\"!chosenAudio\">\n {{'Delete audio' | translate}}</button>\n \n </div>\n <div class=\"instruction-row\" *ngIf=\"chosenAudio\">\n <p>{{ chosenScansOnPlan.length }} {{'scans-chosen-audio' | translate}}</p>\n </div>\n\n <div class=\"mt-3\">\n <button class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || !this.chosenAudio\" (click)=\"onSubmit()\">{{'Save' | translate}}</button>\n <button (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\n <lib-sweep-plan-selection style=\"width: 100%;\" [inputZone]=\"currentAudioZone\" [spaceID]=\"spaceID\" \n [occupiedSweeps]=\"occupiedSweeps\" [unavailableSweeps]=\"unavailableSweeps\" [editingAudioZone]=\"true\"\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\n </div>\n</div>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Zone, ZoneService } from '@smarterplan/ngx-smarterplan-core';\n\n@Pipe({\n name: 'countAudioSweeps'\n})\nexport class CountAudioSweepsPipe implements PipeTransform {\n constructor(private zoneService: ZoneService) { }\n\n async transform(zone: Zone): Promise<number> {\n let childrenAudioZones = await this.zoneService.getZonesByParentZone(zone.id);\n if (childrenAudioZones.length > 0) {\n childrenAudioZones = childrenAudioZones.filter((zone) => zone.audioID);\n if (childrenAudioZones.length > 0) {\n return childrenAudioZones.flatMap((z) => z.sweepIDs).length;\n }\n }\n return 0;\n }\n\n}\n","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n MenuItem, ZoneService, SpaceService, VisitService,\n NavigationService, BaseUserService, PlanService, wait, Navigation, showScanPointsOnPlanInDiv, Plan, Space, Zone, SpModule, NavigatorService\n} from '@smarterplan/ngx-smarterplan-core';\nimport panzoom from \"panzoom\";\nimport { Subject, takeUntil } from 'rxjs';\n@Component({\n selector: 'lib-zones',\n templateUrl: './zones.component.html',\n styleUrls: ['./zones.component.scss']\n})\nexport class ZonesComponent implements OnInit {\n\n lotIndexDetails = -1;\n\n currentSpace: Space;\n\n @Output() updatedZone = new EventEmitter<boolean>();\n\n plans: Plan[];\n\n zoneForEdit: Zone;\n\n isEditingZone = false;\n\n captureDate: number;\n\n spaceID: string;\n\n navigations: string[];\n\n images360: any[];\n\n carouselIsVisible = false;\n\n planIsVisible = false;\n\n currentPlan: Plan;\n\n currentZone: Zone;\n\n loadingPlan = false;\n\n menuItems: MenuItem[] = [];\n\n isMuseumVisit = false;\n\n isMuseumModule = false;\n\n allZones: Zone[];\n\n floorZones: Zone[] = [];\n\n zonesMap: Map<string, Zone[]> = new Map();\n\n floorDetails: number = -1;\n\n defaultZone: Zone;\n\n defaultShowing = false;\n\n isAddingAudioTrack = false;\n\n parentZoneForAudio: Zone;\n\n destroy$ = new Subject();\n\n constructor(\n private route: ActivatedRoute,\n private zoneService: ZoneService,\n private spaceService: SpaceService,\n private visitService: VisitService,\n private navigationService: NavigationService,\n private userService: BaseUserService,\n private planService: PlanService,\n private translate: TranslateService,\n private navigatorService: NavigatorService,\n private router: Router,\n ) {\n // listen to the change of location via navigation bar dropdown\n this.navigatorService.locationIDChange\n .pipe(takeUntil(this.destroy$))\n .subscribe((spaceID) => {\n this.router.navigate([\"dashboard/localisation\", spaceID, \"zones\"]).catch(e => console.log(e.message));\n });\n\n this.route.params.subscribe((params) => {\n this.spaceID = params.id;\n this.resetZones().catch(e => console.log(e.message));\n });\n }\n\n async ngOnInit() {\n this.isMuseumModule = this.userService.getSpModule() === SpModule.MUSEUM;\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n setupMenuItems() {\n this.menuItems = [\n { label: \"Locations\", url: \"/localisation\" },\n {\n label: this.currentSpace.name,\n url: `/localisation/${this.spaceID}`,\n },\n {\n label: \"Zones\",\n url: `/localisation/${this.currentSpace.id}/zones`,\n },\n ];\n }\n\n onGoBack() {\n this.editCompleted(null);\n }\n\n ngOnChanges() {\n this.resetZones().catch(e => console.log(e.message));\n }\n\n async resetZones() {\n this.isMuseumVisit = false;\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\n this.setupMenuItems();\n\n this.allZones = await this.zoneService.getZonesBySpace(this.spaceID);\n this.defaultZone = this.allZones.find(\n (zone) => zone.layer && zone.layer.name === \"BUILDING\" && zone.sweepIDs,\n );\n\n this.floorZones = this.allZones.filter(\n (zone) => zone.layer && zone.layer.name === \"FLOOR\",\n );\n // sort alphabetically\n this.floorZones.sort((a, b) => a.name.localeCompare(b.name));\n // we add only children zones that are not Floors\n if (!!this.defaultZone) {\n this.zonesMap.set(this.defaultZone.id, this.allZones.filter((zone) => zone.parentID === this.defaultZone.id && !this.floorZones.includes(zone)));\n }\n for (const floor of this.floorZones) {\n const zonesForFloor = this.allZones.filter((zone) => zone.parentID === floor.id);\n this.zonesMap.set(\n floor.id,\n zonesForFloor.sort((a, b) => a.name.localeCompare(b.name)),\n );\n }\n this.resetNavigations();\n this.images360 = await this.visitService.loadImagesForSpace(\n this.currentSpace,\n );\n this.plans = await this.planService.getPlansWithZonesForSpace(\n this.spaceID,\n );\n this.plans = this.plans.filter((plan) => plan.isCurrentForZone);\n this.onPlansLoaded().catch(e => console.log(e.message));\n }\n\n resetNavigations() {\n this.navigations = [];\n const zonesWithSweeps = this.allZones.filter((zone) => zone.sweepIDs);\n this.navigations = [\n ...new Set(zonesWithSweeps.flatMap((zone) => zone.sweepIDs)),\n ];\n }\n\n async onPlansLoaded(): Promise<void> {\n if (this.planIsVisible && this.currentZone) {\n this.preparePlan().catch(e=>console.log(e.message));\n }\n }\n\n /**\n * onToggleDetail folds/unfolds details for a zone\n * @param index\n * @param zone\n */\n async onToggleDetail(index: number, zone: Zone) {\n this.lotIndexDetails = index === this.lotIndexDetails ? -1 : index;\n if (this.lotIndexDetails === -1) {\n this.currentZone = null;\n this.planIsVisible = false;\n return;\n }\n this.currentZone = zone;\n this.planIsVisible = true;\n if (!this.plans) {\n return; // wait until the plans are set\n }\n if (this.loadingPlan) {\n // another plan is already loading\n await wait(1000);\n }\n this.preparePlan().catch(e=>console.log(e.message));\n }\n\n onToggleDetailFloor(index: number, floor: Zone) {\n this.defaultShowing = false;\n this.floorDetails = index === this.floorDetails ? -1 : index;\n if (this.floorDetails === -1) {\n this.currentZone = null;\n this.planIsVisible = false;\n return;\n }\n this.currentZone = floor;\n this.planIsVisible = true;\n if (!this.plans) {\n console.log(\"plans not ready\");\n return; // wait until the plans are set\n }\n this.preparePlan().catch(e => console.log(e.message));\n }\n\n onToggleDefaultZone() {\n this.defaultShowing = !this.defaultShowing;\n this.currentZone = this.defaultShowing ? this.defaultZone : null;\n }\n\n async preparePlan() {\n this.loadingPlan = true;\n this.currentPlan = null;\n if (this.currentZone.virtual) {\n this.currentPlan = null;\n this.loadingPlan = false;\n return;\n }\n this.currentPlan = await this.planService.getCalibratedPlanForZone(\n this.currentZone,\n );\n if (this.currentPlan) {\n const scans = await this.navigationService.getNavigationsForZone(\n this.currentZone,\n );\n await this.showScanPointsOnPlan(scans);\n }\n this.loadingPlan = false;\n }\n\n toggleCarousel() {\n this.carouselIsVisible = true;\n }\n\n onEdit(zone: Zone) {\n this.zoneForEdit = zone;\n if (this.zoneForEdit.layer && this.zoneForEdit.layer.name === \"AUDIO\") {\n this.isAddingAudioTrack = true;\n } else {\n this.isEditingZone = true;\n }\n\n this.menuItems.push({\n label: `${zone.name}`,\n });\n }\n\n onAddLot() {\n this.isMuseumVisit = false;\n this.isEditingZone = true;\n this.menuItems.push({\n label: \"New\",\n });\n }\n\n onAddMuseumZone() {\n this.isMuseumVisit = true;\n this.isEditingZone = true;\n this.menuItems.push({\n label: \"New Museum Itinerary\",\n });\n }\n\n onAddAudioZone(parentZone: Zone) {\n this.parentZoneForAudio = parentZone;\n this.isAddingAudioTrack = true;\n this.menuItems.push({\n label: parentZone.name,\n });\n this.menuItems.push({\n label: \"add-audio.add\",\n });\n }\n\n async onDelete(zone: Zone) {\n const message = this.translate.instant(\"confirm.deleteZone\");\n // eslint-disable-next-line no-alert\n if (window.confirm(message)) {\n const childrenZones = await this.zoneService.getZonesByParentZone(zone.id);\n await Promise.all(childrenZones.map(async (childZone) => {\n await this.zoneService.deleteZone(childZone.id);\n this.allZones.splice(this.allZones.indexOf(childZone), 1);\n }));\n await this.zoneService.deleteZone(zone.id);\n this.allZones.splice(this.allZones.indexOf(zone), 1);\n // remove current zone from its parent list\n if (zone.parentID && Array.from(this.zonesMap.keys()).includes(zone.parentID)) {\n const zonesForParent = this.zonesMap.get(zone.parentID);\n zonesForParent.splice(zonesForParent.indexOf(zone), 1);\n this.zonesMap.set(zone.parentID, zonesForParent);\n }\n // we send update of location in order to force update of list of zones in nav bar\n this.navigatorService.locationIDChange.next(this.spaceID);\n }\n }\n\n editCompleted(event: any) {\n this.lotIndexDetails = -1;\n this.currentPlan = null;\n this.isEditingZone = false;\n this.isAddingAudioTrack = false;\n this.zoneForEdit = null;\n this.planIsVisible = false;\n this.carouselIsVisible = false;\n this.setupMenuItems();\n if (event) {\n this.resetZones().catch(e=> console.log(e.message));\n // we send update of location in order to force update of list of zones in nav bar\n this.navigatorService.locationIDChange.next(this.spaceID);\n }\n\n }\n\n async showScanPointsOnPlan(navigations: Navigation[]) {\n if (this.currentPlan) {\n const divPlan = document.querySelector(\"#planDiv\") as HTMLElement;\n await showScanPointsOnPlanInDiv(this.currentPlan, divPlan, navigations);\n panzoom(divPlan, {\n bounds: true,\n boundsPadding: 0,\n maxZoom: 3.5,\n });\n }\n }\n\n}\n","<div class=\"container-fluid\" *ngIf=\"currentSpace\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\n </div>\n <div class=\"row\" *ngIf=\"!isEditingZone && !isAddingAudioTrack\">\n <div class=\"col-md-6\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item default-zone-line-item\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\" *ngIf=\"defaultZone\">\n {{defaultZone.name}}\n <div class=\"default-zone-label\">{{ \"whole space\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"defaultShowing\" (click)=\"onToggleDefaultZone()\"></lib-chevron>\n </div>\n <div *ngIf=\"defaultShowing\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}:\n {{defaultZone.layer ? defaultZone.layer.name : \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"defaultZone.surface\">\n {{'Surface' | translate}}, m<sup>2</sup>: {{defaultZone.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!defaultZone.virtual\">{{'Scan Points' | translate}}:\n {{defaultZone.sweepIDs ? defaultZone.sweepIDs.length : \"No scan points\" | translate}} </li>\n </ul>\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\n <div *ngIf=\"pair.key == defaultZone.id\">\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item list-group-flush list-group-item-action\"\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\n {{lot.name}}\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\"\n (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\n\n </div>\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\n translate}}: {{lot.layer ? lot.layer.name :\n \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">\n {{'Surface' | translate}},m<sup>2</sup>: {{lot.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\n {{'Zone not visible in 3D visit' | translate}}</li>\n </ul>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\n </div>\n </li>\n </ul>\n\n </div>\n </div>\n </div>\n </li>\n\n <li class=\"list-group-item\" *ngFor=\"let floor of floorZones; index as index\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\n {{floor.name}}\n <!-- <small>({{ lot.metadata ? ('Calibrated' | translate) : ('Not calibrated' | translate)}})</small> -->\n <div class=\"museum-label\" *ngIf=\"floor.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"index==floorDetails\"\n (click)=\"onToggleDetailFloor(index, floor)\"></lib-chevron>\n </div>\n <div *ngIf=\"index==floorDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}: {{floor.layer ?\n floor.layer.name :\n \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.surface\">{{'Surface' | translate}}, m<sup>2</sup>:\n {{floor.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!floor.virtual\">{{'Scan Points' | translate}}:\n {{floor.sweepIDs ? floor.sweepIDs.length : \"No scan points\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.virtual\">{{'Zone not visible in 3D visit' |\n translate}}</li>\n </ul>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onEdit(floor)\">{{'Edit' |\n translate}}</button>\n\n <!-- List of children zones -->\n\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\n <div *ngIf=\"pair.key == floor.id\">\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item list-group-flush list-group-item-action\"\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\n <div><span *ngIf=\"lot.code_ref\">{{lot.code_ref}}_</span>{{lot.name}}</div>\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\"\n (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\n\n </div>\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\n translate}}: {{lot.layer ? lot.layer.name :\n \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">{{'Surface' | translate}},\n m<sup>2</sup>:\n {{lot.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual && lot.isMuseumVisitZone\">\n {{'Scan Points with audio' | translate}}: {{ lot | countAudioSweeps | async}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\n {{'Zone not visible in 3D visit' | translate}}</li> dist\n </ul>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\n </div>\n </li>\n </ul>\n\n </div>\n </div>\n </div>\n </li>\n </ul>\n\n <div>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddLot()\">{{'Add zone' |\n translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddMuseumZone()\" *ngIf=\"isMuseumModule\">\n {{'Add museum itinerary' | translate}}</button>\n </div>\n </div>\n <div class=\"col-md-6\" *ngIf=\"planIsVisible\">\n <div class=\"d-flex justify-content-center\" *ngIf=\"loadingPlan\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <div class=\"row\" style=\"overflow: hidden; flex-direction: column;\">\n <div *ngIf=\"currentPlan\">\n <lib-plan-legend [isAudioZone]=\"false\"></lib-plan-legend>\n <div class=\"planContainer\">\n <div class=\"mt-3 ms-3\" style=\"height: 500px; width: 100%;\" id=\"planDiv\"></div>\n </div>\n </div>\n\n <div *ngIf=\"!currentPlan && plans && !loadingPlan && currentZone\">\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"!currentZone.virtual && !currentZone.isMultipleFloorZone\">\n {{ 'Plan is not calibrated' | translate}}\n </div>\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.virtual\">\n {{ 'No scan points chosen' | translate}}\n </div>\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.isMultipleFloorZone\">\n {{ 'The zone is on several floors' | translate}}\n </div>\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"mb-3\" *ngIf=\"isEditingZone\">\n <lib-add-zone [zoneEdit]=\"zoneForEdit\" [spaceID]=\"spaceID\" [images360]=\"images360\" [navigationIDs]=\"navigations\"\n [zones]=\"allZones\" [defaultZone]=\"defaultZone\" (updatedZone)=\"editCompleted($event)\"\n [isMuseumVisit]=\"isMuseumVisit\"></lib-add-zone>\n </div>\n <div class=\"mb-3\" *ngIf=\"isAddingAudioTrack\">\n <lib-add-audio-zone [spaceID]=\"spaceID\" [defaultZone]=\"defaultZone\" [parentZone]=\"parentZoneForAudio\"\n [zones]=\"allZones\" [currentAudioZone]=\"zoneForEdit\" (updatedZone)=\"editCompleted($event)\"></lib-add-audio-zone>\n </div>\n</div>","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Space, Visit, MenuItem, SpaceService, VisitService, NodeService, InventoryStatus, NavigatorService } from '@smarterplan/ngx-smarterplan-core';\nimport { Subject, takeUntil } from 'rxjs';\n\n@Component({\n selector: 'lib-images',\n templateUrl: './images.component.html',\n styleUrls: ['./images.component.scss']\n})\nexport class ImagesComponent implements OnInit {\n\n images: Array<any>;\n\n spaceID: string;\n\n currentSpace: Space;\n\n currentVisit: Visit;\n\n currentImages: Array<any>;\n\n loading = false;\n\n currentScanID: string;\n\n menuItems: MenuItem[] = [];\n\n destroy$ = new Subject();\n\n constructor(\n private route: ActivatedRoute,\n private spaceService: SpaceService,\n private visitService: VisitService,\n private nodeService: NodeService,\n private navigatorService: NavigatorService,\n private router: Router,\n ) {\n this.navigatorService.locationIDChange\n .pipe(takeUntil(this.destroy$))\n .subscribe((spaceID) => {\n this.router.navigate([\"dashboard/localisation\", spaceID, \"images\"]);\n });\n\n this.route.params.subscribe((params) => {\n this.spaceID = params.id;;\n this.loadImages();\n });\n }\n\n ngOnInit(): void {\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n setupMenuItems() {\n this.menuItems = [\n { label: \"Locations\", url: \"/localisation\" },\n {\n label: this.currentSpace.name,\n url: `/localisation/${this.spaceID}`,\n },\n { label: \"360° Images\" },\n ];\n\n if (this.currentVisit) {\n this.menuItems.push({ label: this.currentVisit.name });\n }\n }\n\n onGoBack() {\n this.currentVisit = null;\n this.currentImages = null;\n this.setupMenuItems();\n }\n\n async loadImages() {\n this.loading = true;\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\n this.setupMenuItems();\n this.images = await this.visitService.loadImagesForSpace(\n this.currentSpace,\n );\n if (this.currentSpace.visits.length === 1) {\n this.setVisit(this.currentSpace.visits[0]);\n }\n this.loading = false;\n }\n\n setVisit(visit) {\n this.currentVisit = visit;\n this.currentImages = this.images.filter((im) => {\n return im.visit === visit;\n });\n this.setupMenuItems();\n }\n\n setCurrentScan(id) {\n this.currentScanID = id;\n }\n\n async onInventoryClick() {\n const { node } = this.currentVisit;\n const { filename } = this.currentImages[this.currentScanID]; // 110ee452_sweep.jpeg\n // check if node has already errors of inventory\n const missingFilesErrors = [\n InventoryStatus.ERROR_FILE_JSON_NOT_EXIST,\n InventoryStatus.ERROR_FILE_MODEL_NOT_EXIST,\n InventoryStatus.ERROR_FILE_OBJ_NOT_EXIST,\n ];\n if (\n node.inventoryStatus &&\n missingFilesErrors.includes(node.inventoryStatus)\n ) {\n alert(\n \"Files missing for this visit's inventory. Contact your administrator.\",\n );\n } else {\n await this.nodeService.updateNode({\n id: node.id,\n inventoryStatus: InventoryStatus.TO_RUN_ONE_IMAGE,\n navigationForInventory: filename.split(\"_\")[0],\n });\n alert(\n \"Automatic AI Inventory started! Detected equipments will appear soon in the visit.\",\n );\n }\n }\n\n}\n","<div class=\"container-fluid dashboard-tab col-sm-10 mb-3\" *ngIf=\"currentSpace\" >\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">{{'Loading' | translate}}...</span>\n </div>\n </div>\n <div ngbDropdown class=\"d-inline-block\" *ngIf=\"currentSpace.visits && currentSpace.visits.length > 0\">\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" *ngIf=\"!currentVisit\"\n ngbDropdownToggle>{{'Choose 3D visit' | translate}}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button ngbDropdownItem *ngFor=\"let visit of currentSpace.visits\" (click)=\"setVisit(visit)\"> {{ visit.name }}\n </button>\n </div>\n </div>\n <h3 *ngIf=\"currentVisit\">{{ currentVisit.name }}</h3>\n <div class=\"mt-3\" *ngIf=\"currentVisit && currentImages.length == 0 && !loading\">\n <h4>{{'No imported images' | translate }}</h4>\n <p>{{'For import: go Virtual Visits => Import Images' | translate}}</p>\n </div>\n <button *ngIf=\"currentVisit && currentImages.length > 0 && !loading\"\n class=\"btn btn-outline-primary rounded-pill no-lowercase mb-2\" (click)=\"onInventoryClick()\">\n {{'Run AI inventory on this image' | translate}}</button>\n <lib-carousel [images]=\"currentImages\" *ngIf=\"currentImages\" (currentScan)=\"setCurrentScan($event)\"></lib-carousel>\n </div>","import { Component, HostListener, NgZone, OnInit, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { TranslateService } from '@ngx-translate/core';\nimport { getDocument, PDFDocumentProxy } from \"pdfjs-dist\";\nimport { Zone, Plan, Space, MenuItem, PlanService, ZoneService, VisitService, SpaceService, sortAlphabeticallyOnName, downloadFileAsObject } from '@smarterplan/ngx-smarterplan-core';\n\n@Component({\n selector: 'lib-edit-plan',\n templateUrl: './edit-plan.component.html',\n styleUrls: ['./edit-plan.component.scss']\n})\nexport class EditPlanComponent implements OnInit {\n\n @ViewChild(\"dialog\") dialog!: any;\n\n @ViewChild(\"dialogZone\") dialogZone!: any;\n\n @ViewChild(\"preparing\") loadingModal: any;\n\n spaceID: string;\n\n chosenPlan: Plan;\n\n editedPlan: Plan;\n\n loading: boolean = false;\n\n svgEditor;\n\n svgEditorIframe;\n\n navigations: string[];\n\n zones: Zone[];\n\n isNewZone: boolean = false;\n\n newZoneData;\n\n editorUrl;\n\n editedZone: Zone;\n\n images360;\n\n\n /**\n * Options for svgEditor\n */\n private config: any = {\n noStorageOnLoad: true,\n forceStorage: true,\n // imgPath: \"/assets/editor/images/\",\n // extPath: \"/assets/editor/extensions/\",\n // langPath: \"/assets/editor/locale/\",\n // canvgPath: \"/assets/editor/canvg/\",\n // jspdfPath: \"/assets/editor/jspdf/\",\n // jGraduatePath: \"/assets/editor/jgraduate/images/\",\n // extIconsPath: \"/assets/editor/extensions/\",\n // stylesheets: [\n // \"/assets/editor/jgraduate/css/jGraduate.css\",\n // \"/assets/editor/spinbtn/jQuery.SpinButton.css\",\n // \"/assets/editor/jgraduate/css/jPicker.css\",\n // \"/assets/editor/svg-editor.css\",\n // ],\n dimensions: [10000, 10000],\n showlayers: true,\n noDefaultExtensions: true,\n basePath: \"/assets/editor/\",\n customExportImage: true,\n extensions: [\n \"ext-connector\",\n // \"ext-eyedropper\",\n // \"ext-grid\",\n // \"ext-markers\",\n // \"ext-overview_window\",\n // \"ext-spi-library\",\n // \"ext-spi-icon\",\n \"ext-sp-zone\",\n // \"ext-arrows\",\n // \"ext-sp-css\",\n // \"ext-placemark\",\n ],\n };\n\n currentSpace: Space;\n\n menuItems: MenuItem[] = [];\n\n constructor(\n private planService: PlanService,\n private route: ActivatedRoute,\n private router: Router,\n private modalService: NgbModal,\n private zoneService: ZoneService,\n private visitService: VisitService,\n private spaceService: SpaceService,\n private translate: TranslateService,\n private ngZone: NgZone,\n ) {\n this.chosenPlan = this.planService.getChosenPlan();\n }\n\n async ngOnInit() {\n this.editorUrl = \"/assets/editor/main.html\";\n this.spaceID = this.route.snapshot.queryParams.spaceID;\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\n this.setupMenuItems();\n if (this.spaceID && !this.planService.getChosenPlan()) {\n this.router.navigate([\n \"/dashboard/localisation\",\n this.spaceID,\n \"plans\",\n ]);\n } else if (!this.spaceID && !this.planService.getChosenPlan()) {\n this.router.navigate([\"/dashboard/localisation\"]);\n }\n }\n\n setupMenuItems() {\n this.menuItems = [\n { label: \"Locations\", url: \"/localisation\" },\n {\n label: this.currentSpace.name,\n url: `/localisation/${this.spaceID}`,\n },\n {\n label: \"Plans\",\n url: `/localisation/${this.currentSpace.id}/plans`,\n },\n {\n label: \"Edit\",\n url: `/localisation/${this.currentSpace.id}/plan-edit?spaceID=${this.currentSpace.id}`,\n },\n ];\n }\n\n @HostListener(\"window:message\", [\"$event\"])\n async switchAction(event) {\n if (event.origin === window.location.origin) {\n switch (event.data.message) {\n case \"save\":\n this.onSave(event.data.redirect);\n break;\n case \"close\":\n this.onCancel();\n break;\n case \"new-zone\":\n const modalReference = this.modalService.open(\n this.loadingModal,\n );\n const svg = unescape(\n encodeURIComponent(\n this.svgEditor.svgCanvas.getSvgString(),\n ),\n );\n\n const base64 = `data:image/svg+xml;base64,${window.btoa(\n svg,\n )}`;\n const currentSpace = await this.spaceService.getSpace(\n this.spaceID,\n );\n\n this.images360 = await this.visitService.loadImagesForSpace(\n currentSpace,\n );\n\n this.editedPlan = { ...this.chosenPlan };\n this.editedPlan.filepath = base64;\n this.newZoneData = event.data.zoneData;\n if (this.newZoneData.elements.length === 0) {\n modalReference.close();\n alert(this.translate.instant(\"edition.no-zone\"));\n break;\n }\n this.zones = await this.zoneService.getZonesBySpace(\n this.spaceID,\n );\n // this.zones = sortAlphabeticallyOnName(this.zones);\n // console.log(\"zones\", this.zones);\n // this.editedZone = this.zones.find(\n // (z) => z.name === this.newZoneData.name,\n // );\n this.resetNavigations();\n modalReference.close();\n this.modalService.open(this.dialogZone);\n\n break;\n\n default:\n break;\n }\n }\n }\n\n async resetNavigations() {\n this.navigations = [];\n const defaultZone = this.zones.find((zone) => !zone.parentID);\n if (defaultZone.sweepIDs.length > 0) {\n this.navigations = defaultZone.sweepIDs;\n }\n }\n\n async onLoad(svgEditor) {\n if (svgEditor.contentWindow.SvgEditor) {\n this.svgEditorIframe = svgEditor;\n this.svgEditor = new svgEditor.contentWindow.SvgEditor();\n\n await this.svgEditor.init();\n await this.svgEditor.setConfig(this.config, {\n allowInitialUserOverride: true,\n });\n\n if (this.chosenPlan && this.chosenPlan.extension === \"svg\") {\n this.loadSvg();\n }\n if (this.chosenPlan && this.chosenPlan.extension === \"pdf\") {\n this.loadPdf();\n }\n if (!this.chosenPlan.calibration || !this.chosenPlan.isModified) {\n setTimeout(() => {\n this.svgEditorIframe.contentWindow.postMessage(\n { action: \"disable-zone\" },\n \"*\",\n );\n }, 1000);\n }\n\n this.svgEditor.svgCanvas.setMode('ext-panning');\n this.svgEditor.bottomPanel.changeZoom(50)\n }\n }\n\n async onSave(redirect: boolean) {\n const imgBlob = await new Blob(\n [this.svgEditor.svgCanvas.getSvgString()],\n {\n type: \"image/svg+xml\",\n },\n );\n const [name] = this.chosenPlan.name.split(\".\");\n const imgFile: File = new File([imgBlob], `${name}-edited.svg`, {\n type: \"image/svg+xml\",\n lastModified: Date.now(),\n });\n this.planService.setPlanFileCache(imgFile);\n if (this.chosenPlan.isModified) {\n this.ngZone.run(() =>\n this.modalService.open(this.dialog));\n } else {\n this.ngZone.run(() =>\n this.router.navigate([\n \"/dashboard/localisation\",\n this.spaceID,\n \"plans\",\n ]));\n }\n }\n\n async updateSvg() {\n const newUrl = await this.planService.updatePlanFile();\n await this.planService.updatePlan({\n id: this.chosenPlan.id,\n annexe: newUrl,\n });\n this.planService.setPlanFileCache(null);\n this.ngZone.run(() =>\n this.router.navigate([\n \"/dashboard/localisation\",\n this.spaceID,\n \"plans\",\n ]));\n }\n\n async newSvg() {\n this.ngZone.run(() =>\n this.router.navigate([\n \"/dashboard/localisation\",\n this.spaceID,\n \"plans\",\n ]));\n }\n\n async onCancel() {\n if (window.confirm(this.translate.instant(\"edition.cancel-alert\"))) {\n this.ngZone.run(() =>\n this.router.navigate([\n \"/dashboard/localisation\",\n this.spaceID,\n \"plans\",\n ]));\n alert(this.translate.instant(\"edition.cancel\"));\n }\n }\n\n async loadSvg() {\n const svgRequest: any = await downloadFileAsObject(\n this.chosenPlan.annexe,\n );\n if (svgRequest) {\n const svgBlob = await svgRequest.Body;\n const reader = new FileReader();\n reader.onloadend = () => {\n this.svgEditor.loadFromDataURI(reader.result);\n };\n reader.readAsDataURL(svgBlob);\n }\n }\n\n async loadPdf() {\n this.svgEditorIframe.contentWindow.postMessage(\n { action: \"disable-zone\" },\n \"*\",\n );\n const canvas = document.querySelector(\n \"#canvas4pdf\",\n ) as HTMLCanvasElement;\n const context = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n\n const pdfjs = await import(\"pdfjs-dist\");\n pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/4.4.168/pdf.worker.min.mjs`;\n\n const pdf: PDFDocumentProxy = await getDocument(\n this.chosenPlan.filepath,\n ).promise;\n const page = await pdf.getPage(1);\n\n const viewPortParameters = { scale: 1.5 };\n const viewport = page.getViewport(viewPortParameters);\n this.svgEditor.svgCanvas.setResolution(viewport.width, viewport.height);\n\n canvas.height = viewport.height;\n canvas.width = viewport.width;\n const renderContext = {\n canvasContext: context,\n viewport,\n };\n const renderTask = page.render(renderContext).promise;\n renderTask.then(() => {\n const newImage = this.svgEditor.svgCanvas.addSVGElementFromJson({\n element: \"image\",\n attr: {\n x: 0,\n y: 0,\n width: viewport.width,\n height: viewport.height,\n id: this.svgEditor.svgCanvas.getNextId(),\n style: \"pointer-events:inherit\",\n },\n });\n this.svgEditor.svgCanvas.setHref(\n newImage,\n canvas.toDataURL(\"image/png\"),\n );\n\n this.svgEditor.svgCanvas.renameCurrentLayer(this.translate.instant(\"edition.plan-base\"));\n this.svgEditor.svgCanvas.createLayer(this.translate.instant(\"edition.personalization\"));\n });\n }\n\n async onLoadImg(img: any) {\n this.svgEditorIframe.contentWindow.postMessage(\n { action: \"disable-zone\" },\n \"*\",\n );\n const imgRequest: any = await downloadFileAsObject(\n this.chosenPlan.annexe,\n );\n if (imgRequest) {\n const imgBlob = await imgRequest.Body;\n const imgWidth = img.naturalWidth;\n const imgHeight = img.naturalHeight;\n // await this.svgEditor.setConfig({\n // dimensions: [imgWidth, imgHeight],\n // });\n this.svgEditor.svgCanvas.setResolution(imgWidth, imgHeight);\n\n const reader = new FileReader();\n reader.onloadend = () => {\n const newImage = this.svgEditor.svgCanvas.addSVGElementFromJson(\n {\n element: \"image\",\n attr: {\n x: 0,\n y: 0,\n width: imgWidth,\n height: imgHeight,\n id: this.svgEditor.svgCanvas.getNextId(),\n style: \"pointer-events:inherit\",\n },\n },\n );\n this.svgEditor.svgCanvas.setHref(newImage, reader.result);\n this.svgEditor.svgCanvas.renameCurrentLayer(this.translate.instant(\"edition.plan-base\"));\n this.svgEditor.svgCanvas.createLayer(this.translate.instant(\"edition.personalization\"));\n };\n reader.readAsDataURL(imgBlob);\n }\n }\n\n onNewZone(event) {\n this.isNewZone = false;\n if (event) {\n this.svgEditorIframe.contentWindow.postMessage(\n { action: \"rename-layer\", name: event },\n \"*\",\n );\n } else {\n this.svgEditorIframe.contentWindow.postMessage(\n { action: \"cancel-layer\" },\n \"*\",\n );\n }\n }\n\n}\n","<div class=\"row mt-3\">\n <div class=\"col\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems'></lib-tab-navigation>\n </div>\n </div>\n</div>\n<lib-add-zone *ngIf=\"isNewZone\" [images360]=\"images360\" [spaceID]=\"spaceID\" [navigationIDs]=\"navigations\"\n [zoneEdit]=\"editedZone\" [zones]=\"zones\" (updatedZone)=\"onNewZone($event)\" [chosenPlan]=\"editedPlan\"\n [newZoneDataFromEditor]=\"newZoneData\"></lib-add-zone>\n<iframe *ngIf=\"editorUrl\" #svgEditor [src]=\"editorUrl | safeUrl\" frameborder=\"0\"\n style=\"height:100%;width:100%;min-height:550px;max-height:750px\" (load)=\"onLoad(svgEditor)\"></iframe>\n<!-- chosenPlan && -->\n<!-- ./../../../../../../assets/svgeditor/index.html -->\n\n<img #imgPng *ngIf=\"chosenPlan && chosenPlan.extension !== 'svg' && svgEditor\" [src]=\"chosenPlan.filepath\"\n (load)=\"onLoadImg(imgPng)\" style=\"display: none;\">\n\n<canvas id=\"canvas4pdf\" style=\"display: none;\"></canvas>\n\n<ng-template #dialog let-modal>\n\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n {{'save plan edited' | translate}}\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"newSvg();modal.close('Close click')\">{{'Yes' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"updateSvg();modal.close('Close click')\">{{'No' |\n translate}}</button>\n </div>\n\n</ng-template>\n\n<ng-template #dialogZone let-modal>\n\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n {{'confirm.new-zone-from-plan' | translate}}\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-dark\"\n (click)=\"isNewZone = true;modal.close('Close click')\">{{'Validate' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"modal.close('Close click')\">{{'Cancel' |\n translate}}</button>\n </div>\n\n</ng-template>\n\n<ng-template #preparing let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Processing' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"d-flex justify-content-center\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n </div>\n\n</ng-template>","import { NgModule } from \"@angular/core\";\nimport { Routes, RouterModule } from \"@angular/router\";\nimport { CalibrationComponent } from \"./components/plans/calibration/calibration.component\";\nimport { DetailLocationComponent } from \"./components/detail-location/detail-location.component\";\nimport { EditPlanComponent } from \"./components/plans/edit-plan/edit-plan.component\";\nimport { ImagesComponent } from \"./components/images/images.component\";\nimport { LocationsComponent } from \"./components/locations/locations.component\";\nimport { PlansComponent } from \"./components/plans/plans.component\";\nimport { VisitsComponent } from \"./components/visits/visits.component\";\nimport { Models3dComponent } from \"./components/models3d/models3d.component\";\nimport { ZonesComponent } from \"./components/zones/zones.component\";\n\nconst routes: Routes = [\n {\n path: \"\",\n component: LocationsComponent,\n },\n {\n path: \":id\",\n children: [\n { path: \"\", component: DetailLocationComponent },\n { path: \"zones\", component: ZonesComponent },\n { path: \"visits\", component: VisitsComponent },\n { path: \"models3d\", component: Models3dComponent },\n { path: \"plans\", component: PlansComponent },\n {\n path: \"plan-calibration\",\n component: CalibrationComponent,\n },\n {\n path: \"plan-edit\",\n component: EditPlanComponent,\n },\n { path: \"images\", component: ImagesComponent },\n ],\n },\n ];\n \n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class LocationsRoutingModule { }","import { NgModule } from '@angular/core';\nimport { LocationsComponent } from './components/locations/locations.component';\nimport { DetailLocationComponent } from './components/detail-location/detail-location.component';\nimport { CalibrationComponent } from './components/plans/calibration/calibration.component';\nimport { PlansComponent } from './components/plans/plans.component';\nimport { VisitsComponent } from './components/visits/visits.component';\nimport { Models3dComponent } from './components/models3d/models3d.component';\nimport { ZonesComponent } from './components/zones/zones.component';\nimport { ImagesComponent } from './components/images/images.component';\nimport { EditPlanComponent } from './components/plans/edit-plan/edit-plan.component';\nimport { LocationsRoutingModule } from './ngx-smarterplan-location-routing.module';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TabNavigationComponent } from './components/tab-navigation/tab-navigation.component';\nimport { MapComponent } from './components/locations/map/map.component';\nimport { LeafletModule } from '@asymmetrik/ngx-leaflet';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { MapPopupComponent } from './components/locations/map/map-popup/map-popup.component';\nimport { CommonModule } from '@angular/common';\nimport { FormLocationComponent } from './components/form-location/form-location.component';\nimport { NgbAlertModule, NgbModule } from \"@ng-bootstrap/ng-bootstrap\";\nimport { ClipboardModule } from \"@angular/cdk/clipboard\";\nimport { ChevronComponent } from './components/chevron/chevron.component';\nimport { AddZoneComponent } from './components/zones/add-zone/add-zone.component';\nimport { SelectionComponent } from './components/zones/add-zone/selection/selection.component';\nimport { CarouselComponent } from './components/carousel/carousel.component';\nimport { NgxSmarterplanCoreModule } from '@smarterplan/ngx-smarterplan-core';\nimport { PdfViewerModule } from 'ng2-pdf-viewer';\nimport { SweepPlanSelectionComponent } from './components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component';\nimport { AddAudioZoneComponent } from './components/zones/add-audio-zone/add-audio-zone.component';\nimport { RadioButtonComponent } from './radio-button/radio-button.component';\nimport { PlanLegendComponent } from './components/plan-legend/plan-legend.component';\nimport { CountAudioSweepsPipe } from './pipes/count-audio-sweeps.pipe';\nimport { LandmarkPickerComponent } from './components/landmark-picker/landmark-picker.component';\n\n@NgModule({\n declarations: [\n LocationsComponent,\n DetailLocationComponent,\n LandmarkPickerComponent,\n CalibrationComponent,\n PlansComponent,\n VisitsComponent,\n Models3dComponent,\n ZonesComponent,\n ImagesComponent,\n EditPlanComponent,\n TabNavigationComponent,\n MapComponent,\n MapPopupComponent,\n FormLocationComponent,\n ChevronComponent,\n AddZoneComponent,\n SelectionComponent,\n CarouselComponent,\n SweepPlanSelectionComponent,\n AddAudioZoneComponent,\n RadioButtonComponent,\n PlanLegendComponent,\n CountAudioSweepsPipe,\n ],\n imports: [\n PdfViewerModule,\n ClipboardModule,\n NgbModule,\n NgbAlertModule,\n CommonModule,\n TranslateModule.forChild({\n extend: true\n }),\n LeafletModule,\n FormsModule,\n ReactiveFormsModule,\n NgxSmarterplanCoreModule,\n LocationsRoutingModule,\n ],\n exports: [MapComponent, TabNavigationComponent]\n})\nexport class NgxSmarterplanLocationsModule { }\n","/*\n * Public API Surface of ngx-smarterplan-locations\n */\n\nexport * from './lib/ngx-smarterplan-locations.service';\nexport * from './lib/ngx-smarterplan-locations.module';\n\n// Components\n\nexport * from './lib/components/locations/map/map.component';\nexport * from './lib/components/tab-navigation/tab-navigation.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1","i3","i5","i5.TabNavigationComponent","i6.MapComponent","i7.FormLocationComponent","i8","i4","i6","i7","i8.LandmarkPickerComponent","i9.TabNavigationComponent","i10.FormLocationComponent","i7.TabNavigationComponent","i8.ChevronComponent","i5.SelectionComponent","i6.RadioButtonComponent","i7.PlanLegendComponent","i4.CarouselComponent","i5.SweepPlanSelectionComponent","i6.SweepPlanSelectionComponent","i6.ChevronComponent","i7.AddZoneComponent","i8.AddAudioZoneComponent","i9.PlanLegendComponent","i10.CountAudioSweepsPipe","i6.CarouselComponent","i6.TabNavigationComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"smarterplan-ngx-smarterplan-locations.mjs","sources":["../../../projects/ngx-smarterplan-locations/src/lib/ngx-smarterplan-locations.service.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/tab-navigation/tab-navigation.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/tab-navigation/tab-navigation.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/map/map-popup/map-popup.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/map/map-popup/map-popup.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/map/map.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/map/map.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/form-location/form-location.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/form-location/form-location.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/locations.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/locations/locations.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/landmark-picker/landmark-picker.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/landmark-picker/landmark-picker.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/models3d/models3d.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/models3d/models3d.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/carousel/carousel.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/carousel/carousel.component.html","../../../projects/ngx-smarterplan-locations/src/lib/helper.service.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/selection/selection.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/selection/selection.component.html","../../../projects/ngx-smarterplan-locations/src/lib/radio-button/radio-button.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/radio-button/radio-button.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/plan-legend/plan-legend.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/plan-legend/plan-legend.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/add-zone.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-zone/add-zone.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-audio-zone/add-audio-zone.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/add-audio-zone/add-audio-zone.component.html","../../../projects/ngx-smarterplan-locations/src/lib/pipes/count-audio-sweeps.pipe.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/zones.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/zones/zones.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/images/images.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/images/images.component.html","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/edit-plan/edit-plan.component.ts","../../../projects/ngx-smarterplan-locations/src/lib/components/plans/edit-plan/edit-plan.component.html","../../../projects/ngx-smarterplan-locations/src/lib/ngx-smarterplan-location-routing.module.ts","../../../projects/ngx-smarterplan-locations/src/lib/ngx-smarterplan-locations.module.ts","../../../projects/ngx-smarterplan-locations/src/public-api.ts","../../../projects/ngx-smarterplan-locations/src/smarterplan-ngx-smarterplan-locations.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NgxSmarterplanLocationsService {\n\n constructor() { }\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { MenuItem } from '@smarterplan/ngx-smarterplan-core';\n\n@Component({\n selector: 'lib-tab-navigation',\n templateUrl: './tab-navigation.component.html',\n styleUrls: ['./tab-navigation.component.scss']\n})\nexport class TabNavigationComponent {\n\n @Output() onGoBack = new EventEmitter<void>();\n\n @Input() menuItems: MenuItem[] = [];\n\n constructor(private router: Router) { }\n\n onClick(url: string, parameter: any, index: number) {\n if (index === this.menuItems.length - 1) {\n return;\n }\n if (url) {\n const newURL = `/dashboard${url}`;\n if (this.router.url !== newURL) {\n console.log('new url', newURL);\n this.router.navigate([newURL]);\n } else {\n this.onGoBack.emit(parameter);\n }\n } else {\n this.onGoBack.emit(parameter);\n }\n }\n\n}\n","<span class=\"menu\">\n <span *ngFor=\"let item of menuItems; let index = index;\">\n <span class=\"item\" [ngClass]=\"{'current':index === menuItems.length - 1}\"\n (click)=\"onClick(item.url,item.back, index)\">{{item.label | translate}}</span> <span\n *ngIf=\"index !== menuItems.length - 1\" class=\"separator\">></span>\n </span>\n</span>\n","import { Component, NgZone, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Marker } from 'leaflet';\nimport { Space, Visit } from '@smarterplan/ngx-smarterplan-core';\n\n@Component({\n selector: 'lib-map-popup',\n templateUrl: './map-popup.component.html',\n styleUrls: ['./map-popup.component.scss']\n})\nexport class MapPopupComponent implements OnInit {\n\n space: Space;\n\n marker: Marker;\n\n popuparea: HTMLElement;\n\n isOnPopup = false;\n\n isMuseumUser = true;\n\n constructor(private router: Router, private ngZone: NgZone) { }\n\n ngOnInit() {\n this.marker.on(\"click\", () => this.onClickVisitFirst());\n\n this.marker.on(\"mouseover\", () => {\n this.isOnPopup = true;\n if (!this.marker.isPopupOpen()) {\n this.openPopup();\n }\n });\n }\n\n openPopup() {\n this.marker.openPopup();\n\n this.isOnPopup = false;\n this.popuparea = document.querySelector(\".leaflet-popup\") as HTMLElement;\n\n if (this.popuparea) {\n this.popuparea.addEventListener(\"mouseleave\", () => {\n this.closePopup();\n });\n this.popuparea.addEventListener(\"mouseover\", () => {\n this.isOnPopup = true;\n });\n }\n this.marker.on(\"mouseout\", () => {\n this.closePopup();\n });\n }\n\n closePopup() {\n this.isOnPopup = false;\n /** We want to wait to avoid glitch */\n setTimeout(() => {\n if (!this.isOnPopup) {\n this.marker.closePopup();\n }\n }, 100);\n }\n\n onClickVisitFirst() {\n if (this.space.visits.length === 0) {\n console.log(\"No space to visit !\");\n } else {\n this.onVisitClick(this.space.visits[0]);\n }\n }\n\n async onVisitClick(visit: Visit) {\n this.ngZone.run(() => {\n this.router.navigate([\"visit\", this.space.id], {\n queryParams: { model3D: visit.model3d },\n });\n });\n }\n\n}\n","<div id=\"map-popup\">\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\n <img [src]=\"space.annexes\" />\n </div>\n <div class=\"map-popup-details\">\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\n <span class=\"map-popup-address\">{{space.addresses}}</span>\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\n [style.cursor]=\"'pointer'\">➤ {{ visit.name ? visit.name : space.name}}</span>\n </div>\n</div>\n","import { Component, Input, OnChanges, SimpleChanges, ViewContainerRef, ViewChild, AfterViewInit } from '@angular/core';\nimport { Space } from '@smarterplan/ngx-smarterplan-core';\nimport {\n latLng,\n marker,\n tileLayer,\n Map,\n latLngBounds,\n point,\n Marker,\n icon,\n} from \"leaflet\";\nimport { MapPopupComponent } from './map-popup/map-popup.component';\n\n\nconst iconRetinaUrl = \"assets/marker-icon-2x.png\";\nconst iconUrl = \"assets/marker-icon.png\";\nconst shadowUrl = \"assets/marker-shadow.png\";\nconst iconDefault = icon({\n iconRetinaUrl,\n iconUrl,\n shadowUrl,\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n tooltipAnchor: [16, -28],\n shadowSize: [41, 41],\n});\nMarker.prototype.options.icon = iconDefault;\n@Component({\n selector: 'lib-map',\n templateUrl: './map.component.html',\n styleUrls: ['./map.component.scss']\n})\nexport class MapComponent implements OnChanges, AfterViewInit {\n\n constructor() { }\n\n @Input() spaces: Space[];\n @ViewChild('popupContainer', { read: ViewContainerRef, static: true }) popupContainer: ViewContainerRef;\n\n options = {\n layers: [\n tileLayer(\"http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\", {\n maxZoom: 18,\n attribution: \"...\",\n }),\n ],\n zoom: 5.5,\n center: latLng(47.06394, 2.77736),\n };\n\n layers: any[] = [];\n\n map: any;\n private isViewInitialized = false;\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.spaces) {\n if (this.isViewInitialized) {\n this.rebuildLayers();\n }\n }\n }\n\n ngAfterViewInit() {\n this.isViewInitialized = true;\n this.rebuildLayers();\n }\n\n private rebuildLayers() {\n if (!this.spaces) {\n return;\n }\n\n const nm = [];\n const bd = [];\n\n // Clear previous components to avoid leakage. \n // this.viewContainerRef.clear(); // Removed as we use the dedicated container\n if (this.popupContainer) {\n this.popupContainer.clear();\n }\n\n // Filtering out spaces without lat/longitudes\n for (const s of this.spaces) {\n if (s.latitude === null || s.longitude === null) {\n console.log(\n `${s.name} has not coordinates for ${s.addresses}`,\n );\n continue;\n }\n // We use the popup system from leaflet, as it packs a few improvements\n // on using bootstrap: autoclose other popups, closing option.\n const m = marker([s.latitude, s.longitude]);\n\n m.bindPopup(this.createPopupComponent(s, m));\n\n nm.push(m);\n bd.push(latLng(s.latitude, s.longitude));\n }\n // Note how we set the layers in one assignment, in order to have leaflet\n // detects the change correctly\n // We also set the bounds afterward, for the map to be properly zoomed and\n // centered\n this.layers = nm;\n if (this.map && bd.length > 0) {\n this.map.fitBounds(latLngBounds(bd), {\n padding: point(48, 48),\n maxZoom: 12,\n animate: true,\n });\n }\n }\n\n // Previous ngOnChanges logic was moved to rebuildLayers()\n\n onMapReady(map: Map) {\n this.map = map;\n }\n\n createPopupComponent(space: Space, marker: Marker) {\n if (!this.popupContainer) {\n console.warn(\"Popup container not ready yet\");\n return \"\";\n }\n const comp = this.popupContainer.createComponent(MapPopupComponent);\n comp.instance.space = space;\n comp.instance.marker = marker;\n comp.changeDetectorRef.detectChanges();\n return comp.location.nativeElement;\n }\n\n}\n","<div [leafletLayers]=\"layers\" [leafletOptions]=\"options\" (leafletMapReady)=\"onMapReady($any($event))\" id=\"map\" leaflet\n style=\"height: 500px; margin-top: 30px; z-index: 195\"></div>\n\n<!-- Hidden container for popup components to avoid display leakage and manage lifecycle -->\n<div style=\"display: none\">\n <div #popupContainer></div>\n</div>","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\nimport { UntypedFormGroup, UntypedFormBuilder, Validators, AbstractControl } from '@angular/forms';\nimport { Space, LevelStatus, SpaceService, PropertyService, BaseUserService, MissionService, enumToArray, uploadFileToS3, Layer, PropertyType, getSignedImageUrlForSpace, LayerService, deleteFromS3 } from '@smarterplan/ngx-smarterplan-core';\nimport { ValidatorsService, textValidator, noEmptyValidator, floatValidator } from \"@smarterplan/ngx-smarterplan-core\";\n\n@Component({\n selector: 'lib-form-location',\n templateUrl: './form-location.component.html',\n styleUrls: ['./form-location.component.scss']\n})\nexport class FormLocationComponent implements OnInit {\n\n form: UntypedFormGroup;\n\n @ViewChild(\"imageInputContainer\")\n imageInputContainer: ElementRef;\n\n @ViewChild(\"imageInput\")\n imageInput: ElementRef;\n\n @ViewChild(\"imageBasePreview\")\n imageBasePreview: ElementRef;\n\n @Input()\n location: Space;\n\n imageToUpload: any;\n\n isSubmitted = false;\n\n levels: Array<LevelStatus>;\n\n addMissionForNewSpace = true;\n\n imageInputText: string;\n\n currentImage: string;\n\n imageToBeDeleted: boolean = false;\n\n errorForm: boolean = false;\n\n @Output() onChange = new EventEmitter<Space | null>();\n\n constructor(\n private spaceService: SpaceService,\n private propertyService: PropertyService,\n private userService: BaseUserService,\n private fb: UntypedFormBuilder,\n private missionService: MissionService,\n private layerService: LayerService,\n public validatorsService: ValidatorsService\n ) {\n this.levels = enumToArray(LevelStatus);\n }\n\n ngOnInit(): void {\n if (this.location) {\n this.initEditForm();\n } else {\n this.initForm();\n }\n this.handleInputImageText();\n }\n\n initForm() {\n this.form = this.fb.group({\n name: [\"\", [Validators.required, Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n addresses: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n latitude: [null, [Validators.maxLength(255), noEmptyValidator(), floatValidator()]],\n longitude: [null, [Validators.maxLength(255), noEmptyValidator(), floatValidator()]],\n level: LevelStatus.LOW,\n classGes: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n classEnergyConsumption: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n constructionYear: [\"\", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n });\n }\n\n initEditForm() {\n this.form = this.fb.group({\n id: this.location.id,\n name: [this.location.name, [Validators.required, Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n addresses: [this.location.addresses, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n latitude: [this.location.latitude, [Validators.maxLength(255), floatValidator()]],\n longitude: [this.location.longitude, [Validators.maxLength(255), floatValidator()]],\n level: this.location.level,\n classGes: [this.location.classGes, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n classEnergyConsumption: [this.location.classEnergyConsumption, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n constructionYear: [this.location.constructionYear, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],\n });\n }\n\n handleImageInput(target: EventTarget) {\n this.imageToUpload = (target as HTMLInputElement).files[0];\n if (this.imageToUpload) {\n this.imageInputContainer.nativeElement.style.display = \"none\";\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n this.currentImage = reader.result as string;\n });\n reader.readAsDataURL(this.imageToUpload);\n }\n }\n\n async uploadImage(spaceID: string) {\n if (this.imageToUpload) {\n uploadFileToS3(\"locations/\", this.imageToUpload, spaceID).then(\n async (url) => {\n if (url) {\n await this.spaceService.updateSpace({\n id: spaceID,\n annexes: url,\n });\n }\n },\n );\n } else if (this.imageToBeDeleted) {\n await this.spaceService.updateSpace({\n id: spaceID,\n annexes: null,\n });\n await deleteFromS3(this.location.annexes);\n }\n }\n\n clearImageFile() {\n this.imageToUpload = null;\n this.currentImage = null;\n this.imageInputContainer.nativeElement.style.display = \"flex\";\n this.imageInput.nativeElement.value = \"\";\n this.imageInputText = \"Add picture\";\n }\n\n async getLayerByName(name: string): Promise<Layer> {\n const currentOrgId = this.userService.currentOrganisation().id;\n const layers = await this.layerService.getLayerByNameForOrganisation(\n name,\n currentOrgId,\n );\n if (layers) {\n return layers[0];\n }\n // create then\n return this.layerService.createLayerForOrganisation(name, currentOrgId);\n }\n\n async onSubmit() {\n this.isSubmitted = true;\n if (!this.form.valid) {\n this.errorForm = true;\n return;\n }\n try {\n this.errorForm = false;\n let space;\n if (this.location) {\n this.changeCommaToDot();\n space = await this.spaceService.updateSpace(this.form.value);\n if (space) {\n await this.uploadImage(space.id);\n this.location = space;\n this.onChange.emit(space);\n }\n } else {\n this.changeCommaToDot();\n const spaceInput = this.form.value as Space;\n const currentOrgID = this.userService.currentOrganisation().id;\n spaceInput.organisationID = currentOrgID;\n let layer = await this.getLayerByName(\"BUILDING\");\n if (!layer) {\n layer = await this.layerService.createLayerForOrganisation(\n \"BUILDING\",\n currentOrgID,\n );\n }\n space = await this.spaceService.createSpace(\n spaceInput,\n layer,\n );\n\n const missions = this.userService.getManagerMissions();\n if (space && missions.length > 0) {\n const exampleMission = missions[0];\n await this.uploadImage(space.id);\n try {\n await this.propertyService.createProperty({\n type: PropertyType.PROPERTY,\n spaceID: space.id,\n organisationID: currentOrgID,\n });\n } catch (e) {\n console.log(\"API Service does not have Property requests\");\n }\n\n // add directly a mission for this space\n if (this.addMissionForNewSpace) {\n await this.missionService.create({\n spaceID: space.id,\n userID: exampleMission.userID,\n role: exampleMission.role,\n level: exampleMission.level,\n organisationID: exampleMission.organisationID,\n orderedOrganisationID:\n exampleMission.organisationID,\n });\n }\n this.onChange.emit(space);\n } else {\n this.onChange.emit(null);\n }\n }\n } catch (error) {\n console.error(error);\n this.onChange.emit(null);\n }\n }\n\n onCancel() {\n this.form.reset();\n this.onChange.emit(null);\n }\n\n get name(): AbstractControl {\n return this.form.get(\"name\");\n }\n\n changeCommaToDot() {\n const updatedSpace = this.form.value;\n if (\n updatedSpace.latitude &&\n updatedSpace.latitude.toString().includes(\",\")\n ) {\n updatedSpace.latitude = updatedSpace.latitude\n .toString()\n .replace(\",\", \".\");\n Number.parseFloat(updatedSpace.latitude);\n }\n if (\n updatedSpace.longitude &&\n updatedSpace.longitude.toString().includes(\",\")\n ) {\n updatedSpace.longitude = updatedSpace.longitude\n .toString()\n .replace(\",\", \".\");\n Number.parseFloat(updatedSpace.longitude);\n }\n }\n\n handleInputImageText() {\n if (this.location && this.location.annexes) {\n this.imageInputText = \"Change picture\";\n getSignedImageUrlForSpace(this.location).then((url) => {\n if (url) {\n this.currentImage = url;\n }\n });\n } else {\n this.imageInputText = \"Add picture\";\n }\n }\n\n\n isFormError(control) {\n return control && control.invalid && this.errorForm;\n }\n\n\n onFormChange() {\n if (this.errorForm && this.form.valid) {\n this.errorForm = false;\n }\n\n }\n}\n","<div class=\"col-md-6 form-new-loc\" *ngIf=\"form\">\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" data-testid=\"new-location-name\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['name'])|| isFormError(form.controls['name'])}\"\n required formControlName=\"name\">\n\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-name-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['name']) \n || isFormError(form.controls['name'])\">\n {{validatorsService.getError(form.controls['name']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"addresses\" data-testid=\"new-location-address\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['addresses']) || isFormError(form.controls['addresses'])}\">\n <div class=\"invalid-feedback\">\n <span data-testid=\"\" [translate]=\"validatorsService.getError(form.controls['addresses'])\"\n *ngIf=\" validatorsService.isControlError(form.controls['addresses'])\"></span>\n\n <ngb-alert data-testid=\"new-location-address-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['addresses']) \">\n\n {{validatorsService.getError(form.controls['addresses']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Construction year' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"constructionYear\"\n data-testid=\"new-location-constructionYear\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-constructionYear-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])\">\n {{validatorsService.getError(form.controls['constructionYear']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Latitude' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"latitude\" data-testid=\"new-location-latitude\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['latitude'])|| isFormError(form.controls['latitude'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-latitude-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['latitude']) || isFormError(form.controls['latitude'])\">\n {{validatorsService.getError(form.controls['latitude']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Longitude' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"longitude\" data-testid=\"new-location-longitude\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['longitude'])|| isFormError(form.controls['longitude'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-longitude-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['longitude']) || isFormError(form.controls['longitude'])\">\n {{validatorsService.getError(form.controls['longitude']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Access level' | translate}}</label>\n <div class=\"col-sm-9\">\n <select class=\"d-inline-block custom-select rounded-pill\" formControlName=\"level\">\n <option *ngFor=\"let level of levels\" [value]=\"level\">{{level | translate}}</option>\n </select>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Energy Class' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"classEnergyConsumption\"\n data-testid=\"new-location-classEnergyConsumption\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-classEnergyConsumption-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])\">\n {{validatorsService.getError(form.controls['classEnergyConsumption']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Greenhouse gas emission Class' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"classGes\" data-testid=\"new-location-classGes\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classGes'])|| isFormError(form.controls['classGes'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-classGes-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['classGes']) || isFormError(form.controls['classGes'])\">\n {{validatorsService.getError(form.controls['classGes']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Cover picture' | translate}}</label>\n <div class=\"col-sm-9\">\n <img #imageBasePreview *ngIf=\"currentImage\" class=\"image-preview\" [src]=\"currentImage\">\n <label #imageInputContainer for=\"image\"\n class=\"btn btn-label-file btn-outline-primary rounded-pill imageInputContainer\">\n <input #imageInput type=\"file\" id=\"image\" (change)=\"handleImageInput($event.target)\" />\n {{ imageInputText | translate}}</label>\n <button *ngIf=\"currentImage && !imageToUpload\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"imageToBeDeleted=true;clearImageFile()\">{{'Delete picture' | translate }}</button>\n <div class=\"image-name\" *ngIf=\"imageToUpload\">\n <p>{{ imageToUpload.name}}</p>\n <div (click)=\"clearImageFile()\" [style.cursor]=\"'pointer'\">\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"mb-3 row\" *ngIf=\"!location\">\n <label class=\"col-sm-3 col-form-label\">{{'Create mission for this space' | translate}}</label>\n <div class=\"col-sm-3\">\n <input type=\"checkbox\" [(ngModel)]=\"addMissionForNewSpace\" [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div>\n\n <button data-testid=\"new-location-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\" type=\"submit\"\n class=\"btn btn-outline-primary rounded-pill me-3\">{{'Save' | translate}}</button>\n\n <button data-testid=\"new-location-close-btn\" type=\"button\" (click)=\"onCancel()\"\n class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\n translate}}</button>\n\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\n <ngb-alert data-testid=\"new-location-form-invalid\" [dismissible]=\"false\" type=\"danger\">\n {{'errorForm.infoBtn' |translate}}\n\n </ngb-alert>\n </div>\n </form>\n</div>","import { Component, OnInit } from '@angular/core';\nimport { UntypedFormGroup } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { LevelStatus, Space, SpaceService, BaseUserService, ViewerService, NavigationService, NavigatorService, enumToArray, Visit, MenuItem, SearchObjectType, CaptureViewer } from '@smarterplan/ngx-smarterplan-core';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'lib-locations',\n templateUrl: './locations.component.html',\n styleUrls: ['./locations.component.scss']\n})\nexport class LocationsComponent implements OnInit {\n\n createForm: UntypedFormGroup;\n\n levels: Array<LevelStatus>;\n\n imageToUpload: File;\n\n isAdding = false;\n\n filteredLocations: Space[] = [];\n\n isManager = false;\n\n isMuseumUser = true;\n\n locations: Space[] = [];\n\n menuItems: MenuItem[] = [];\n\n userSubcription: Subscription;\n\n locationIDSubscription: Subscription;\n\n /** Last filtered Locations, used when we go back on all locations from the search bar location */\n lastFiltredLocations: Space[] = [];\n\n constructor(\n private spaceService: SpaceService,\n private router: Router,\n private userService: BaseUserService,\n private viewerService: ViewerService,\n private navigationService: NavigationService,\n private navigatorService: NavigatorService,\n ) {\n this.levels = enumToArray(LevelStatus);\n this.userSubcription = this.userService.isChanged.subscribe((isConnected) => {\n if (isConnected) {\n this.refresh();\n }\n });\n\n this.locationIDSubscription =\n this.navigatorService.locationIDChange.subscribe((id) => {\n this.changeSelectedLocation(id);\n this.setupMenuItems();\n });\n }\n\n async ngOnInit() {\n if (this.userService.cu) {\n this.resetList();\n this.updateUserRights();\n }\n this.setupMenuItems();\n }\n\n\n findSpaceById(id: string): Space {\n return this.locations.find((loc) => loc.id === id);\n }\n\n /**\n * Update when we change the selected location in filter (search bar)\n * @param id for a location, if null display all last filtred location\n */\n changeSelectedLocation(id?: string) {\n const space = id ? this.findSpaceById(id) : null;\n this.filteredLocations = space ? [space] : this.lastFiltredLocations; // New selected space or last filtered location\n }\n\n refresh() {\n this.updateUserRights();\n this.resetList();\n }\n\n\n ngOnDestroy() {\n this.userSubcription.unsubscribe();\n this.locationIDSubscription.unsubscribe();\n }\n\n setupMenuItems() {\n this.menuItems = [{ label: \"All Locations\", url: \"/localisation\" }];\n if (this.isAdding) {\n this.menuItems.push({ label: \"New\" });\n }\n if (this.filteredLocations.length === 1) {\n const selectedLoc = this.filteredLocations[0];\n this.menuItems.push({ label: selectedLoc.name });\n }\n }\n\n updateUserRights() {\n this.isManager = this.userService.hasManagerRoleInAnyMission();\n this.isMuseumUser = this.userService.hasOnlyMuseumRole();\n }\n\n isManagerForSpace(spaceID: string): boolean {\n return (\n this.userService.isManager(spaceID) ||\n this.userService.isGuide(spaceID)\n );\n }\n\n async resetList() {\n this.locations = await this.spaceService.getLocationsForCurrentUser();\n this.filteredLocations = this.locations;\n this.lastFiltredLocations = this.locations;\n this.isAdding = false;\n this.changeSelectedLocation(\n this.navigatorService.currentNavBarLocationID,\n ); // Set for the current selected location\n this.setupMenuItems();\n }\n\n onAddLocation() {\n this.isAdding = true;\n this.setupMenuItems();\n }\n\n handleImageInput(files: FileList) {\n this.imageToUpload = files.item(0);\n }\n\n onFormChange(event: any) {\n this.navigatorService.locationIDChange.next(\n null,\n ); /** Remove selected location */\n this.isAdding = false;\n if (event) {\n this.resetList();\n }\n this.setupMenuItems();\n }\n\n /**\n * The visits shown under a location.\n *\n * Everyone gets the first one, which is the location's main entry point. Managers also get the\n * rest, so a site carrying both a Matterport tour and one or more 3D models can be opened in\n * either without going through the admin screens.\n */\n visitsToShow(loc: Space): Visit[] {\n const visits = loc.visits ?? [];\n return this.isManagerForSpace(loc.id) ? visits : visits.slice(0, 1);\n }\n\n /** True when this visit opens in the Three.js viewer rather than Matterport. */\n isThreeJsVisit(visit: Visit): boolean {\n return visit?.viewer === CaptureViewer.THREEJS;\n }\n\n async onVisitClick(loc: Space, visit: Visit) {\n if (!this.userService.userHasAccessToAllZonesInSpace(loc.id)) {\n // get allowed sweep for the user\n const allowedSweeps =\n await this.navigationService.getAllowedSweepsIDsForUserInSpace(\n loc.id,\n );\n const firstSweep = allowedSweeps[0];\n this.viewerService.setSweepToMove(firstSweep);\n }\n if (this.userService.isGuide(loc.id)) {\n this.router.navigate([\"museum\", loc.id]);\n } else {\n this.router.navigate([\"visit\", loc.id], {\n queryParams: { model3D: visit.model3d },\n });\n }\n }\n\n applyResultsSearchBar(results: Space[]) {\n this.filteredLocations = results || this.locations;\n this.lastFiltredLocations = this.filteredLocations;\n this.navigatorService.locationIDChange.next(null); // When we search with keyword, we would like to search on all locations\n }\n\n getSearchType(): SearchObjectType {\n return SearchObjectType.LOCATION;\n }\n\n getStringNoSpace(data): string {\n return data.replace(/\\s/g, '');\n }\n\n onDetailViewClick(spaceID: string) {\n this.navigatorService.locationIDChange.next(spaceID); // Send update for the location filter bar\n this.router.navigate([\"dashboard/localisation\", spaceID]);\n }\n\n}\n","<div class=\"dashboard-tab\">\n <div class=\"header-dashboard-tab\">\n <div class=\"m-3\">\n <lib-tab-navigation (onGoBack)=\"onFormChange(null)\" [menuItems]='menuItems'></lib-tab-navigation>\n <span class=\"ml-3 refreshIcon\" (click)=\"refresh()\" *ngIf=\"!(isAdding)\" ngbTooltip=\"Refresh list\">\n <span class=\"iconify refreshIcon\" data-icon=\"ion:refresh-circle\" data-width=\"35\" data-rotate=\"90deg\"></span>\n </span>\n </div> \n <lib-search-bar *ngIf=\"!isAdding && !isMuseumUser\" [searchable]=\"locations\" [objectType]=\"getSearchType()\"\n (searchEvent)=\"applyResultsSearchBar($event)\"></lib-search-bar>\n \n <div class=\"col-md-8\">\n <div class=\"sp-row\" *ngIf=\"!isAdding && isManager\">\n <button data-testid=\"new-location-btn\" class=\"btn btn-outline-primary rounded-pill add-location\" (click)=\"onAddLocation()\">\n {{'Add location' | translate}}</button>\n <!-- <div class=\"outer_circle\">\n <button id='btn-icon' (click)=\"onAddLocation()\"></button>\n </div> -->\n </div>\n </div>\n </div>\n <hr>\n <div class=\"row\" *ngIf=\"isAdding\">\n <div class=\"col-md-6\">\n <h4>{{'New location' | translate}}</h4>\n </div>\n </div>\n <section *ngIf=\"!isAdding\">\n <div class=\"row\">\n <div class=\"col-sm-12 col-md-12 col-lg-6\" *ngIf=\"filteredLocations\">\n <ul data-testid=\"location-list-container\" class=\"list-group list-group-flush\">\n <li class=\"d-flex justify-content-between list-group-item\"\n *ngFor=\"let loc of filteredLocations; index as index\">\n <div class=\"d-flex\">\n <div class=\"col-md-5 img-main-container\">\n <div id=\"img_container\">\n <img class=\"location-img\" *ngIf=\"loc.annexes; else elseBlock\" [src]=\"loc.annexes\">\n <ng-template #elseBlock><img class=\"location-img\"\n src=\"./../../../../assets/images/visuel-off-big.jpg\" />\n </ng-template>\n <button [ngClass]=\"['open-btn-'+getStringNoSpace(loc.name)]\" *ngIf=\"isManagerForSpace(loc.id)\" class=\"btn-details\" (click)=\"onDetailViewClick(loc.id)\">\n {{'View details' | translate}}</button>\n </div>\n \n </div>\n <div class=\"col-md-7 location-info\">\n <p>{{loc.name}}</p>\n <p>{{loc.addresses}}</p>\n <!-- One entry per visit, labelled with the name the admin gave it. Everyone sees\n the first; managers also see the others, plus an icon telling the viewers\n apart - a visitor opens whichever they are given and does not need to know. -->\n <p [ngClass]=\"['view-btn-'+getStringNoSpace(loc.name)]\" *ngFor=\"let visit of visitsToShow(loc)\"\n (click)=\"onVisitClick(loc, visit)\" class=\"visit-name\" [style.cursor]=\"'pointer'\"\n [ngbTooltip]=\"isManagerForSpace(loc.id)\n ? (isThreeJsVisit(visit) ? ('3D model' | translate) : ('Matterport tour' | translate))\n : ''\">\n <span class=\"iconify visit-viewer-icon\" *ngIf=\"isManagerForSpace(loc.id)\"\n [attr.data-icon]=\"isThreeJsVisit(visit) ? 'mdi:cube-scan' : 'mdi:rotate-360'\"\n data-inline=\"false\"></span>\n {{ visit.name ? visit.name : loc.name }}\n </p>\n </div>\n </div>\n </li>\n \n </ul>\n </div>\n <div class=\"col-sm-12 col-md-12 col-lg-6\">\n <lib-map [spaces]=\"filteredLocations\"></lib-map>\n </div>\n </div>\n </section>\n <lib-form-location *ngIf=\"isAdding\" (onChange)=\"onFormChange($event)\"></lib-form-location>\n</div>\n","import {\n Component, Input, Output, EventEmitter, NgZone,\n AfterViewInit, OnChanges, OnDestroy, SimpleChanges, ViewChild, ElementRef\n} from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Vec3, ViewerService } from '@smarterplan/ngx-smarterplan-core';\n\n@Component({\n selector: 'lib-landmark-picker',\n templateUrl: './landmark-picker.component.html',\n styleUrls: ['./landmark-picker.component.scss']\n})\nexport class LandmarkPickerComponent implements OnChanges, AfterViewInit, OnDestroy {\n\n // --- Inputs / Outputs ---\n @Input() visit3dModel: string;\n @Input() sdkKey: string;\n @Input() title = '';\n\n // Allows a parent component to pre-fill a landmark (e.g. from a JSON import)\n @Input() set value(v: Vec3 | null) {\n if (v) {\n this.lastPicked = { ...v };\n this.manualX = v.x;\n this.manualY = v.y;\n this.manualZ = v.z;\n }\n }\n\n @Output() pointPicked = new EventEmitter<Vec3>();\n\n @ViewChild('mpFrame', { static: true }) iframeRef: ElementRef<HTMLIFrameElement>;\n\n // --- Public state (bound in the template) ---\n lastPicked: Vec3 | null = null;\n isReady = false;\n isPicking = false;\n loadError: string | null = null;\n\n // Manual entry fields (bound via ngModel in the template)\n manualX: number | null = null;\n manualY: number | null = null;\n manualZ: number | null = null;\n\n // --- Private state ---\n private mpSdk: any;\n private inputSceneObject: any;\n private inputComponent: any;\n private intersectionSub: any;\n private clickSpy: any;\n private currentIntersection: Vec3 | null = null;\n\n constructor(\n private viewerService: ViewerService,\n private translate: TranslateService,\n private ngZone: NgZone\n ) { }\n\n //\n // ---------- Lifecycle ----------\n //\n\n ngOnChanges(changes: SimpleChanges) {\n if ((changes['visit3dModel'] || changes['sdkKey']) && this.visit3dModel) {\n this.loadModel();\n }\n }\n\n ngAfterViewInit() {\n const iframe = this.iframeRef.nativeElement;\n\n iframe.addEventListener('load', async () => {\n if (this.mpSdk) {\n return;\n }\n try {\n const showcaseWindow = iframe.contentWindow as any;\n this.mpSdk = await showcaseWindow.MP_SDK.connect(iframe, this.sdkKey, '');\n await this.setupClickListener();\n this.isReady = true;\n } catch (err) {\n console.error('Failed to connect to Matterport SDK', err);\n this.loadError = this.translate.instant('landmarkPicker.loadError');\n }\n });\n }\n\n ngOnDestroy() {\n this.intersectionSub?.cancel();\n this.clickSpy?.cancel();\n this.inputSceneObject?.stop();\n }\n\n //\n // ---------- Public API (template-bound) ----------\n //\n\n /**\n * Starts landmark-picking mode. Native click-to-navigate is disabled for the\n * duration of the pick: otherwise the user's click can be partially consumed by\n * a camera navigation transition instead of being captured as a point selection.\n */\n startPicking() {\n if (!this.isReady) {\n return;\n }\n this.isPicking = true;\n this.setNavigationEnabled(false);\n }\n\n /** Called when the user validates manually typed x/y/z values. */\n applyManualCoordinates() {\n if (this.manualX == null || this.manualY == null || this.manualZ == null) {\n return;\n }\n this.confirmPoint({ x: this.manualX, y: this.manualY, z: this.manualZ });\n }\n\n //\n // ---------- Private helpers ----------\n //\n\n private loadModel() {\n const iframe = this.iframeRef.nativeElement;\n this.viewerService.setTourUrl({ model3d: this.visit3dModel });\n const url = this.viewerService.getTourUrl();\n iframe.setAttribute('src', url);\n }\n\n private async setupClickListener() {\n this.intersectionSub = this.mpSdk.Pointer.intersection.subscribe((intersection: any) => {\n if (intersection && intersection.position) {\n this.currentIntersection = { ...intersection.position };\n }\n });\n\n const [sceneObject] = await this.mpSdk.Scene.createObjects(1);\n const node = sceneObject.addNode();\n const inputComponent = node.addComponent('mp.input', {\n eventsEnabled: true,\n // Native navigation stays enabled by default (normal viewer behavior);\n // it is toggled off only while actively picking a landmark, see\n // setNavigationEnabled().\n userNavigationEnabled: true\n });\n sceneObject.start();\n\n const clickEmitPath = sceneObject.addEmitPath(inputComponent, 'INTERACTION.CLICK');\n this.clickSpy = sceneObject.spyOnEvent({\n path: clickEmitPath,\n // The Matterport SDK dispatches this callback outside Angular's zone\n // (it communicates with the host page via its own internal messaging,\n // not through zone-patched DOM events). Without ngZone.run(), the state\n // changes below happen correctly but Angular never re-renders the view\n // for them — the button label and \"Confirmed: ...\" text stay stale until\n // some unrelated DOM event (like clicking the button again) forces a\n // change detection cycle. Wrapping the call here fixes that: the pick is\n // reflected in the UI immediately, in a single click.\n onEvent: () => this.ngZone.run(() => this.onModelClicked())\n });\n\n this.inputSceneObject = sceneObject;\n this.inputComponent = inputComponent;\n }\n\n /**\n * Handles a click while in picking mode: confirms the point, exits picking mode,\n * and restores native navigation so the viewer behaves normally again.\n */\n private onModelClicked() {\n if (!this.isPicking || !this.currentIntersection) {\n return;\n }\n this.confirmPoint(this.currentIntersection);\n this.isPicking = false;\n this.setNavigationEnabled(true);\n }\n\n /** Common path for both click-picking and manual entry: updates state + notifies the parent. */\n private confirmPoint(point: Vec3) {\n this.lastPicked = { ...point };\n this.manualX = point.x;\n this.manualY = point.y;\n this.manualZ = point.z;\n this.pointPicked.emit(this.lastPicked);\n }\n\n /**\n * Toggles the viewer's native click-to-navigate behavior on the mp.input component.\n * Disabled while picking a landmark so the user's click can only be captured as a\n * point selection instead of being intercepted by a camera navigation transition.\n */\n private setNavigationEnabled(enabled: boolean) {\n if (this.inputComponent) {\n this.inputComponent.inputs.userNavigationEnabled = enabled;\n }\n }\n}","<div class=\"landmark-picker border rounded p-2\">\n <p *ngIf=\"title\" class=\"fw-bold small mb-1\">{{ title }}</p>\n\n <iframe #mpFrame width=\"100%\" height=\"380\" frameborder=\"0\" allow=\"xr-spatial-tracking\" allowfullscreen></iframe>\n\n <div *ngIf=\"loadError\" class=\"text-danger small mt-1\">{{ loadError }}</div>\n\n <div class=\"d-flex align-items-center mt-2 mb-2\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary me-3\" [disabled]=\"!isReady\"\n (click)=\"startPicking()\">\n {{ (isPicking ? 'landmarkPicker.pickButtonPicking' : (lastPicked ? 'landmarkPicker.pickButtonAgain' :\n 'landmarkPicker.pickButtonInitial')) | translate }}\n </button>\n </div>\n\n <!-- Manual coordinate entry -->\n <div class=\"row g-1 align-items-center\">\n <div class=\"col-3\">\n <input type=\"number\" step=\"0.001\" class=\"form-control form-control-sm\"\n [placeholder]=\"'landmarkPicker.placeholderX' | translate\" [(ngModel)]=\"manualX\">\n </div>\n <div class=\"col-3\">\n <input type=\"number\" step=\"0.001\" class=\"form-control form-control-sm\"\n [placeholder]=\"'landmarkPicker.placeholderY' | translate\" [(ngModel)]=\"manualY\">\n </div>\n <div class=\"col-3\">\n <input type=\"number\" step=\"0.001\" class=\"form-control form-control-sm\"\n [placeholder]=\"'landmarkPicker.placeholderZ' | translate\" [(ngModel)]=\"manualZ\">\n </div>\n <div class=\"col-3\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary w-100\" (click)=\"applyManualCoordinates()\">\n {{ 'landmarkPicker.apply' | translate }}\n </button>\n </div>\n </div>\n\n <span *ngIf=\"lastPicked\" class=\"text-success small d-block mt-1\">\n {{ 'landmarkPicker.confirmed' | translate: { x: lastPicked.x.toFixed(3), y: lastPicked.y.toFixed(3), z:\n lastPicked.z.toFixed(3) } }}\n </span>\n</div>","import { Component, Inject, OnInit, OnDestroy } from '@angular/core';\nimport { UntypedFormGroup } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\n\nimport {\n MATTERPORT_SDK_KEY,\n MenuItem, SpaceService, BaseUserService, NavigatorService, SpaceStatus, Space,\n MatterportTagCopyService, CopyProgress, CopyLogEntry,\n Vec3, distance,\n Visit,\n VisitService,\n CaptureViewer\n} from '@smarterplan/ngx-smarterplan-core';\nimport { Subject, takeUntil } from 'rxjs';\n\n// Minimum distance (in meters) required between the two landmarks for a reliable rotation calculation\nconst MIN_LANDMARK_DISTANCE = 1.5;\n\n@Component({\n selector: 'lib-detail-location',\n templateUrl: './detail-location.component.html',\n styleUrls: ['./detail-location.component.scss']\n})\nexport class DetailLocationComponent implements OnInit, OnDestroy {\n\n // --- Location details ---\n space: Space;\n editForm: UntypedFormGroup;\n isEditing = false;\n imageToUpload: File;\n id: string;\n menuItems: MenuItem[] = [];\n\n // --- DPE (energy diagnostic) ---\n isValidatingDpe = false;\n selectedDpeResult: any;\n gettingData = false;\n parsedMetadata: {\n geo_adresse: string;\n secteur_activite: string;\n annee_construction: string;\n classe_consommation_energie: string;\n classe_estimation_ges: string;\n selected: boolean;\n }[];\n\n guestLink: string;\n canArchive: boolean;\n destroy$ = new Subject();\n\n // --- Copy POIs between visits ---\n isAdmin: boolean = false;\n spaces: Space[] = [];\n\n // Whether the \"copy POIs\" admin form is currently visible (collapsed by default)\n showCopyPoisForm = false;\n\n // Selected source SPACE (a space may contain 0..N visits/models)\n selectedSourceSpaceId: string | null = null;\n\n // Selected 3D model ids (visit.model3d) — this is what actually gets loaded in the viewer\n selectedSource3dModel: string | null = null;\n selectedTarget3dModel: string | null = null;\n\n // Visits available for the selected source space, and for the current (target) space\n sourceVisits: Visit[] = [];\n visits: Visit[] = [];\n\n /** The capture a visitor opens by default, of any viewer type. Null means none chosen. */\n defaultCaptureID: string | null = null;\n\n savingDefaultCapture = false;\n\n defaultCaptureError: string | null = null;\n\n // 3D landmark points picked directly in each viewer (source and target)\n landmarkSourceA: Vec3 | null = null;\n landmarkTargetA: Vec3 | null = null;\n landmarkSourceB: Vec3 | null = null;\n landmarkTargetB: Vec3 | null = null;\n\n isCopyingPois = false;\n copyPoisResultMsg: string | null = null;\n copyProgress: CopyProgress | null = null;\n copyLog: CopyLogEntry[] = [];\n\n constructor(\n @Inject(MATTERPORT_SDK_KEY) public readonly sdkKey: string,\n private route: ActivatedRoute,\n private spaceService: SpaceService,\n private visitService: VisitService,\n private router: Router,\n private userService: BaseUserService,\n private translate: TranslateService,\n private navigatorService: NavigatorService,\n private tagCopyService: MatterportTagCopyService\n ) {\n this.navigatorService.locationIDChange\n .pipe(takeUntil(this.destroy$))\n .subscribe((spaceID) => {\n this.router.navigate([\"dashboard/localisation\", spaceID]);\n });\n\n this.route.params.subscribe((params) => {\n this.id = params.id;\n this.setup();\n });\n\n this.tagCopyService.copyProgress$\n .pipe(takeUntil(this.destroy$))\n .subscribe((progress) => {\n this.copyProgress = progress;\n });\n\n this.tagCopyService.copyLog$\n .pipe(takeUntil(this.destroy$))\n .subscribe((log) => {\n this.copyLog = log;\n });\n }\n\n //\n // ---------- Lifecycle ----------\n //\n\n ngOnInit() { }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n //\n // ---------- Setup ----------\n //\n\n async setup() {\n this.space = await this.spaceService.getSpace(this.id);\n this.setupMenuItems();\n this.setGuestLink();\n this.setCanArchive();\n this.isAdmin = this.userService.isSPAdmin();\n if (this.isAdmin) {\n const spaces = await this.spaceService.getLocationsForCurrentUser();\n this.spaces = spaces.filter((space) => space.id !== this.id).sort((a, b) => (a.name || '').localeCompare(b.name || ''));\n }\n // Visits (3D models) belonging to the CURRENT space, used as copy targets\n this.visits = await this.visitService.getVisitsForSpaceForUser(this.id);\n this.defaultCaptureID = this.space?.defaultCaptureID ?? null;\n }\n\n setupMenuItems() {\n this.menuItems = [\n { label: \"Locations\", url: \"/localisation\" },\n {\n label: this.space.name,\n url: `/localisation/${this.space.id}`,\n },\n ];\n\n if (this.isEditing) {\n this.menuItems.push({ label: \"Edit\" });\n } else {\n this.menuItems.push({ label: \"Information\" });\n }\n }\n\n async setCanArchive() {\n this.canArchive = this.userService.isSPAdmin()\n ? true\n : await this.spaceService.canArchiveSpace(this.id);\n }\n\n setGuestLink() {\n if (this.space.guestLink) {\n const { origin } = document.location;\n this.guestLink = `${origin}/${this.space.guestLink}`;\n setTimeout(() => {\n const hyperlink = document.querySelector(\n \"#linkHref\",\n ) as HTMLLinkElement;\n const message = this.translate.instant(\"confirm.followLink\");\n hyperlink.addEventListener(\"click\", async () => {\n if (window.confirm(message)) {\n window.location.href = this.guestLink;\n await this.userService.logoutCurrentAndSignOutAuth();\n this.router.navigate([\"auth\"]);\n }\n });\n }, 0);\n }\n }\n\n //\n // ---------- Edit / archive / navigation ----------\n //\n\n onEdit() {\n this.isEditing = true;\n this.setupMenuItems();\n }\n\n onReturn() {\n this.router.navigate([\"dashboard/localisation\"]);\n }\n\n reset() {\n this.isEditing = false;\n this.setupMenuItems();\n }\n\n async onArchive() {\n const message = this.translate.instant(\"confirm.archiveSpace\");\n if (window.confirm(message)) {\n await this.spaceService.softDeleteSpace(this.id);\n this.onReturn();\n }\n }\n\n onFormChange(event: Space) {\n this.isEditing = false;\n if (event) {\n this.space = event;\n }\n this.setupMenuItems();\n }\n\n //\n // ---------- DPE (energy diagnostic) ----------\n //\n\n onDpeValidate() {\n this.isValidatingDpe = true;\n this.parsedMetadata = JSON.parse(this.space.metadata);\n this.parsedMetadata = this.parsedMetadata.filter(\n (result) => result.geo_adresse,\n );\n }\n\n onSelectChange(selectedResult: any) {\n for (const result of this.parsedMetadata) {\n if (result !== selectedResult && result.selected) {\n result.selected = false;\n }\n }\n this.selectedDpeResult = selectedResult;\n }\n\n async onSaveResult() {\n if (this.selectedDpeResult) {\n const input = {\n id: this.space.id,\n constructionYear: this.selectedDpeResult.annee_construction,\n classEnergyConsumption:\n this.selectedDpeResult.classe_consommation_energie,\n classGes: this.selectedDpeResult.classe_estimation_ges,\n status: SpaceStatus.DPE_VALIDATED,\n };\n const updatedLoc = await this.spaceService.updateSpace(input);\n this.space = updatedLoc;\n this.isValidatingDpe = false;\n }\n }\n\n onCancel() {\n this.isValidatingDpe = false;\n }\n\n async onErase() {\n await this.spaceService.updateSpace({\n id: this.space.id,\n status: SpaceStatus.DPE_VALIDATED,\n });\n this.space.status = SpaceStatus.DPE_VALIDATED;\n this.isValidatingDpe = false;\n }\n\n async onGetDpeData() {\n this.gettingData = true;\n await this.spaceService.updateSpace({\n id: this.space.id,\n status: SpaceStatus.DPE_FETCH,\n });\n\n setTimeout(async () => {\n this.space = await this.spaceService.getSpace(this.space.id);\n this.gettingData = false;\n }, 1500);\n }\n\n //\n /**\n * Stores which capture a visitor opens by default.\n *\n * One field on the space, not a flag per capture, so the two admin screens cannot disagree:\n * setting it from either one writes the same place, and there is nothing to clear elsewhere.\n */\n async onDefaultCaptureChange() {\n this.savingDefaultCapture = true;\n this.defaultCaptureError = null;\n try {\n await this.spaceService.setDefaultCapture(this.id, this.defaultCaptureID || null);\n this.space.defaultCaptureID = this.defaultCaptureID || null;\n } catch (error) {\n // Until the schema change is deployed, AppSync rejects the field outright. Say so\n // rather than leaving the picker looking as though it saved.\n const graphQl = (error as any)?.errors;\n this.defaultCaptureError = Array.isArray(graphQl) && graphQl.length > 0\n ? graphQl.map((e: any) => e?.message ?? JSON.stringify(e)).join(' | ')\n : ((error as Error)?.message ?? String(error));\n this.defaultCaptureID = this.space?.defaultCaptureID ?? null;\n } finally {\n this.savingDefaultCapture = false;\n }\n }\n\n /** Label for a visit in the default picker, naming the viewer it opens in. */\n visitLabel(visit: Visit): string {\n const name = visit?.name || visit?.model3d || '';\n return visit?.viewer === CaptureViewer.THREEJS ? `${name} (3D)` : `${name} (Matterport)`;\n }\n\n // ---------- Copy POIs between visits ----------\n //\n\n /** Toggles visibility of the admin \"copy POIs from another location\" form. */\n toggleCopyPoisForm() {\n this.showCopyPoisForm = !this.showCopyPoisForm;\n }\n\n onSourceLandmarkPicked(slot: 'A' | 'B', point: Vec3) {\n if (slot === 'A') {\n this.landmarkSourceA = point;\n } else {\n this.landmarkSourceB = point;\n }\n }\n\n onTargetLandmarkPicked(slot: 'A' | 'B', point: Vec3) {\n if (slot === 'A') {\n this.landmarkTargetA = point;\n } else {\n this.landmarkTargetB = point;\n }\n }\n\n /** Loads the visits (3D models) available for the newly selected source space. */\n async onSourceSpaceChange() {\n this.sourceVisits = this.selectedSourceSpaceId\n ? await this.visitService.getVisitsForSpaceForUser(this.selectedSourceSpaceId)\n : [];\n this.selectedSource3dModel = null;\n this.onModelSelectionChange();\n }\n\n /** Resets landmark selections whenever the source or target 3D model changes. */\n onModelSelectionChange() {\n this.landmarkSourceA = null;\n this.landmarkTargetA = null;\n this.landmarkSourceB = null;\n this.landmarkTargetB = null;\n }\n\n /** True once both models are selected, all 4 landmarks are picked, and A/B pairs are far enough apart. */\n get canCopyPois(): boolean {\n if (!this.selectedSourceSpaceId || !this.selectedSource3dModel || !this.selectedTarget3dModel) {\n return false;\n }\n if (!this.landmarkSourceA || !this.landmarkTargetA || !this.landmarkSourceB || !this.landmarkTargetB) {\n return false;\n }\n const sourceDist = distance(this.landmarkSourceA, this.landmarkSourceB);\n const targetDist = distance(this.landmarkTargetA, this.landmarkTargetB);\n return sourceDist >= MIN_LANDMARK_DISTANCE && targetDist >= MIN_LANDMARK_DISTANCE;\n }\n\n async onCopyPois() {\n const selectedTargetSpaceId = this.id;\n\n if (!this.selectedSourceSpaceId || !selectedTargetSpaceId || !this.selectedSource3dModel || !this.selectedTarget3dModel) {\n return;\n }\n if (this.selectedSourceSpaceId === selectedTargetSpaceId) {\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorSameSpace');\n return;\n }\n if (!this.canCopyPois) {\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorLandmarksTooClose');\n return;\n }\n\n this.isCopyingPois = true;\n this.copyPoisResultMsg = null;\n try {\n const success = await this.tagCopyService.copyTagsFromVisit(\n this.selectedSourceSpaceId,\n selectedTargetSpaceId,\n this.landmarkSourceA,\n this.landmarkTargetA,\n this.landmarkSourceB,\n this.landmarkTargetB\n );\n this.copyPoisResultMsg = this.translate.instant(\n success ? 'matterportCopy.successMsg' : 'matterportCopy.errorMsg'\n );\n } catch (error) {\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorMsg');\n }\n this.isCopyingPois = false;\n\n setTimeout(() => {\n this.copyPoisResultMsg = null;\n }, 5000);\n }\n\n /** Downloads the current source/target selection + all 4 landmarks as a JSON file. */\n exportLandmarkConfig() {\n if (!this.selectedSourceSpaceId || !this.selectedSource3dModel || !this.selectedTarget3dModel) {\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorExportMissingSelection');\n return;\n }\n\n const config = {\n sourceSpaceId: this.selectedSourceSpaceId,\n sourceVisit3dModel: this.selectedSource3dModel,\n targetVisit3dModel: this.selectedTarget3dModel,\n landmarkSourceA: this.landmarkSourceA,\n landmarkTargetA: this.landmarkTargetA,\n landmarkSourceB: this.landmarkSourceB,\n landmarkTargetB: this.landmarkTargetB\n };\n\n const blob = new Blob([JSON.stringify(config, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `landmarks_${this.selectedSource3dModel}_to_${this.selectedTarget3dModel}.json`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n /** Downloads the full copy log (step lines, errors, and repaired-item notices) as a text\n * file — the on-screen panel is capped to a small scrollable area and loses lines once\n * a new run starts, this keeps the full report. */\n downloadCopyLog() {\n this.tagCopyService.downloadLog();\n }\n\n /** Triggered by the hidden file input; reads and applies a previously exported JSON config. */\n async onImportLandmarkConfigSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (!file) {\n return;\n }\n\n try {\n const text = await file.text();\n const config = JSON.parse(text);\n\n // Basic shape validation before applying\n const requiredKeys = ['sourceSpaceId', 'sourceVisit3dModel', 'targetVisit3dModel',\n 'landmarkSourceA', 'landmarkTargetA', 'landmarkSourceB', 'landmarkTargetB'];\n const missing = requiredKeys.filter(k => !(k in config));\n if (missing.length > 0) {\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorInvalidConfig', { keys: missing.join(', ') });\n return;\n }\n\n this.selectedSourceSpaceId = config.sourceSpaceId;\n // Reload the source space's visit list so the select has the right options\n this.sourceVisits = await this.visitService.getVisitsForSpaceForUser(this.selectedSourceSpaceId);\n\n this.selectedSource3dModel = config.sourceVisit3dModel;\n this.selectedTarget3dModel = config.targetVisit3dModel;\n this.landmarkSourceA = config.landmarkSourceA;\n this.landmarkTargetA = config.landmarkTargetA;\n this.landmarkSourceB = config.landmarkSourceB;\n this.landmarkTargetB = config.landmarkTargetB;\n\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.successImport');\n } catch (err) {\n console.error('Failed to import landmark config', err);\n this.copyPoisResultMsg = this.translate.instant('matterportCopy.errorImportRead');\n } finally {\n // Reset the input so re-selecting the same file re-triggers the change event\n input.value = '';\n }\n }\n}","<div class=\"container-fluid\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\n </div>\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\n translate}}</button>\n <div class=\"row\" *ngIf=\"!isEditing && space\">\n <div class=\"col-md-5\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\n {{space.constructionYear ?\n space.constructionYear : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\n {{space.latitude ?\n space.latitude : \"No data\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\n space.longitude : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\n }} </li>\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\n {{space.classEnergyConsumption ?\n space.classEnergyConsumption : \"No data\" | translate}}\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\n {{'Get data from API DPE' | translate}}</button>\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\n style=\"cursor: pointer;\">\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\n data-height=\"25\"></span>\n {{'DPE data found. Click to validate' | translate}}\n </a>\n </li>\n <!-- One picker for both viewers: the default lives on the space, so Matterport\n captures and 3D models compete for the same single slot. -->\n <li class=\"list-group-item bg-transparent\" *ngIf=\"visits.length > 1\">\n {{'Default visit' | translate}}:\n <select class=\"form-select d-inline-block ms-2\" style=\"width: auto;\"\n [(ngModel)]=\"defaultCaptureID\" (ngModelChange)=\"onDefaultCaptureChange()\"\n [disabled]=\"savingDefaultCapture\">\n <option [ngValue]=\"null\">{{'First available' | translate}}</option>\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.captureID\">\n {{ visitLabel(visit) }}\n </option>\n </select>\n <span class=\"form-text d-block\">\n {{'What a visitor opens when they enter this location.' | translate}}\n </span>\n <span class=\"text-danger d-block\" *ngIf=\"defaultCaptureError\">\n {{ defaultCaptureError }}\n </span>\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\n triggers=\"click:blur\">\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\n data-height=\"20\"></span>\n </div>\n </div>\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\n </p>\n </li>\n\n </ul>\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <hr>\n <div class=\"d-flex\">\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\n data-testid=\"location-edit-btn\">{{'Edit' |\n translate}}</button>\n <div class=\"tooltip-wrapper\"\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\n {{'Archive' | translate}}</button>\n </div>\n </div>\n\n\n </div>\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\n <h6>{{'Most relevant results for' | translate}} :\n <b>diagnostics de performance énergétique (DPE) des bâtiments tertiaires</b>\n </h6>\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\n <th scope=\"col\">{{'Address' | translate}}</th>\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\n <th scope=\"col\">{{'Construction year' | translate}}</th>\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\n <th scope=\"row\">{{ i + 1 }}</th>\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\n (change)=\"onSelectChange(result)\"></td>\n <td>{{result.geo_adresse}}</td>\n <td>{{result.secteur_activite}}</td>\n <td>{{ result.annee_construction }}</td>\n <td>{{ result.classe_consommation_energie }}</td>\n <td>{{ result.classe_estimation_ges }}</td>\n </tr>\n </tbody>\n </table>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\n translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\n {{'No match (erase data)' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n\n <!-- Toggle button for the admin \"Copy POIs\" form -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0\" class=\"mt-4\">\n <button class=\"btn btn-outline-secondary rounded-pill\" (click)=\"toggleCopyPoisForm()\">\n {{ (showCopyPoisForm ? 'matterportCopy.hideForm' : 'matterportCopy.showForm') | translate }}\n </button>\n </div>\n\n <!-- Admin Form to Copy POIs -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0 && showCopyPoisForm\" class=\"mt-3 p-4 border rounded bg-light\">\n <h6>{{ 'matterportCopy.formTitle' | translate }}</h6>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceSpace' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSourceSpaceId\" (ngModelChange)=\"onSourceSpaceChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectSpace' | translate }}</option>\n <option *ngFor=\"let space of spaces\" [ngValue]=\"space.id\">{{space.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\" *ngIf=\"sourceVisits\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSource3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of sourceVisits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.targetVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedTarget3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div *ngIf=\"selectedSourceSpaceId && selectedSource3dModel && selectedTarget3dModel\"\n class=\"border rounded p-3 mb-3 bg-white\">\n <p class=\"small text-muted mb-2\">\n {{ 'matterportCopy.landmarkInstructions' | translate }}\n </p>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkA' | translate }}</p>\n <div class=\"row mb-4\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceA\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetA\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkB' | translate }}</p>\n <div class=\"row\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceB\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetB\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex align-items-center pt-2\">\n <button class=\"btn btn-primary rounded-pill me-3\" [disabled]=\"!canCopyPois || isCopyingPois\"\n (click)=\"onCopyPois()\">\n {{ 'matterportCopy.copyButton' | translate }}\n </button>\n <div class=\"d-flex align-items-center gap-2 mb-3\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"exportLandmarkConfig()\">\n {{ 'matterportCopy.exportLandmarks' | translate }}\n </button>\n\n <label class=\"btn btn-sm btn-outline-secondary mb-0\">\n {{ 'matterportCopy.importLandmarks' | translate }}\n <input type=\"file\" accept=\"application/json\" hidden\n (change)=\"onImportLandmarkConfigSelected($event)\">\n </label>\n </div>\n <div *ngIf=\"isCopyingPois\" class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n <div *ngIf=\"copyPoisResultMsg\" class=\"mt-2 text-success fw-bold\">\n {{ copyPoisResultMsg }}\n </div>\n <div *ngIf=\"copyProgress\" class=\"mt-3\">\n <div class=\"d-flex justify-content-between small mb-1\">\n <span>\n <ng-container [ngSwitch]=\"copyProgress.phase\">\n <span *ngSwitchCase=\"'collecting'\">{{ 'Collecting information from both visits...' | translate\n }}</span>\n <span *ngSwitchCase=\"'tickets'\">{{ 'Copying tickets' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'equipments'\">{{ 'Copying equipments' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'pois'\">{{ 'Copying standalone POIs' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'objects3d'\">{{ 'Copying 3D objects' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'features'\">{{ 'Copying features' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'measurements'\">{{ 'Copying measurements' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'done'\">{{ 'Done!' | translate }}</span>\n </ng-container>\n </span>\n <span>{{ copyProgress.percent }}%</span>\n </div>\n <div class=\"progress\" style=\"height: 6px;\">\n <div class=\"progress-bar\" [class.progress-bar-striped]=\"copyProgress.phase === 'collecting'\"\n [class.progress-bar-animated]=\"copyProgress.phase === 'collecting'\"\n [class.bg-warning]=\"copyProgress.errorCount > 0\" role=\"progressbar\"\n [style.width.%]=\"copyProgress.phase === 'collecting' ? 100 : copyProgress.percent\">\n </div>\n </div>\n\n <!-- Detailed step-by-step log -->\n <div *ngIf=\"copyLog.length > 0\" class=\"mt-2 p-2 bg-white border rounded small\"\n style=\"max-height: 200px; overflow-y: auto; font-family: monospace;\">\n <div *ngFor=\"let entry of copyLog\" [class.text-danger]=\"entry.type === 'error'\"\n [class.text-warning]=\"entry.type === 'healed'\">\n {{ entry.text }}\n </div>\n </div>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary mt-2\" *ngIf=\"copyLog.length > 0\"\n (click)=\"downloadCopyLog()\">\n {{ 'matterportCopy.downloadLog' | translate }}\n </button>\n </div>\n </div>\n\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\n</div>","import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { getDocument, PDFDocumentProxy } from 'pdfjs-dist';\n// import { PDFDocumentProxy } from 'ng2-pdf-viewer';\nimport {\n Zone,\n MenuItem,\n Plan,\n Space,\n Navigation,\n PlanService,\n ZoneService,\n SpaceService,\n NavigationService,\n getMetaForImage,\n MatterportImportService,\n} from '@smarterplan/ngx-smarterplan-core';\nimport panzoom from 'panzoom';\n\n@Component({\n selector: 'lib-calibration',\n templateUrl: './calibration.component.html',\n styleUrls: ['./calibration.component.scss'],\n})\nexport class CalibrationComponent implements OnInit {\n /** Item to display for the navbar */\n menuItems: MenuItem[] = [];\n\n /** Canvas (Plan) */\n canvas;\n\n /** CanvasDiv (Div that contain the canvas + matterport iframe) */\n @ViewChild('canvasDiv') canvasDiv: ElementRef;\n\n /** Size of the canvas & matterport iframe */\n canvasSize: { w: number; h: number; };\n\n /** Zoom ratio of the canvas/plan */\n canvasZoom = 0;\n\n /** Opacity for matterport iframe */\n opacity: number = 50;\n\n /** Current rotation for matterport, [0-360], matterport rotation is bind to input range */\n rotation: number = 180;\n\n /** Previous rotation, use to calculate the deltaRotation to rotate, when user change rotation value using range input */\n prevRotation: number = 180;\n\n /** Current Camera Pose */\n cameraPose: any;\n\n /** True when the user is currently rotating with the input range, the matterport rotation events will be ignored */\n isRotatingRange: boolean = false;\n\n /** Rotating queue event to send to matterport */\n rotatingQueueEvent: number[] = [];\n\n /** True when Vertical symmetry is enabled */\n reflectV = false;\n\n /** True when Horizontal symmetry is enabled */\n reflectH = false;\n\n chosenPlan: Plan;\n\n spaceID: string;\n\n currentSpace: Space;\n\n currentZone: Zone;\n\n chosenPlanIsPdf = false;\n\n /** First Point in visit, used to determine the calibration */\n firstMarkVisit = { x: 0, y: 0 };\n\n /** Second Point in visit, used to determine the calibration */\n secondMarkVisit = { x: 0.5, y: 0.5 };\n\n /** Equivalent of 'firstMarkVisit' in canvas */\n firstMarkPlan: { x: number; y: number; } = { x: 0, y: 0 };\n\n /** Equivalent of 'secondMarkVisit' in canvas */\n secondMarkPlan: { x: number; y: number; } = { x: 0, y: 0 };\n\n /** Calibration result, (offsetX, offsetY, x, y) */\n calibrage: any = {};\n\n /** Is in preview mode (see scan result) */\n preview = false;\n\n /** Matterport is loading */\n loading = true;\n\n /* for pan and zoom of canvas */\n panzoom: any;\n\n currentNavigations: Navigation[];\n\n positions: { navID: string; planID: string; x: number; y: number; }[] = [];\n\n floors: any[] = [];\n\n currentFloor;\n\n zoomCanBeChanged: boolean = false;\n\n constructor(\n private matterportImportService: MatterportImportService,\n private planService: PlanService,\n private route: ActivatedRoute,\n private router: Router,\n private zoneService: ZoneService,\n private spaceService: SpaceService,\n private navigationService: NavigationService,\n private translate: TranslateService\n ) { }\n\n ngOnDestroy(): void {\n if (!this.loading) {\n this.matterportImportService.removeFrame();\n }\n }\n\n async ngOnInit(): Promise<void> {\n this.spaceID = this.route.snapshot.queryParams.spaceID;\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\n\n /** Menu nav bar */\n this.setupMenuItems();\n\n this.chosenPlan = this.planService.getChosenPlan();\n\n if (this.chosenPlan) {\n this.chosenPlanIsPdf = this.chosenPlan.annexe.includes('pdf');\n this.launchViewer();\n setTimeout(() => {\n this.configureCanvas().then(() => {\n this.panzoom = panzoom(this.canvas, {\n bounds: true,\n boundsPadding: 0,\n maxZoom: 2.5,\n minZoom: 0.1,\n initialZoom: 1,\n zoomSpeed: 0.02,\n });\n });\n }, 500);\n } else {\n this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);\n }\n }\n\n /** **********************************************************************************************\n * MENU NAV BAR\n *********************************************************************************************** */\n setupMenuItems() {\n this.menuItems = [\n { label: 'Locations', url: '/localisation' },\n {\n label: this.currentSpace.name,\n url: `/localisation/${this.spaceID}`,\n },\n {\n label: 'Plans',\n url: `/localisation/${this.currentSpace.id}/plans`,\n },\n {\n label: 'Calibration',\n url: `/localisation/${this.currentSpace.id}/plan-calibration?spaceID=${this.currentSpace.id}`,\n },\n ];\n }\n\n /** **********************************************************************************************\n * CANVAS\n *********************************************************************************************** */\n\n /** Display the plan */\n async configureCanvas() {\n /** Get canvas */\n if (!this.canvas) {\n const canvas = document.querySelector('#canvas') as HTMLCanvasElement;\n this.canvas = canvas;\n }\n\n if (!this.chosenPlanIsPdf) {\n const image = await getMetaForImage(this.chosenPlan.filepath);\n /** Compute the new size for the canvas/matterport, base on the dimension of the plan, keeping the ratio */\n const size = this.getSizeForCanvas(image.width, image.height);\n\n /** Compute the plan zoom ratio (use for the calibration later) */\n this.canvasZoom = size.w / image.width;\n\n this.resizeView(size);\n\n /** Draw Plan on the canvas */\n this.drawImage(this.chosenPlan.filepath);\n } else {\n // TODO\n this.pdfToCanvas();\n }\n }\n\n /** Update size of the canvas/matterport */\n resizeView(size) {\n this.canvasDiv.nativeElement.style.width = `${size.w}px`;\n this.canvasDiv.nativeElement.style.height = `${size.h}px`;\n this.canvas.style.width = `${size.w}px`;\n this.canvas.style.height = `${size.h}px`;\n this.canvas.width = size.w;\n this.canvas.height = size.h;\n this.canvasSize = size;\n }\n\n /** Draw something on the canvas */\n drawImage(url: string, x = 0, y = 0, icone = false) {\n const image = new Image();\n const size = this.canvasSize;\n const context = this.canvas.getContext('2d');\n\n /** Flip the context, for symmetry */\n // if (this.reflectV) {\n // context.translate(size.w, 0);\n // context.scale(-1, 1);\n // }\n // if (this.reflectH) {\n // context.translate(0, size.h);\n // context.scale(1, -1);\n // }\n\n let imageWidth = size.w;\n let imageHeight = size.h;\n image.addEventListener('load', () => {\n if (icone) {\n imageWidth = image.width;\n imageHeight = image.height;\n }\n context.drawImage(\n image,\n 0,\n 0,\n image.width,\n image.height,\n x,\n y,\n imageWidth,\n imageHeight\n );\n });\n image.src = url;\n }\n\n /** Get the size for the canvas, based on the plan size, keeping the ratio */\n getSizeForCanvas(w, h) {\n let canvasW = this.canvasDiv.nativeElement.offsetWidth;\n let canvasH = this.canvasDiv.nativeElement.offsetHeight;\n\n const imageRatio = w / h;\n const canvasRatio = canvasW / canvasH;\n\n if (imageRatio > canvasRatio) {\n canvasH = canvasW / imageRatio;\n } else {\n canvasW = canvasH * imageRatio;\n }\n return { w: canvasW, h: canvasH };\n }\n\n /** [TODO] Convert a PDF to a Canvas */\n async pdfToCanvas() {\n const pdfjs = await import('pdfjs-dist');\n pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/4.4.168/pdf.worker.min.mjs`;\n\n const pdf: PDFDocumentProxy = await getDocument(this.chosenPlan.filepath)\n .promise;\n const page = await pdf.getPage(1);\n\n const viewPortParameters = { scale: 1 };\n const viewport = page.getViewport(viewPortParameters);\n\n this.canvas.height = viewport.height;\n this.canvas.width = viewport.width;\n\n const size = this.getSizeForCanvas(viewport.width, viewport.height);\n console.log(size);\n this.canvasSize = size;\n\n this.canvasZoom = size.w / viewport.width;\n\n const context = this.canvas.getContext('2d') as CanvasRenderingContext2D;\n const renderContext = {\n canvasContext: context,\n viewport,\n };\n const renderTask = page.render(renderContext).promise;\n\n renderTask.then(() => console.log('Page rendered'));\n\n // const res = canvas.toDataURL();\n // if (pdf != null) pdf.destroy();\n // return res;\n }\n\n /** User click to user Symmetry Vertical */\n onReflectV() {\n this.reflectV = !this.reflectV;\n this.configureCanvas();\n }\n\n /** User click to user Symmetry Horizontal */\n onReflectH() {\n this.reflectH = !this.reflectH;\n this.configureCanvas();\n }\n\n /** **********************************************************************************************\n * MATTERPORT\n *********************************************************************************************** */\n\n /** Launch matterport */\n async launchViewer() {\n await this.matterportImportService.initSdkForModel(this.chosenPlan.model3d);\n\n const { sdk } = this.matterportImportService;\n this.floors = Object.values(this.matterportImportService.floors);\n // console.log(this.floors);\n setTimeout(async () => {\n /** Move Floor mode */\n sdk.Mode.moveTo(sdk.Mode.Mode.FLOORPLAN).then(async (nextMode) => {\n /** Display the correct floor for the plan */\n try {\n const matterportFloor = this.chosenPlan.zone.metadata ?\n JSON.parse(this.chosenPlan.zone.metadata).matterportFloorSequence : null;\n await this.matterportImportService.moveToFloor(this.chosenPlan.zone.name, matterportFloor);\n\n /** When the user try to change the view mode we set it back to floorpan */\n sdk.on(sdk.Mode.Event.CHANGE_END, (oldMode, newMode) => {\n if (newMode !== sdk.Mode.Mode.FLOORPLAN) {\n sdk.Mode.moveTo(sdk.Mode.Mode.FLOORPLAN, {\n transition: 'transition.instant',\n });\n }\n });\n } catch {\n console.log('couldnot move to floor');\n }\n });\n\n /** We can display the matterport view now */\n this.loading = false;\n }, 1000);\n\n /** Update current camera pose and rotation */\n sdk.Camera.pose.subscribe((event) => {\n /** We update only if the user is not changing the rotation with the <input> range, to not override the <input> value */\n if (!this.isRotatingRange) {\n this.rotation = event.rotation.y + 180;\n this.prevRotation = this.rotation;\n this.cameraPose = event;\n }\n });\n }\n\n /** When the <input> range, for rotation, change */\n async onRotationChange() {\n const rotationDelta = this.rotation - this.prevRotation;\n this.prevRotation = this.rotation;\n\n /** Send the rotationDelta to th queue event in order to be send to matterport */\n this.rotatingQueueEvent.push(rotationDelta);\n\n /** Start to process the queue, if it's the first event */\n if (!this.isRotatingRange) {\n this.isRotatingRange = true;\n this.processRotatingQueueEvent();\n }\n }\n\n /** Process the rotating event queue, send event one by one to matterport */\n async processRotatingQueueEvent() {\n const { sdk } = this.matterportImportService;\n\n /** While the queue is not empty */\n while (this.rotatingQueueEvent.length > 0) {\n /** Rotate matterport by deltaRotation and remove event from queue */\n await sdk.Camera.rotate(this.rotatingQueueEvent.shift(), 0, {\n speed: 360,\n });\n }\n\n /** When the queue is empty, then the user is not rotating with the <input> range anymore */\n this.isRotatingRange = false;\n }\n\n /** **********************************************************************************************\n * USER ACTIONS\n *********************************************************************************************** */\n\n /** Preview calibration */\n async onPreview() {\n this.preview = true;\n /** Place sweeps */\n this.onPlaceSweeps();\n }\n\n async calibrate() {\n const [navigation] = this.currentNavigations;\n const position = JSON.parse(navigation.position);\n this.firstMarkPlan =\n await this.matterportImportService.sdk.Renderer.getScreenPosition({\n x: position.x,\n y: position.y,\n z: position.z,\n });\n this.secondMarkPlan =\n await this.matterportImportService.sdk.Renderer.getScreenPosition({\n x: position.x,\n y: 0,\n z: 0,\n });\n const deltaZVisit = 0 - position.z;\n let deltaXPlan = this.secondMarkPlan.x - this.firstMarkPlan.x;\n if (deltaXPlan === 0) {\n // console.log(\"we moved along Y axis on Plan\");\n const deltaYPlan = this.secondMarkPlan.y - this.firstMarkPlan.y;\n this.calibrage.nameYAxis = 'z';\n this.calibrage.nameXAxis = 'x';\n this.calibrage.offsetY = this.secondMarkPlan.y;\n this.calibrage.scaleY = deltaYPlan / deltaZVisit;\n } else {\n // console.log(\" we moved along X axis on Plan\");\n this.calibrage.nameYAxis = 'x';\n this.calibrage.nameXAxis = 'z';\n this.calibrage.offsetX = this.secondMarkPlan.x;\n this.calibrage.scaleX = deltaXPlan / deltaZVisit;\n }\n const thirdMarkPlan =\n await this.matterportImportService.sdk.Renderer.getScreenPosition({\n x: 0,\n y: 0,\n z: position.z,\n });\n const deltaXVisit = 0 - position.x;\n if (deltaXPlan === 0) {\n // console.log(\" we moved along X axis on Plan\");\n deltaXPlan = thirdMarkPlan.x - this.firstMarkPlan.x;\n this.calibrage.offsetX = thirdMarkPlan.x;\n this.calibrage.scaleX = deltaXPlan / deltaXVisit;\n } else {\n const deltaYPlan = thirdMarkPlan.y - this.firstMarkPlan.y;\n this.calibrage.offsetY = thirdMarkPlan.y;\n this.calibrage.scaleY = deltaYPlan / deltaXVisit;\n }\n\n /** Take considiration of pan and zoom of plan on canvas */\n const transformInfo = this.panzoom.getTransform();\n const { scale, x, y } = transformInfo;\n // console.log(transformInfo);\n this.calibrage.offsetXPlan = x;\n this.calibrage.offsetYPlan = y;\n this.calibrage.scalePlan = scale;\n console.log(this.calibrage);\n }\n\n /** Place sweeps */\n async onPlaceSweeps() {\n /** Display all scan */\n const zone = await this.zoneService.getZone(this.chosenPlan.zoneID);\n\n if (zone) {\n this.currentZone = zone;\n const navigations = await this.navigationService.getNavigationsForZone(\n this.currentZone\n );\n this.currentNavigations = navigations;\n await this.calibrate();\n if (navigations.length > 0) {\n for (const navigation of navigations) {\n const testPosition = JSON.parse(navigation.position);\n const positionX =\n this.calibrage.nameXAxis === 'x' ? testPosition.x : testPosition.z;\n const positionY =\n this.calibrage.nameYAxis === 'x' ? testPosition.x : testPosition.z;\n const testX =\n positionX * this.calibrage.scaleX + this.calibrage.offsetX;\n const testY =\n positionY * this.calibrage.scaleY + this.calibrage.offsetY;\n // console.log(\"test position GREEN\", testX, testY);\n const transformedX =\n (testX - this.calibrage.offsetXPlan) / this.calibrage.scalePlan; // we are undoing the pan and zoom\n const transformedY =\n (testY - this.calibrage.offsetYPlan) / this.calibrage.scalePlan;\n this.positions.push({\n navID: navigation.id,\n planID: this.chosenPlan.id,\n x: transformedX,\n y: transformedY,\n });\n const iconSize = 30 * this.calibrage.scalePlan;\n const shift = iconSize / 2;\n this.drawImage(\n 'https://api.iconify.design/mdi:adjust.svg?color=green&height=30&width=30',\n transformedX - shift,\n transformedY - shift,\n true\n );\n }\n }\n }\n }\n\n /** Save calibration */\n async onSave() {\n if (this.currentZone) {\n /** Normalize with the zoom */\n // this.calibrage.offsetX /= this.canvasZoom;\n // this.calibrage.offsetY /= this.canvasZoom;\n // this.calibrage.x /= this.canvasZoom;\n // this.calibrage.y /= this.canvasZoom;\n this.calibrage.new = true;\n this.calibrage.imgWidth = this.canvasSize.w;\n this.calibrage.imgHeight = this.canvasSize.h;\n\n await this.planService.updatePlan({\n id: this.chosenPlan.id,\n calibration: JSON.stringify(this.calibrage),\n });\n await Promise.all(\n this.positions.map(async (position) => {\n const { navID } = position;\n delete position.navID;\n const nav = this.currentNavigations.find((_nav) => _nav.id === navID);\n let positionsDataToUpdate;\n if (nav.positionOnPlan) {\n const positionOnPlan = nav.positionOnPlan.map((entry) =>\n JSON.parse(entry)\n );\n const positionForCurrentPlan = positionOnPlan.find(\n (entry) => entry.planID === this.chosenPlan.id\n );\n if (positionForCurrentPlan) {\n positionOnPlan.splice(\n positionOnPlan.indexOf(positionForCurrentPlan),\n 1,\n position\n );\n } else {\n positionOnPlan.push(position);\n }\n positionsDataToUpdate = [...positionOnPlan];\n } else {\n positionsDataToUpdate = [position];\n }\n // console.log(positionsDataToUpdate);\n await this.navigationService.updateNavigation({\n id: navID,\n positionOnPlan: positionsDataToUpdate.map((entry) =>\n JSON.stringify(entry)\n ),\n });\n })\n );\n }\n this.matterportImportService.removeFrame();\n\n this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);\n alert(this.translate.instant('calibration.success'));\n }\n\n /** Reset the canvas */\n onReset() {\n this.reflectH = false;\n this.reflectV = false;\n this.preview = false;\n\n this.configureCanvas();\n }\n\n /** Cancel, leave */\n onCancel() {\n this.matterportImportService.removeFrame();\n this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);\n alert(this.translate.instant('calibration.canceled'));\n }\n\n async onFloorClick(floor) {\n this.currentFloor = floor;\n await this.matterportImportService.moveToFloor(floor.id);\n }\n\n onActivateZoomChange() {\n this.zoomCanBeChanged = !this.zoomCanBeChanged;\n const iframe = document.querySelector('#viewer-frame') as HTMLElement;\n if (iframe) {\n iframe.style.zIndex = this.zoomCanBeChanged ? '1' : '0';\n }\n }\n}\n","<div class=\"row mt-3\">\n <div class=\"col\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems'></lib-tab-navigation>\n </div>\n </div>\n</div>\n\n<div id=\"rowCanvas\">\n <div #canvasDiv id=\"canvasDiv\">\n\n <div id=\"viewer-frame\" [style.pointer-events]=\"zoomCanBeChanged?'auto':'none'\">\n <!-- <div class=\"blur\"></div> -->\n </div>\n <canvas id=\"canvas\" [ngStyle]=\"{'opacity': (preview||loading) ? '1' : 'calc(' + opacity + '/ 100)'}\"></canvas>\n </div>\n\n <div class=\"calibration-tools container-fluid\" *ngIf=\"!(preview || loading)\">\n <h1>{{'Calibration tool' | translate}}</h1>\n <div class=\"tool\">\n <div class=\"row ms-0 me-0 legend\">\n <div class=\"legend-bar-indicator\" [ngStyle]=\"{'opacity': 'calc(' + (-(opacity-100)+10) + '/ 100)'}\">\n {{'Less' | translate}}</div>\n <div class=\"legend-title\">{{'Plan Opacity' | translate }}</div>\n <div class=\"legend-bar-indicator\" [ngStyle]=\"{'opacity': 'calc(' + (opacity+10) + '/ 100)'}\">{{'More' |\n translate}}</div>\n </div>\n <div class=\"row ms-0 me-0 \">\n <input [disabled]=\"false\" [ngModelOptions]=\"{standalone: true}\" [(ngModel)]=\"opacity\" type=\"range\"\n class=\"form-range\" min=\"0\" max=\"100\" value=\"50\" id=\"opacity\">\n </div>\n </div>\n <div class=\"tool\">\n <div class=\"row ms-0 me-0 \">\n <div class=\"label-legend\">{{'Change Visit Floor' | translate}}</div>\n <div ngbDropdown class=\"d-inline-block ms-3\">\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" ngbDropdownToggle>\n {{currentFloor ? currentFloor.id : ('Floor' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button ngbDropdownItem *ngFor=\"let floor of floors\" (click)=\"onFloorClick(floor)\">\n {{ floor.name.length > 0 ? floor.name : ('Floor ' + floor.id) }}\n </button>\n </div>\n </div>\n </div>\n\n </div>\n <div class=\"tool\">\n <div class=\"row ms-0 me-0 \">\n <div class=\"tool-checkbox-container\">\n <div class=\"tool-checkbox-subcontainer\">\n <div class=\"label-legend me-3\">{{'Pan/Zoom Visit' | translate}} {{zoomCanBeChanged ? \"ON\" :\n \"OFF\"}}\n </div>\n <input type=\"checkbox\" (change)=\"onActivateZoomChange()\" style=\"margin-top: 5px;\">\n </div>\n <div class=\"card border-warning mb-3 mt-3\" *ngIf=\"zoomCanBeChanged\">\n <div class=\"card-body text-warning\">\n <h5 class=\"card-title\">{{\"calibration.wait-message\" | translate}}</h5>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"action\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onPreview()\"\n [disabled]=\"zoomCanBeChanged\">{{'Preview' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'Cancel' |\n translate}}</button>\n\n </div>\n\n </div>\n <div class=\"calibration-tools container-fluid\" *ngIf=\"preview\">\n <h1>{{'Validation' | translate}}</h1>\n <div class=\"action\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onSave()\">{{'Validate' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onReset()\">{{'Reset' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'Cancel' |\n translate}}</button>\n\n </div>\n </div>\n\n\n <div class=\"calibration-tools container-fluid\" *ngIf=\"loading\">\n <h3>{{\"Waiting for Matterport\" | translate}}...</h3>\n <div class=\"d-flex justify-content-center\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n </div>\n</div>","import { Component, OnInit } from '@angular/core';\nimport { UntypedFormGroup, UntypedFormBuilder, Validators } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Zone, Space, Plan, MenuItem, SpaceService, PlanService, getMetaForImage, getSignedFile, downloadFileAsObject, downloadBlob, NavigatorService } from '@smarterplan/ngx-smarterplan-core';\nimport panzoom from 'panzoom';\nimport { Subject, takeUntil } from 'rxjs';\n\n@Component({\n selector: 'lib-plans',\n templateUrl: './plans.component.html',\n styleUrls: ['./plans.component.scss']\n})\nexport class PlansComponent implements OnInit {\n\n spaceID: string;\n\n currentSpace: Space;\n\n plans: Plan[];\n\n // chosenPlan: Plan;\n\n indexDetails = -1;\n\n loading = false;\n\n uploadingPlan = false;\n\n planForm: UntypedFormGroup;\n\n isCurrentPlanForZone = false;\n\n canvas;\n\n scale: number;\n\n panzoom: any;\n\n currentZone: Zone;\n\n fileToUpload: File;\n\n chosenPlanIsPdf = false;\n\n zones: Zone[];\n\n menuItems: MenuItem[] = [];\n\n destroy$ = new Subject();\n\n constructor(\n private route: ActivatedRoute,\n private router: Router,\n private spaceService: SpaceService,\n private planService: PlanService,\n private fb: UntypedFormBuilder,\n private translate: TranslateService,\n private navigatorService: NavigatorService\n ) {\n this.navigatorService.locationIDChange\n .pipe(takeUntil(this.destroy$))\n .subscribe((spaceID) => {\n this.router.navigate([\"dashboard/localisation\", spaceID, \"plans\"]);\n });\n\n this.route.params.subscribe((params) => {\n this.spaceID = params.id;\n this.getPlans();\n });\n }\n\n ngOnInit(): void {\n if (\n this.planService.getPlanFileCache() &&\n this.planService.getChosenPlan()\n ) {\n this.addPlanFromCache(\n this.planService.getPlanFileCache(),\n this.planService.getChosenPlan(),\n );\n this.planService.setPlanFileCache(null);\n }\n this.planService.setChosenPlan(null);\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n setupMenuItems() {\n this.menuItems = [\n { label: \"Locations\", url: \"/localisation\" },\n {\n label: this.currentSpace.name,\n url: `/localisation/${this.currentSpace.id}`,\n },\n {\n label: \"Plans\",\n url: `/localisation/${this.currentSpace.id}/plans`,\n },\n ];\n }\n\n onGoBack() { }\n\n async onPlanClick(plan?: Plan) {\n if (plan) this.planService.setChosenPlan(plan);\n this.chosenPlanIsPdf = plan.annexe.includes(\"pdf\");\n if (!this.chosenPlanIsPdf) {\n setTimeout(() => {\n this.configureCanvas().then(() => {\n this.panzoom = panzoom(this.canvas, {\n bounds: true,\n boundsPadding: 0,\n maxZoom: 3.5,\n minZoom: 0.1,\n initialZoom: 0.5,\n });\n });\n }, 500);\n }\n }\n\n async configureCanvas() {\n this.uploadingPlan = true;\n const canvas = document.querySelector(\"#canvas\") as HTMLCanvasElement;\n const image = await getMetaForImage(this.getChoosenPlan().filepath);\n canvas.width = image.width;\n canvas.height = image.height;\n this.canvas = canvas;\n this.drawImage(this.getChoosenPlan().filepath);\n this.uploadingPlan = false;\n }\n\n drawImage(url: string, x = 0, y = 0) {\n const image = new Image();\n const context = this.canvas.getContext(\"2d\");\n const imageWidth = this.canvas.width;\n const imageHeight = this.canvas.height;\n image.addEventListener(\"load\", () => {\n context.drawImage(\n image,\n 0,\n 0,\n image.width,\n image.height,\n x,\n y,\n imageWidth,\n imageHeight,\n );\n });\n image.src = url;\n // image.crossOrigin = \"*\"; //need to download as png,\n // BUT: https://stackoverflow.com/questions/49503171/the-image-tag-with-crossorigin-anonymous-cant-load-success-from-s3\n }\n\n async getPlans() {\n this.loading = true;\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\n this.setupMenuItems();\n\n this.zones = this.currentSpace.zones.items;\n this.plans = await this.planService.getSingedPlansForSpace(this.spaceID);\n this.loading = false;\n if (this.plans.length === 1) {\n this.onPlanClick(this.plans[0]);\n }\n }\n\n getChoosenPlan() {\n return this.planService.getChosenPlan();\n }\n\n removeImage() {\n const context = this.canvas.getContext(\"2d\");\n context.clearRect(0, 0, 4096, 4096);\n }\n\n /**\n *\n */\n onCalibrateClick() {\n if (this.getChoosenPlan()) {\n this.router.navigate(\n [\"/dashboard/localisation\", this.spaceID, \"plan-calibration\"],\n { queryParams: { spaceID: this.spaceID } },\n );\n }\n }\n\n /**\n *\n */\n onEditClick() {\n if (this.getChoosenPlan()) {\n this.router.navigate(\n [\"/dashboard/localisation\", this.spaceID, \"plan-edit\"],\n { queryParams: { spaceID: this.spaceID } },\n );\n }\n }\n\n onUploadClick() {\n const inputFile = document.querySelector(\n \"#upload-file\",\n ) as HTMLInputElement;\n inputFile.click();\n }\n\n addPlan(target: EventTarget) {\n this.fileToUpload = (target as HTMLInputElement).files[0];\n this.planForm = this.fb.group({\n name: [this.fileToUpload.name, [Validators.required]],\n zoneID: [null, [Validators.required]],\n spaceID: this.spaceID,\n isModified: false,\n calibration: \"\",\n });\n }\n\n addPlanFromCache(file: File, plan: Plan) {\n this.fileToUpload = file;\n this.planForm = this.fb.group({\n name: [this.fileToUpload.name, [Validators.required]],\n zoneID: [plan ? plan.zoneID : null, [Validators.required]],\n spaceID: this.spaceID,\n isModified: !!plan,\n calibration:\n plan && plan.isModified && plan.calibration\n ? plan.calibration\n : \"\",\n });\n }\n\n async onSavePlan() {\n const formValue = this.planForm.value as Plan;\n formValue.isCurrentForZone = this.isCurrentPlanForZone;\n const createdPlan = await this.planService.createPlanWithAnnexe(\n formValue,\n this.fileToUpload,\n );\n const filepath = await getSignedFile(createdPlan.annexe);\n if (filepath) {\n createdPlan.filepath = filepath;\n }\n if (formValue.isCurrentForZone) {\n // set all other plans to not current\n this.planService.setAllPlansForZoneNotCurrent(\n createdPlan.zoneID,\n createdPlan.id,\n );\n }\n this.plans.push(createdPlan);\n this.planForm = null;\n this.fileToUpload = null;\n }\n\n onCancelUpload() {\n this.fileToUpload = null;\n this.planForm = null;\n }\n\n async onCurrentPlanClick() {\n await this.planService.updatePlan({\n id: this.getChoosenPlan().id,\n isCurrentForZone: this.getChoosenPlan().isCurrentForZone,\n });\n if (this.getChoosenPlan().isCurrentForZone) {\n this.planService.setAllPlansForZoneNotCurrent(\n this.getChoosenPlan().zoneID,\n this.getChoosenPlan().id,\n );\n }\n }\n\n async onDownloadClick() {\n const signedFile = await downloadFileAsObject(\n this.getChoosenPlan().annexe,\n );\n if (signedFile) {\n // @ts-ignore\n downloadBlob(signedFile.Body, this.getChoosenPlan().name);\n }\n }\n\n async onDownloadAsPng() {\n const canvas = document.querySelector(\"#canvas\") as HTMLCanvasElement;\n canvas.toBlob(function (blob) {\n downloadBlob(blob, \"plan-as-png.png\");\n });\n }\n\n async onRemoveClick() {\n const message = this.translate.instant(\"confirm.deletePlan\");\n if (window.confirm(message)) {\n await this.planService.deletePlan(this.getChoosenPlan());\n this.removeImage();\n this.planService.setChosenPlan(null);\n this.getPlans();\n }\n }\n}\n","<div class=\"container-fluid\" *ngIf=\"currentSpace\" class=\"dashboard-tab\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <div class=\"mt-3\" *ngIf=\"!plans && !loading\">\n <h4 style=\"font-weight: bold;\">{{'No imported plans' | translate }}</h4>\n <p>{{'For import from 3D visit: go Virtual Visits => Import Images' | translate}}</p>\n </div>\n <div class=\"row ms-1\">\n <div ngbDropdown class=\"d-inline-block me-3\">\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" ngbDropdownToggle>{{getChoosenPlan() ?\n getChoosenPlan().name: ('Choose Plan' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button ngbDropdownItem *ngFor=\"let plan of plans\" (click)=\"onPlanClick(plan)\">{{plan.name }}\n </button>\n </div>\n </div>\n <div class=\"d-inline-block\" ngbDropdown #myDrop=\"ngbDropdown\">\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownManual\" ngbDropdownToggle>{{'Choose action' |\n translate}}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownManual\">\n <button (click)=\"onCalibrateClick()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">{{'Calibrate' |\n translate}}</button>\n <button (click)=\"onEditClick()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">{{'Edit plan' |\n translate}}\n </button>\n <button (click)=\"onUploadClick()\" ngbDropdownItem>{{'Upload new plan' | translate}}</button>\n <button (click)=\"onDownloadClick()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">{{'Download plan' |\n translate}}</button>\n <button (click)=\"onRemoveClick()\" ngbDropdownItem\n [disabled]=\"!getChoosenPlan() || getChoosenPlan().isImportedMatterport\">{{'Delete plan' |\n translate}}</button>\n <!-- <button (click)=\"onDownloadAsPng()\" ngbDropdownItem [disabled]=\"!getChoosenPlan()\">\n {{'Download plan as PNG' | translate}}</button> -->\n </div>\n </div>\n </div>\n <div class=\"row mt-3 ms-0\">\n <h4 *ngIf=\"fileToUpload\">{{'New plan' | translate }}</h4>\n <input class=\"hidden\" type=\"file\" id=\"upload-file\" name=\"upload-file\" accept=\"image/png, image/jpeg, .pdf, .svg\"\n ngf-max-size=\"6MB\" (change)=\"addPlan($event.target)\">\n </div>\n <div class=\"col-md-6 mt-3\" *ngIf=\"planForm\">\n <form (ngSubmit)=\"onSavePlan()\" [formGroup]=\"planForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3\">{{'Name' | translate}} </label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3\">{{'Zone' | translate}} </label>\n <div class=\"col-sm-9\">\n <select class=\"form-control\" formControlName=\"zoneID\">\n <option *ngFor=\"let zone of zones\" [ngValue]=\"zone.id\">\n {{ zone.name }}\n </option>\n </select>\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3\">{{'Set as current plan for zone' | translate}}</label>\n <div class=\"col-sm-3\">\n <input type=\"checkbox\" [(ngModel)]=\"isCurrentPlanForZone\" [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div>\n <button [disabled]=\"planForm.invalid\" type='submit' class=\"btn btn-label-file rounded-pill\">{{'Save' |\n translate}}</button>\n <button class=\"btn btn-label-file rounded-pill ms-3\" type=\"button\" (click)=\"onCancelUpload()\">{{'Cancel' |\n translate}}</button>\n </form>\n </div>\n <ul class=\"col-md-6 list-group list-group-flush\" *ngIf=\"getChoosenPlan()\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate }} : {{getChoosenPlan().name}} </li>\n <li class=\"list-group-item bg-transparent\"> {{'Plan is ' | translate }} :\n {{getChoosenPlan().calibration ? ('Calibrated' | translate) : ('Not calibrated' | translate)}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Attributed to zone ' | translate }} :\n {{getChoosenPlan().zone ? getChoosenPlan().zone.name : 'None'}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Is current plan for zone ' | translate }} :\n <input type=\"checkbox\" [(ngModel)]=\"getChoosenPlan().isCurrentForZone\" (change)=\"onCurrentPlanClick()\">\n </li>\n\n </ul>\n\n <div class=\"row mt-4\">\n <div class=\"col-md-10\">\n <embed *ngIf=\"getChoosenPlan() && chosenPlanIsPdf\" [src]=\"getChoosenPlan().filepath | safeUrl\"\n type=\"application/pdf\" frameBorder=\"0\" scrolling=\"auto\" height=\"650px;\" width=\"100%\" />\n <div *ngIf=\"!chosenPlanIsPdf\" class=\"row\" style=\"height: 500px; overflow: hidden;\" id=\"canvasDiv\">\n <canvas id=\"canvas\" width=\"4096px\" height=\"4096px\">\n <!-- <img *ngIf=\"chosenPlan\" id=\"plan-image\" [src]=\"chosenPlan.filepath\" style=\"width: 100%;\"> -->\n </canvas>\n\n </div>\n </div>\n </div>\n</div>\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'lib-chevron',\n templateUrl: './chevron.component.html',\n styleUrls: ['./chevron.component.scss']\n})\nexport class ChevronComponent implements OnInit {\n\n @Input() conditionShowing = false;\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","<div style=\"height: 30px; width: 30px;\">\n <span class=\"icon-container\" >\n <div [class]=\"conditionShowing ? 'icon-img-up' : 'icon-img-down'\"></div>\n </span>\n</div>\n","import { Component, OnInit, ViewChild } from '@angular/core';\nimport {\n UntypedFormGroup,\n UntypedFormBuilder,\n Validators,\n AbstractControl,\n} from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { NgbModal, ModalDismissReasons } from '@ng-bootstrap/ng-bootstrap';\nimport {\n Node,\n Visit,\n MenuItem,\n MatterportImportService,\n ThreeJsImportService,\n CaptureService,\n NodeService,\n SpaceService,\n VisitService,\n CaptureViewer,\n Capture,\n ValidatorsService,\n NavigatorService,\n} from '@smarterplan/ngx-smarterplan-core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Subject, takeUntil } from 'rxjs';\n\n@Component({\n selector: 'lib-visits',\n templateUrl: './visits.component.html',\n styleUrls: ['./visits.component.scss'],\n})\nexport class VisitsComponent implements OnInit {\n spaceId: string;\n\n visitIndexDetails = -1;\n\n visitForm: UntypedFormGroup;\n\n isEditing: boolean = false;\n\n visitSubmitted: boolean = false;\n\n captureDate: number;\n\n currentSpace = { zones: [] } as any;\n\n visits: Visit[] = [];\n\n closeResult: string;\n\n @ViewChild('content', { static: false }) private content;\n\n modalReference: any;\n\n canCancelImport = false;\n\n imagesProcessed: number = 0;\n\n totalImages: number = 0;\n\n imagesUploaded: number = 0;\n\n menuItems: MenuItem[] = [];\n\n errorForm: boolean = false;\n\n isProcessing = false;\n\n destroy$ = new Subject();\n\n constructor(\n private fb: UntypedFormBuilder,\n private matterportImportService: MatterportImportService,\n private threejsImportService: ThreeJsImportService,\n private captureService: CaptureService,\n private nodeService: NodeService,\n private spaceService: SpaceService,\n private route: ActivatedRoute,\n private modalService: NgbModal,\n private visitService: VisitService,\n public validatorsService: ValidatorsService,\n private translate: TranslateService,\n private navigatorService: NavigatorService,\n private router: Router,\n ) {\n this.matterportImportService.importingImages.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.canCancelImport = true;\n });\n this.matterportImportService.sweepProcessedCount.pipe(takeUntil(this.destroy$)).subscribe((count) => {\n this.imagesProcessed = count + 1;\n });\n this.matterportImportService.totalSweepsCount.pipe(takeUntil(this.destroy$)).subscribe((count) => {\n this.totalImages = count;\n });\n\n this.navigatorService.locationIDChange\n .pipe(takeUntil(this.destroy$))\n .subscribe((spaceID) => {\n this.router.navigate([\"dashboard/localisation\", spaceID, \"visits\"]);\n });\n\n this.route.params.subscribe((params) => {\n this.spaceId = params.id;\n this.resetVisits();\n });\n }\n\n async ngOnInit(): Promise<void> {\n this.spaceId = this.route.snapshot.paramMap.get('id');\n await this.resetVisits();\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n /*\n Visit = {\n captureID: string,\n model3d: string,\n takenAt: number,\n spaceID: string,\n viewer: CaptureViewer,\n surface: number,\n node: Node,\n name?: string | null\n }\n */\n setupMenuItems() {\n this.menuItems = [\n { label: 'Locations', url: '/localisation' },\n {\n label: this.currentSpace.name,\n url: `/localisation/${this.currentSpace.id}`,\n },\n {\n label: 'Virtual visits',\n url: `/localisation/${this.currentSpace.id}/visits`,\n },\n ];\n }\n\n onGoBack() {\n this.onCancel();\n }\n\n async resetVisits() {\n this.visits = [];\n this.currentSpace = await this.spaceService.getSpace(this.spaceId);\n this.setupMenuItems();\n await this.visitService\n .getVisitsForSpaceForUser(this.spaceId)\n .then((visits) => {\n if (visits) {\n // 3D models share this storage but have their own screen, so listing them here\n // too showed every model twice. They can still be created from this form; they\n // just belong to the other tab once they exist.\n this.visits = visits.filter(\n (visit) => visit.viewer !== CaptureViewer.THREEJS,\n );\n }\n });\n }\n\n initVisitForm(input: Visit = null) {\n if (input) {\n this.visitForm = this.fb.group({\n captureID: input.captureID,\n nodeID: input.node.id,\n name: [input.name, [Validators.required]],\n model3D: [input.model3d, [Validators.required]],\n viewer: input.viewer ? input.viewer : CaptureViewer.MATTERPORT,\n surface: input.surface ? input.surface : null,\n threeJsPlacement: input.captureMetadata ?? null,\n });\n this.captureDate = input.takenAt;\n } else {\n this.visitForm = this.fb.group({\n model3D: [null, [Validators.required]],\n viewer: CaptureViewer.MATTERPORT,\n surface: null,\n name: [null, [Validators.required]],\n threeJsPlacement: null,\n });\n }\n }\n\n /** True while the form is set to create a Three.js visit, which asks for different fields. */\n get isThreeJsVisit(): boolean {\n return this.visitForm?.value.viewer === CaptureViewer.THREEJS;\n }\n\n /** Validation error for the 3D model field, or null. Only meaningful for Three.js visits. */\n get modelKeyError(): string | null {\n if (!this.isThreeJsVisit) {\n return null;\n }\n return this.threejsImportService.validateModelKey(this.visitForm.value.model3D);\n }\n\n async onToggleDetail(index) {\n this.visitIndexDetails = index === this.visitIndexDetails ? -1 : index;\n this.imagesUploaded = await this.matterportImportService.getUploadedImageCount(this.visits[index].model3d);\n }\n\n onAddVisit() {\n this.initVisitForm();\n this.menuItems.push({ label: 'New' });\n }\n\n onEdit(visit) {\n this.initVisitForm(visit);\n this.isEditing = true;\n this.menuItems.push({ label: visit.name });\n }\n\n async onSubmitVisit() {\n this.visitSubmitted = true;\n if (!this.visitForm.valid) {\n this.errorForm = true;\n return;\n }\n // A Three.js visit points at a file rather than a Matterport model, so the reference is\n // checked before anything is written - otherwise a typo creates zones and navigation for a\n // model that 404s the first time someone opens the visit.\n if (this.modelKeyError) {\n this.errorForm = true;\n return;\n }\n this.errorForm = false;\n const formValue = this.visitForm.value;\n const capture = {\n viewer: formValue.viewer,\n takenAt: this.captureDate,\n surface: formValue.surface,\n spaceID: this.currentSpace.id,\n metadata: this.isThreeJsVisit ? formValue.threeJsPlacement : null,\n } as Capture;\n\n if (this.isEditing) {\n capture.id = formValue.captureID;\n await this.captureService.updateCapture(capture);\n const node = {\n id: formValue.nodeID,\n model3D: formValue.model3D,\n metadata: formValue.name,\n } as Node;\n await this.nodeService.updateNode(node);\n } else {\n let createdNode;\n await this.captureService.createCapture(capture).then(async (res) => {\n if (res) {\n const node = {\n model3D: formValue.model3D,\n captureID: res.id,\n metadata: formValue.name,\n } as Node;\n createdNode = await this.nodeService.createNode(node);\n }\n });\n this.launchImport(\n formValue.model3D,\n formValue.surface,\n createdNode,\n formValue.viewer,\n false,\n false,\n formValue.threeJsPlacement\n )\n .then((success) => {\n this.modalReference.close('import ended with success');\n })\n .catch((e) => {\n this.modalReference.close(`Error while import: ${e}`);\n alert(`Error while import: ${e} ${JSON.stringify(e)}`);\n this.onDelete({\n node: createdNode,\n captureID: createdNode.captureID,\n } as Visit, false);\n });\n }\n await this.resetVisits();\n this.onCancel();\n }\n\n get model3D(): AbstractControl {\n return this.visitForm.get('model3D');\n }\n\n get name(): AbstractControl {\n return this.visitForm.get('name');\n }\n\n onCancel() {\n this.visitSubmitted = false;\n this.visitForm = null;\n this.isEditing = false;\n this.canCancelImport = false;\n this.totalImages = 0;\n this.imagesProcessed = 0;\n this.errorForm = false;\n this.setupMenuItems();\n }\n\n async onDelete(visit: Visit, needPermission = true) {\n const message = this.translate.instant('confirm.deleteVisit');\n // eslint-disable-next-line no-alert\n if (window.confirm(message) || !needPermission) {\n console.log(this.visitIndexDetails);\n this.isProcessing = true;\n await this.visitService.deleteVisit(visit, this.spaceId);\n await this.resetVisits();\n this.isProcessing = false;\n }\n }\n\n private getDismissReason(reason: any): string {\n if (reason === ModalDismissReasons.ESC) {\n return 'by pressing ESC';\n }\n if (reason === ModalDismissReasons.BACKDROP_CLICK) {\n return 'by clicking on a backdrop';\n }\n return `with: ${reason}`;\n }\n\n async launchImport(\n model3D,\n surface,\n node,\n viewerType: CaptureViewer,\n imagesOnly = false,\n overrideExisting = false,\n placementMetadata: string = null,\n ) {\n this.modalReference = this.modalService.open(this.content, {\n ariaLabelledBy: \"modal-basic-title\",\n });\n this.modalReference.result.then(\n (result) => {\n this.closeResult = `Closed with: ${result}`;\n console.log(this.closeResult);\n this.cancelImport();\n },\n (error) => {\n this.closeResult = `Dismissed ${this.getDismissReason(error)}`;\n console.log(this.closeResult);\n this.cancelImport();\n },\n );\n try {\n if (viewerType === CaptureViewer.THREEJS) {\n // Route the import to the new Three.js Import Service\n await this.threejsImportService.importData(\n this.spaceId,\n surface,\n imagesOnly,\n node,\n overrideExisting,\n placementMetadata\n );\n } else {\n // Route the import to the existing Matterport Import Service\n await this.matterportImportService.initSdkForModel(model3D);\n\n await this.matterportImportService.importData(\n this.spaceId,\n surface,\n imagesOnly,\n node,\n overrideExisting\n );\n }\n\n this.modalReference.close();\n\n } catch (error) {\n console.log(error);\n Promise.reject(error);\n }\n }\n\n private cancelImport() {\n this.matterportImportService.abandon();\n this.onCancel();\n this.resetVisits();\n }\n\n onImportImages(visit: Visit, overrideExisting) {\n this.launchImport(visit.model3d, null, visit.node.id, visit.viewer, true, overrideExisting, visit.captureMetadata);\n }\n\n isFormError(control) {\n return control && control.invalid && this.errorForm;\n }\n}\n","<div class=\"container-fluid\" class=\"dashboard-tab\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\n </div>\n\n <div class=\"row main-form-container\">\n <div class=\"col-md-6 form-container\">\n <ul class=\"list-group list-group-flush\" *ngIf=\"!visitForm\">\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let visit of visits; index as index\">\n <div class=\"d-flex justify-content-between align-items-center\" (click)=\"onToggleDetail(index)\">\n {{visit.name ? visit.name : visit.model3d }}\n <lib-chevron [conditionShowing]=\"index==visitIndexDetails\"></lib-chevron>\n </div>\n <div *ngIf=\"index==visitIndexDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}} : {{ visit.name ?\n visit.name : \"Not provided\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'3D Model' | translate}} : {{ visit.model3d }}\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Surface' | translate}}, m<sup>2</sup>: {{\n visit.surface ?\n visit.surface : 'Not provided' | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Viewer' | translate}} : {{ visit.viewer }}\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Date of capture' | translate}} : {{\n visit.takenAt | timeDateString | async}}\n <li class=\"list-group-item bg-transparent\">{{'Images are imported' | translate}} : {{\n imagesUploaded }}\n </li>\n </ul>\n \n <lib-loader *ngIf=\"isProcessing\"></lib-loader>\n\n <div class=\"action-button-container mt-3\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onImportImages(visit, true)\" [disabled]=\"isProcessing\">{{'Import all images' |\n translate}}</button>\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' |\n translate}} {{imagesUploaded}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" [disabled]=\"isProcessing\"\n (click)=\"onEdit(visit)\">{{'Edit' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" [disabled]=\"isProcessing\"\n (click)=\"onDelete(visit)\">{{'Delete' | translate}}</button>\n </div>\n </div>\n </li>\n </ul>\n <div *ngIf=\"visitForm\">\n <form (ngSubmit)=\"onSubmitVisit()\" [formGroup]=\"visitForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}}</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Reference 3D model' | translate}} *</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" [readonly]=\"isEditing\"\n [class.is-invalid]=\"model3D.invalid && visitSubmitted\" required\n formControlName=\"model3D\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-name-invalid\" [dismissible]=\"false\" type=\"danger\" \n *ngIf=\"validatorsService.isControlError(visitForm.controls['name']) \n || isFormError(visitForm.controls['name'])\">\n {{validatorsService.getError(visitForm.controls['name']) | translate}}\n </ngb-alert>\n </div>\n <div *ngIf=\"isEditing\" class=\"text-danger\">\n {{'Cannot change 3D model reference. Please add new model.' | translate}}\n </div>\n <!-- A Three.js visit stores an S3 key here instead of a Matterport model ID,\n so the field means something different depending on the viewer above. -->\n <div *ngIf=\"isThreeJsVisit\" class=\"form-text\">\n {{'S3 key of the .glb file, for example visits/my-model.glb' | translate}}\n </div>\n <div *ngIf=\"modelKeyError && visitSubmitted\" class=\"text-danger\">\n {{modelKeyError | translate}}\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Viewer' | translate}}</label>\n <div class=\"col-sm-10\">\n <select class=\"form-select\" formControlName=\"viewer\">\n <option value=\"MATTERPORT\">Matterport</option>\n <option value=\"THREEJS\">Modèle 3D (Three.js)</option>\n <option value=\"CUPIX\">Cupix</option>\n </select>\n </div>\n </div>\n\n <div class=\"mb-3 row\" *ngIf=\"isThreeJsVisit\">\n <label class=\"col-sm-2 col-form-label\">{{'Initial placement' | translate}}</label>\n <div class=\"col-sm-10\">\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"threeJsPlacement\"\n placeholder='{\"cameraPosition\": {\"x\": 0, \"y\": 5, \"z\": 15}, \"rotation\": {\"x\": 0, \"y\": 0, \"z\": 0}}'></textarea>\n <div class=\"form-text\">\n {{'Optional. Leave empty to frame the model automatically.' | translate}}\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Surface' | translate}}</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" formControlName=\"surface\">\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Capture Date' | translate}}</label>\n <div class=\"input-group\">\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"captureDate\" ngbDatepicker\n #d1=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\n <div class=\"input-group-append\">\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\"\n type=\"button\"></button>\n </div>\n </div>\n </div>\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill me-2\">{{'Save' |\n translate}}</button>\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\n translate}}</button>\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\n <ngb-alert data-testid=\"new-location-form-invalid\" [dismissible]=\"false\" type=\"danger\">\n {{'errorForm.infoBtn' |translate}}\n \n </ngb-alert>\n </div>\n </form>\n </div>\n <div *ngIf=\"!visitForm\">\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onAddVisit()\">{{'Add 3D visit' |\n translate}}</button>\n </div>\n </div>\n <div id=\"viewer-frame\" style=\"width: 100%; aspect-ratio: 2/1;\"></div>\n </div>\n <ng-template #content let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\" id=\"modal-basic-title\">{{'Importing Data' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n {{'Please do not leave or refresh this page...' | translate}}\n <div *ngIf=\"totalImages != 0\">Imported {{imagesProcessed}} out of {{totalImages}} images.</div>\n <div class=\"d-flex justify-content-center\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">{{'Loading' | translate}}...</span>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-dark\" [disabled]=\"!canCancelImport\"\n (click)=\"modal.close('Cancel click')\">{{'Cancel import of images' | translate}}</button>\n </div>\n </ng-template>\n</div>","import { Component, OnInit, ViewChild } from '@angular/core';\nimport {\n UntypedFormGroup,\n UntypedFormBuilder,\n Validators,\n} from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { NgbModal, ModalDismissReasons } from '@ng-bootstrap/ng-bootstrap';\nimport {\n Node,\n Visit,\n MenuItem,\n ThreeJsImportService,\n CaptureService,\n NodeService,\n SpaceService,\n VisitService,\n CaptureViewer,\n Capture,\n Space,\n ValidatorsService,\n uploadFileToS3WithProgress,\n} from '@smarterplan/ngx-smarterplan-core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Subject, takeUntil } from 'rxjs';\n\n/**\n * Admin screen for the 3D models a site can be visited with.\n *\n * These are stored the same way Matterport visits are - a Capture plus a Node - with the viewer set\n * to THREEJS and the .glb's S3 key in the node's model3D. Sharing the storage is what lets a site\n * carry several models and what makes tags follow the same POI records in either viewer; the split\n * here is only in the form: a 3D model is a name and a file, where a Matterport visit is a model ID\n * and capture details. Placement and alignment are not asked for here - the viewer's alignment tool\n * writes them into the capture's metadata once someone calibrates against a real scene.\n */\n@Component({\n selector: 'lib-models3d',\n templateUrl: './models3d.component.html',\n})\nexport class Models3dComponent implements OnInit {\n @ViewChild('content', { static: true }) content;\n\n menuItems: MenuItem[] = [];\n\n currentSpace: Space;\n\n spaceId: string;\n\n /** Only the visits captured as 3D models; Matterport ones stay on the Virtual Visits screen. */\n models: Visit[] = [];\n\n modelForm: UntypedFormGroup;\n\n modelIndexDetails = -1;\n\n isEditing = false;\n\n isProcessing = false;\n\n submitted = false;\n\n errorMessage: string | null = null;\n\n modalReference: any;\n\n destroy$ = new Subject();\n\n constructor(\n private fb: UntypedFormBuilder,\n private route: ActivatedRoute,\n private router: Router,\n private modalService: NgbModal,\n private spaceService: SpaceService,\n private visitService: VisitService,\n private captureService: CaptureService,\n private nodeService: NodeService,\n private threejsImportService: ThreeJsImportService,\n public validatorsService: ValidatorsService,\n private translate: TranslateService,\n ) {}\n\n async ngOnInit() {\n this.spaceId = this.route.snapshot.paramMap.get('id');\n await this.reload();\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n async reload() {\n this.currentSpace = await this.spaceService.getSpace(this.spaceId);\n this.setupMenuItems();\n const visits = await this.visitService.getVisitsForSpaceForUser(this.spaceId);\n this.models = (visits ?? []).filter((visit) => visit.viewer === CaptureViewer.THREEJS);\n }\n\n setupMenuItems() {\n this.menuItems = [\n { label: 'Locations', url: '/localisation' },\n { label: this.currentSpace.name, url: `/localisation/${this.currentSpace.id}` },\n { label: '3D Models', url: `/localisation/${this.currentSpace.id}/models3d` },\n ];\n }\n\n onGoBack() {\n this.router.navigate(['/dashboard/localisation', this.spaceId]);\n }\n\n onToggleDetail(index: number) {\n this.modelIndexDetails = index === this.modelIndexDetails ? -1 : index;\n }\n\n onAdd() {\n this.initForm();\n this.menuItems.push({ label: 'New' });\n }\n\n onEdit(model: Visit) {\n this.initForm(model);\n this.isEditing = true;\n this.menuItems.push({ label: model.name });\n }\n\n onCancel() {\n this.modelForm = null;\n this.isEditing = false;\n this.submitted = false;\n this.errorMessage = null;\n this.setupMenuItems();\n }\n\n initForm(input: Visit = null) {\n this.submitted = false;\n this.errorMessage = null;\n if (input) {\n this.modelForm = this.fb.group({\n captureID: input.captureID,\n nodeID: input.node.id,\n name: [input.name, [Validators.required]],\n modelKey: [input.model3d, [Validators.required]],\n });\n } else {\n this.modelForm = this.fb.group({\n name: [null, [Validators.required]],\n modelKey: [null, [Validators.required]],\n });\n }\n }\n\n /** Upload progress as a percentage, or null when nothing is uploading. */\n uploadPercent: number | null = null;\n\n uploadedFileName: string | null = null;\n\n /**\n * Uploads the chosen .glb and puts the resulting key on the form.\n *\n * Storage.put authenticates with the signed-in user's session rather than separate S3\n * credentials, so anyone who can reach this screen can upload - which is what makes picking a\n * file a better ask than typing a key someone else had to produce.\n */\n async onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (!file) {\n return;\n }\n\n const name = file.name.toLowerCase();\n if (!name.endsWith('.glb') && !name.endsWith('.gltf')) {\n this.errorMessage = this.translate.instant('Only .glb or .gltf files can be used as a 3D model.');\n input.value = '';\n return;\n }\n\n this.errorMessage = null;\n this.uploadPercent = 0;\n this.uploadedFileName = file.name;\n\n try {\n const key = await uploadFileToS3WithProgress(\n `models3d/${this.spaceId}/`,\n file,\n (fraction) => {\n this.uploadPercent = Math.round(fraction * 100);\n },\n );\n this.modelForm.patchValue({ modelKey: key });\n // Name the model after the file when the field is still empty, so the common case needs\n // no extra typing.\n if (!this.modelForm.value.name) {\n this.modelForm.patchValue({ name: file.name.replace(/\\.(glb|gltf)$/i, '') });\n }\n } catch (error) {\n this.errorMessage = this.describeError(error);\n this.uploadedFileName = null;\n } finally {\n this.uploadPercent = null;\n }\n }\n\n /** Validation error for the .glb key, or null. */\n get modelKeyError(): string | null {\n return this.threejsImportService.validateModelKey(this.modelForm?.value.modelKey);\n }\n\n async onSubmit() {\n this.submitted = true;\n this.errorMessage = null;\n\n if (!this.modelForm.valid || this.modelKeyError) {\n return;\n }\n\n const formValue = this.modelForm.value;\n const capture = {\n viewer: CaptureViewer.THREEJS,\n takenAt: Date.now(),\n spaceID: this.currentSpace.id,\n } as Capture;\n\n this.isProcessing = true;\n try {\n if (this.isEditing) {\n capture.id = formValue.captureID;\n // metadata is left untouched on edit: the alignment tool writes the visit's tag\n // transform there, and resending the form's idea of it would wipe that.\n await this.captureService.updateCapture(capture);\n await this.nodeService.updateNode({\n id: formValue.nodeID,\n model3D: formValue.modelKey,\n metadata: formValue.name,\n } as Node);\n } else {\n await this.createModel(formValue);\n }\n await this.reload();\n this.onCancel();\n } catch (error) {\n // The most likely failure is the backend rejecting the THREEJS enum value, which has not\n // shipped yet - say so rather than leaving an empty screen.\n this.errorMessage = this.describeError(error);\n } finally {\n this.isProcessing = false;\n }\n }\n\n /** Creates the capture, its node, and the zone/plan/navigation the viewer needs. */\n private async createModel(formValue: any) {\n const capture = await this.captureService.createCapture({\n viewer: CaptureViewer.THREEJS,\n takenAt: Date.now(),\n spaceID: this.currentSpace.id,\n } as Capture);\n\n if (!capture) {\n throw new Error('Could not create the capture for this 3D model.');\n }\n\n const node = await this.nodeService.createNode({\n model3D: formValue.modelKey,\n captureID: capture.id,\n metadata: formValue.name,\n } as Node);\n\n await this.threejsImportService.importData(\n this.spaceId,\n null,\n false,\n node,\n true,\n );\n }\n\n async onDelete(model: Visit) {\n this.modalReference = this.modalService.open(this.content);\n try {\n await this.modalReference.result;\n } catch {\n return; // dismissed\n }\n\n this.isProcessing = true;\n try {\n await this.nodeService.deleteNode(model.node.id);\n await this.captureService.deleteCapture(model.captureID);\n await this.reload();\n } catch (error) {\n this.errorMessage = this.describeError(error);\n } finally {\n this.isProcessing = false;\n }\n }\n\n /**\n * Turns whatever was thrown into something readable.\n *\n * AppSync rejections arrive as { errors: [{ message }] } with no `message` of their own, so the\n * obvious `error.message ?? String(error)` renders them as \"[object Object]\" - which hides\n * exactly the cases worth reading, like the backend refusing an enum value it does not know.\n */\n private describeError(error: any): string {\n if (typeof error === 'string') {\n return error;\n }\n const graphQlErrors = error?.errors;\n if (Array.isArray(graphQlErrors) && graphQlErrors.length > 0) {\n return graphQlErrors.map((e: any) => e?.message ?? JSON.stringify(e)).join(' | ');\n }\n if (error?.message) {\n return error.message;\n }\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n }\n\n getDismissReason(reason: any): string {\n if (reason === ModalDismissReasons.ESC) {\n return 'by pressing ESC';\n }\n if (reason === ModalDismissReasons.BACKDROP_CLICK) {\n return 'by clicking on a backdrop';\n }\n return `with: ${reason}`;\n }\n}\n","<div class=\"container-fluid\" class=\"dashboard-tab\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\n </div>\n\n <div class=\"row main-form-container\">\n <div class=\"col-md-6 form-container\">\n\n <!-- List -->\n <ul class=\"list-group list-group-flush\" *ngIf=\"!modelForm\">\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let model of models; index as index\">\n <div class=\"d-flex justify-content-between align-items-center\" (click)=\"onToggleDetail(index)\">\n {{ model.name ? model.name : model.model3d }}\n <lib-chevron [conditionShowing]=\"index == modelIndexDetails\"></lib-chevron>\n </div>\n <div *ngIf=\"index == modelIndexDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}} :\n {{ model.name ? model.name : ('Not provided' | translate) }}</li>\n <li class=\"list-group-item bg-transparent\">{{'3D model file' | translate}} :\n {{ model.model3d }}</li>\n <li class=\"list-group-item bg-transparent\">{{'Surface' | translate}}, m<sup>2</sup> :\n {{ model.surface ? model.surface : ('Not provided' | translate) }}</li>\n <li class=\"list-group-item bg-transparent\">{{'Initial placement' | translate}} :\n {{ model.captureMetadata ? model.captureMetadata : ('Automatic' | translate) }}</li>\n </ul>\n\n <lib-loader *ngIf=\"isProcessing\"></lib-loader>\n\n <div class=\"action-button-container mt-3\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n [disabled]=\"isProcessing\" (click)=\"onEdit(model)\">{{'Edit' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n [disabled]=\"isProcessing\" (click)=\"onDelete(model)\">{{'Delete' | translate}}</button>\n </div>\n </div>\n </li>\n </ul>\n\n <!-- An empty list with a button under it reads as \"nothing here\" and the button gets\n missed. With nothing to list, the action is the whole screen. -->\n <div *ngIf=\"!modelForm && models.length === 0\" class=\"text-center py-5\">\n <p class=\"text-muted\">{{'No 3D model yet for this location.' | translate}}</p>\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\n (click)=\"onAdd()\">{{'Add a 3D model' | translate}}</button>\n </div>\n\n <div class=\"action-button-container mt-3\" *ngIf=\"!modelForm && models.length > 0\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"onAdd()\">{{'Add a 3D model' | translate}}</button>\n </div>\n\n <!-- Form -->\n <form *ngIf=\"modelForm\" [formGroup]=\"modelForm\" (ngSubmit)=\"onSubmit()\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"name\"\n [class.is-invalid]=\"submitted && modelForm.controls['name'].invalid\">\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'3D model file' | translate}} *</label>\n <div class=\"col-sm-9\">\n <!-- styles.scss hides every input[type=file] app-wide; the convention here is a\n styled label wrapping the hidden input, as on the profile screen. -->\n <label for=\"model3d-file\" class=\"btn btn-outline-primary rounded-pill\">\n <input type=\"file\" id=\"model3d-file\" accept=\".glb,.gltf\"\n [disabled]=\"uploadPercent !== null\" (change)=\"onFileSelected($event)\">\n {{'Choose a file' | translate}}\n </label>\n <span *ngIf=\"uploadedFileName && uploadPercent === null\" class=\"ms-2\">{{uploadedFileName}}</span>\n\n <div *ngIf=\"uploadPercent !== null\" class=\"mt-2\">\n <div class=\"progress\" style=\"height: 6px;\" role=\"progressbar\"\n [attr.aria-valuenow]=\"uploadPercent\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n <div class=\"progress-bar\" style=\"transition: none;\"\n [style.width.%]=\"uploadPercent\"></div>\n </div>\n <div class=\"form-text\">{{'Uploading' | translate}} {{uploadedFileName}} — {{uploadPercent}}%</div>\n </div>\n\n <div *ngIf=\"uploadPercent === null && modelForm.value.modelKey\" class=\"form-text text-success\">\n {{ modelForm.value.modelKey }}\n </div>\n\n <div *ngIf=\"submitted && modelKeyError\" class=\"text-danger\">\n {{ modelKeyError | translate }}\n </div>\n </div>\n </div>\n\n <ngb-alert *ngIf=\"errorMessage\" type=\"danger\" [dismissible]=\"false\">\n {{ errorMessage }}\n </ngb-alert>\n\n <lib-loader *ngIf=\"isProcessing\"></lib-loader>\n\n <div class=\"action-button-container mt-3\">\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill me-2\"\n [disabled]=\"isProcessing\">{{'Save' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-secondary rounded-pill\"\n [disabled]=\"isProcessing\" (click)=\"onCancel()\">{{'Cancel' | translate}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n<ng-template #content let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Delete' | translate}}</h4>\n </div>\n <div class=\"modal-body\">\n <p>{{'This 3D model will be removed from this location.' | translate}}</p>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary rounded-pill\"\n (click)=\"modal.dismiss()\">{{'Cancel' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"modal.close('confirmed')\">{{'Delete' | translate}}</button>\n </div>\n</ng-template>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\n@Component({\n selector: 'lib-carousel',\n templateUrl: './carousel.component.html',\n styleUrls: ['./carousel.component.scss']\n})\nexport class CarouselComponent implements OnInit {\n\n @Input() images;\n\n @Output() currentScan = new EventEmitter<number>();\n\n dataEvent: string;\n\n constructor() { }\n\n ngOnInit(): void {\n this.currentScan.emit(0);\n }\n\n onSlide(event) {\n this.dataEvent = JSON.stringify(event);\n const imageIndex = Number.parseInt(\n event.current.replace(\"slideId_\", \"\"),\n 10,\n );\n this.currentScan.emit(imageIndex);\n }\n\n}\n","<ngb-carousel [interval]=\"5000\" *ngIf=\"images && images.length > 1\" (slide)=\"onSlide($event)\">\n <ng-template *ngFor=\"let image of images; let i = index\" ngbSlide [id]=\"'slideId_' + i\">\n <div class=\"picsum-img-wrapper\">\n <img [src]=\"image.path\" alt=\"Scan\" class=\"d-block w-100\">\n </div>\n <div class=\"carousel-caption\">\n <h3>{{image.title}}</h3>\n <p>{{image.description}}</p>\n </div>\n </ng-template>\n</ngb-carousel>\n\n<img *ngIf=\"images.length === 1\" [src]=\"images[0].path\" alt=\"Scan\" class=\"d-block w-100\">\n","export type Rectangle = {\n top: number;\n left: number;\n width: number;\n height: number;\n};\n\nexport enum SweepState {\n ADDED,\n REMOVED,\n DISABLED,\n OCCUPIED,\n STARTPOINT\n}\n\nexport function isInPolygon(p: { x: any; y: any; }, polygon: string | any[]): boolean {\n\n let isInside = false;\n let minX = polygon[0].x;\n let maxX = polygon[0].x;\n let minY = polygon[0].y;\n let maxY = polygon[0].y;\n for (let n = 1; n < polygon.length; n++) {\n const q = polygon[n];\n minX = Math.min(q.x, minX);\n maxX = Math.max(q.x, maxX);\n minY = Math.min(q.y, minY);\n maxY = Math.max(q.y, maxY);\n }\n\n if (p.x < minX || p.x > maxX || p.y < minY || p.y > maxY) {\n return false;\n }\n\n for (\n let index = 0, index_ = polygon.length - 1;\n index < polygon.length;\n index_ = index++\n ) {\n if (\n polygon[index].y > p.y !== polygon[index_].y > p.y &&\n p.x <\n ((polygon[index_].x - polygon[index].x) *\n (p.y - polygon[index].y)) /\n (polygon[index_].y - polygon[index].y) +\n polygon[index].x\n ) {\n isInside = !isInside;\n }\n }\n return isInside;\n}\n\nexport function rotate(point: { x: any; y: any; }, center: { x: any; y: any; }, angle: number) {\n let xM;\n let yM;\n let x;\n let y;\n angle *= Math.PI / 180;\n xM = point.x - center.x;\n yM = point.y - center.y;\n x = xM * Math.cos(angle) + yM * Math.sin(angle) + center.x;\n y = -xM * Math.sin(angle) + yM * Math.cos(angle) + center.y;\n return { x: Math.round(x), y: Math.round(y) };\n}\n\n/**\n * Check if an HtmlElement is inside a selection\n * @param button HTMLElement\n * @param selection\n * @returns true if the element is inside the selection, false otherwise\n */\nexport function buttonIsInSelection(\n button: HTMLButtonElement,\n selection: Rectangle,\n): boolean {\n const bounds = button.getBoundingClientRect();\n return (\n bounds.bottom > selection.top &&\n bounds.top < selection.top + selection.height &&\n bounds.right > selection.left &&\n bounds.left < selection.left + selection.width\n );\n}\n\n/**\n * Styles the button that represents a sweep on the plan: green-added to zone, red -not added, gray - disabled, orange - occupied\n * @param button HTMLButtonElement, button on the plan, \n * @param isAdded boolean, if the sweep added to the zone\n * @param isOccupied boolean, if the sweep added to any other zone (but not current)\n */\nexport function styleButton(button: HTMLButtonElement, state: SweepState) {\n switch (state) {\n case SweepState.ADDED:\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\n break;\n case SweepState.DISABLED:\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=black&height=17&width=17\")`;\n button.style.cursor = \"auto\";\n break;\n case SweepState.OCCUPIED:\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`;\n break;\n case SweepState.STARTPOINT:\n button.style.backgroundImage = `url('https://api.iconify.design/ic/baseline-flag-circle.svg?color=white&width=17&height=17')`;\n break;\n case SweepState.REMOVED:\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\n break;\n default:\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\n break;\n }\n // if (disabled) {\n // button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=#636363&height=17&width=17\")`;\n // button.style.cursor = \"auto\";\n // } else if (isOccupied) {\n // button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`;\n // } else {\n // button.style.backgroundImage = isAdded\n // ? `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`\n // : `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\n // }\n button.style.backgroundColor = \"transparent\";\n button.style.position = \"absolute\";\n button.style.border = \"none\";\n button.style.width = \"17px\";\n button.style.height = \"17px\";\n button.disabled = false;\n button.type = \"button\";\n}\n\n/**\n * Check if sweep (button) is chosen; it is reprsented by image style \"mdi:adjust\"\n * @param button HTMLElement\n * @returns boolean, if button was selected\n */\nexport function buttonIsChosen(button: HTMLElement): boolean {\n return button.style.backgroundImage.includes(\"adjust\");\n}\n\n/**\n * Visually change the state of a scan button, a selected button is blue\n * @param button HTMLElement\n * @param selected if true the button will be blue, otherwise it will red or green\n */\nexport function setVisuallySelected(button: HTMLElement, selected: boolean) {\n if (selected) {\n /** Color in blue */\n button.style.backgroundImage = button.style.backgroundImage\n .replace(\"red\", \"blue\")\n .replace(\"green\", \"blue\");\n } else {\n /** Get back in red or green */\n const color = buttonIsChosen(button) ? \"green\" : \"red\";\n button.style.backgroundImage = button.style.backgroundImage.replace(\n \"blue\",\n color,\n );\n }\n}","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport { Rectangle } from '../../../../helper.service';\n\n@Component({\n selector: 'lib-selection',\n templateUrl: './selection.component.html',\n styleUrls: ['./selection.component.scss']\n})\nexport class SelectionComponent implements OnInit {\n constructor(){}\n\n /**Emit a new selection */\n @Output() onSelectionChanged = new EventEmitter<Rectangle>();\n\n /**Zone wich you can use a selection inside, must have the class \".selectZone\" */\n selectionableZone : HTMLElement;\n\n /**HtmlElement use to display the selected zone (blue) */\n selectionElement : HTMLElement;\n\n isMousedown : boolean = false;\n\n selection = {startX: 0, startY: 0, endX: 0, endY: 0};\n\n selectionRectangle : Rectangle = {top : 0, left: 0, width: 0, height: 0};\n\n ngOnInit(): void {\n this.selectionableZone = document.querySelector(\".selectZone\");\n\n this.selectionElement = document.querySelector(\"#selection\");\n\n this.selectionableZone.addEventListener(\"mousedown\",this.mousedown.bind(this));\n\n this.selectionableZone.addEventListener(\"mousemove\",this.mousemove.bind(this));\n\n this.selectionableZone.addEventListener(\"mouseup\",this.mouseup.bind(this));\n }\n \n /**\n * Update the current selection\n * Will update the selectionRectangle and Selection HTML element\n * @param shouldEmit if true an event will be emitted through onSelectionChanged (true by default)\n */\n updateSelectionElement(shouldEmit=true){\n this.selectionRectangle.width = Math.abs(this.selection.endX - this.selection.startX);\n this.selectionRectangle.height = Math.abs(this.selection.endY - this.selection.startY);\n this.selectionRectangle.top = Math.min(this.selection.endY, this.selection.startY);\n this.selectionRectangle.left = Math.min(this.selection.endX, this.selection.startX);\n\n this.selectionElement.style.top = `${this.selectionRectangle.top}px`;\n this.selectionElement.style.left = `${this.selectionRectangle.left}px`;\n this.selectionElement.style.width = `${this.selectionRectangle.width}px`;\n this.selectionElement.style.height = `${this.selectionRectangle.height}px`;\n\n if(shouldEmit){\n this.onSelectionChanged.emit(this.selectionRectangle);\n }\n }\n\n /**\n * Trigger when mouse is press down on selectionableZone\n * @param event \n */\n mousedown(event : MouseEvent){\n if(event.button !== 2){ /**Selection with the right click, so ignore all other event */\n return;\n }\n this.isMousedown = true;\n this.selection = {startY : event.clientY, startX : event.clientX, endX:event.clientX, endY:event.clientY};\n this.updateSelectionElement(); \n }\n\n /**\n * Trigger when mouse is release on selectionableZone\n * @param event \n */\n mouseup(event : MouseEvent){\n this.isMousedown = false;\n this.selection = {startX :0, startY : 0, endX:0, endY:0};\n this.updateSelectionElement(false); \n }\n\n /**\n * Trigger when mouse is moving on selectionableZone\n * @param event \n */\n mousemove(event : MouseEvent){\n if(this.isMousedown){\n this.selection.endX = event.clientX;\n this.selection.endY = event.clientY;\n this.updateSelectionElement();\n }\n }\n\n}\n","<ng-content></ng-content>\n\n<div id=\"selection\"></div>","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\n@Component({\n selector: 'lib-radio-button',\n templateUrl: './radio-button.component.html',\n styleUrls: ['./radio-button.component.scss']\n})\nexport class RadioButtonComponent implements OnInit {\n\n @Input() label: string;\n\n @Output() isCheckedEvent = new EventEmitter<boolean>();\n\n isChecked: boolean;\n\n constructor() { }\n\n ngOnInit(): void {\n this.isChecked = false;\n }\n\n onChecked() {\n this.isCheckedEvent.emit(this.isChecked);\n }\n\n}\n","<div class=\"checkboxContainer\">\n <div class=\"switchContainer\">\n <label class=\"switch switch-success\">\n <input type=\"checkbox\" [(ngModel)]=\"isChecked\" (change)=\"onChecked()\">\n <span class=\"slider round\"></span>\n </label>\n </div>\n <span class=\"label right\">{{label | translate}}</span>\n</div>","import { Component, OnInit, Input, OnChanges } from '@angular/core';\nimport { TranslateService } from \"@ngx-translate/core\";\n\n@Component({\n selector: 'lib-plan-legend',\n templateUrl: './plan-legend.component.html',\n styleUrls: ['./plan-legend.component.scss']\n})\nexport class PlanLegendComponent implements OnInit {\n @Input() isAudioZone?:boolean = false;\n\n buttonsToRender = [];\n\n colorToText = {};\n\n constructor(\n private translate: TranslateService,\n ) {}\n\n async ngOnInit() {\n this.render()\n }\n\n async render() {\n this.buttonsToRender = [\n {\n url: `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`,\n text: this.translate.instant(\"legend.green\")\n },\n {\n url: `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`,\n text: this.translate.instant(\"legend.red\")\n }\n ]\n if (this.isAudioZone) {\n let audioPoints = [{\n url: `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=black&height=17&width=17\")`,\n text: this.translate.instant(\"legend.black\")\n },\n {\n url: `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`,\n text: this.translate.instant(\"legend.orange\")\n }]\n this.buttonsToRender = this.buttonsToRender.concat(audioPoints)\n }\n }\n\n //styleButton(element, SweepState.DISABLED);\n\n}\n","<div class=\"mt-3 ms-3\" class=\"legendContainer\">\n <h5>{{\"legend.title\" | translate}}</h5>\n <div class=\"legendBox\">\n <div class=\"legendRow\" *ngFor=\"let elemnt of buttonsToRender\">\n <button class=\"legendIcon\" [ngStyle] = \"{'background-image': elemnt.url}\"></button>\n <span>{{elemnt.text}}</span>\n </div>\n </div>\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { getCoefficientsForImage, getMetaForImage, Navigation, NavigationService, Plan, Zone, showScanPointsOnPlanInDiv, ZoneService, PlanService } from '@smarterplan/ngx-smarterplan-core';\nimport panzoom, { PanZoom } from 'panzoom';\nimport { buttonIsInSelection, isInPolygon, Rectangle, rotate, setVisuallySelected, styleButton, SweepState } from '../../../../helper.service';\n\n@Component({\n selector: 'lib-sweep-plan-selection',\n templateUrl: './sweep-plan-selection.component.html',\n styleUrls: ['./sweep-plan-selection.component.scss']\n})\nexport class SweepPlanSelectionComponent implements OnInit {\n\n plans: Plan[];\n\n @Input() spaceID: string;\n\n @Input() chosenScansOnPlan: string[] = [];\n\n /** if comming from Edit Plan SVG Zone creation */\n @Input() newZoneData: any;\n\n navIDsZoneEdit: string[] = [];\n\n // sweeps belonging to any audio zone\n @Input() occupiedSweeps: string[] = [];\n\n // sweeps unavailable (cannot be chosen)\n @Input() unavailableSweeps: string[] = [];\n\n // if choosing sweeps for audio zone\n @Input() editingAudioZone: boolean = false;\n\n @Input() inputZone: Zone;\n\n @Input() multipleFloors: boolean = false;\n\n chosenPlan: Plan;\n\n /** panZoom element for adding scans */\n panZoom: PanZoom;\n\n /** divPlan (use By panZoom) */\n divPlan: HTMLElement;\n\n /** all scan buttons Element */\n buttonElements: HTMLButtonElement[] = [];\n\n /** Scan buttons that are in the current selection */\n buttonsInSelection: HTMLButtonElement[] = [];\n\n @Output() sweepsSelected = new EventEmitter<{ sweeps: string[]; startSweepID: string; }>();\n\n isSettingStartSweep = false;\n\n startSweepID: string;\n\n chosenSweepsPerFloor = new Map<string, string[]>(); // map matching floorID to sweeps selected\n\n inputSweepsPerFloor = new Map<string, string[]>(); // map matching floorID to sweeps selected for zone in edition\n\n selectionChanged = false;\n\n constructor(\n private zoneService: ZoneService,\n private navigationService: NavigationService,\n private planService: PlanService,\n private translate: TranslateService,\n ) { }\n\n async ngOnInit() {\n await this.getPlans();\n this.setSweepsOfInputZone();\n }\n\n ngOnChanges() {\n if (this.chosenPlan) {\n this.setSweepsOfInputZone();\n this.chosenScansOnPlan = [];\n this.clearDivPlan();\n this.addScanPoints();\n }\n }\n\n setSweepsOfInputZone() {\n this.navIDsZoneEdit = this.inputZone ? this.inputZone.sweepIDs : [];\n if (this.multipleFloors) {\n this.plans.forEach((plan) => {\n if (!this.inputSweepsPerFloor.get(plan.zoneID)) {\n this.inputSweepsPerFloor.set(plan.zoneID,\n this.navIDsZoneEdit.filter((sweep) => plan.zone.sweepIDs.includes(sweep)));\n }\n });\n } else {\n if (this.inputZone) {\n //filter plans only for the parent Zone\n this.plans = this.plans.filter((p) => p.zoneID === this.inputZone.parentID);\n }\n }\n }\n\n async getPlans() {\n this.plans = await this.planService.getSingedPlansForSpace(\n this.spaceID,\n );\n }\n\n async onPlanClick(plan: Plan) {\n const switchPlan = () => {\n this.selectionChanged = false;\n this.chosenPlan = plan;\n this.chosenScansOnPlan = [];\n this.clearDivPlan();\n this.addScanPoints();\n };\n if (this.selectionChanged) {\n const message = this.translate.instant(\"confirm.cancelModifZoneSweeps\");\n if (window.confirm(message)) {\n switchPlan();\n }\n } else {\n switchPlan();\n }\n }\n\n async addScanPoints() {\n let wasModified = false;\n if (this.multipleFloors) {\n // check if we have already validated buttons for this floor\n if (this.chosenSweepsPerFloor.get(this.chosenPlan.zoneID)) {\n this.chosenScansOnPlan = this.chosenSweepsPerFloor.get(this.chosenPlan.zoneID);\n wasModified = true;\n }\n }\n this.divPlan = document.querySelector(\"#planDiv\") as HTMLElement;\n const zoneOfPlan = await this.zoneService.getZone(\n this.chosenPlan.zoneID,\n );\n const navigations = await this.navigationService.getNavigationsForZone(\n zoneOfPlan,\n );\n if (this.newZoneData) await this.setScanByDraw(navigations);\n this.buttonElements = await showScanPointsOnPlanInDiv(\n this.chosenPlan,\n this.divPlan,\n navigations,\n );\n for (const element of this.buttonElements) {\n if (this.unavailableSweeps && this.unavailableSweeps.includes(element.id)) {\n styleButton(element, SweepState.DISABLED);\n } else {\n\n if (wasModified) {\n if (this.chosenScansOnPlan.includes(element.id)) {\n styleButton(element, SweepState.ADDED);\n } else {\n styleButton(element, SweepState.REMOVED);\n }\n } else {\n if (\n this.navIDsZoneEdit.length > 0 &&\n this.navIDsZoneEdit.includes(element.id)) {\n styleButton(element, SweepState.ADDED);\n if (!this.chosenScansOnPlan.includes(element.id)) {\n this.chosenScansOnPlan.push(element.id);\n }\n } else if (this.occupiedSweeps && this.occupiedSweeps.includes(element.id)) {\n styleButton(element, SweepState.OCCUPIED);\n } else {\n styleButton(element, SweepState.REMOVED);\n }\n }\n\n //start point should be last condition \n if (this.inputZone && this.inputZone.startSweepID === element.id) {\n console.log(\"setting start point\");\n styleButton(element, SweepState.STARTPOINT);\n }\n element.addEventListener(\"click\", (event) =>\n this.onButtonScanClicked(event.target as HTMLElement),\n );\n }\n }\n this.panZoom = panzoom(this.divPlan, {\n bounds: true,\n boundsPadding: 0,\n maxZoom: 3.5,\n beforeMouseDown(e: MouseEvent) {\n return (\n e.button === 2\n ); /** Ignore event for right click (use for selecting) */\n },\n });\n if (this.multipleFloors) {\n this.chosenSweepsPerFloor.set(this.chosenPlan.zoneID, [...this.chosenScansOnPlan]);\n }\n }\n\n /** Function if we are coming for svg editor workflow */\n setScanByDraw(navigations: any[]): Promise<void> {\n return new Promise(async (resolve) => {\n const rect = {\n width: this.newZoneData.width,\n height: this.newZoneData.height,\n };\n const img = await getMetaForImage(this.chosenPlan.filepath);\n const { coeffX, coeffY } = getCoefficientsForImage(img, rect);\n\n const draw = this.newZoneData.elements;\n\n draw.map(async (element: any) => {\n switch (element.nodeName) {\n case \"rect\":\n await this.setScanInRect(\n img,\n coeffX,\n coeffY,\n element,\n navigations,\n );\n break;\n\n case \"ellipse\":\n await this.setScanInCircle(\n img,\n coeffX,\n coeffY,\n element,\n navigations,\n );\n break;\n\n case \"path\":\n await this.setScanInPolygon(\n img,\n coeffX,\n coeffY,\n element,\n navigations,\n );\n break;\n default:\n break;\n }\n });\n\n resolve();\n });\n }\n\n async setScanInRect(img: any, coeffX: number, coeffY: number,\n element: { angle: any; cx: any; cy: any; x: number; width: any; y: number; height: any; }, navigations: any[]) {\n const calibrage = JSON.parse(this.chosenPlan.calibration);\n navigations.map((navigation) => {\n const positionsOnPlan = navigation.positionOnPlan.map((entry) =>\n JSON.parse(entry),\n );\n const positionOnPlan = positionsOnPlan.find(\n (data) => data.planID === this.chosenPlan.id,\n );\n if (positionOnPlan) {\n const realWidth = img.width / coeffX;\n const realHeight = img.height / coeffY;\n const navY = (positionOnPlan.y * realHeight) / calibrage.imgHeight;\n const navX = (positionOnPlan.x * realWidth) / calibrage.imgWidth;\n if (\n navX > element.x &&\n navX < element.x + element.width &&\n navY > element.y &&\n navY < element.y + element.height &&\n !this.navIDsZoneEdit.includes(navigation.id)\n ) {\n this.navIDsZoneEdit.push(navigation.id);\n }\n }\n\n // old calibration:\n // const position = JSON.parse(navigation.position);\n // let navX = (calibrage.offsetX + position.x * calibrage.x) / coeffX;\n // let navY = (calibrage.offsetY + position.z * calibrage.y) / coeffY;\n // if (element.angle) {\n // const rotatePos = rotate(\n // { x: navX, y: navY },\n // { x: element.cx, y: element.cy },\n // element.angle,\n // );\n // navX = rotatePos.x;\n // navY = rotatePos.y;\n // }\n /**\n * TODO calculer la rotation du rectangle\n */\n // if (\n // navX > element.x &&\n // navX < element.x + element.width &&\n // navY > element.y &&\n // navY < element.y + element.height &&\n // !this.navIDsZoneEdit.includes(navigation.id)\n // ) {\n // this.navIDsZoneEdit.push(navigation.id);\n // }\n });\n } // EO\n\n async setScanInCircle(img: any, coeffX: number, coeffY: number,\n element: { angle: any; cx: number; cy: number; rx: number; ry: number; }, navigations: Navigation[]) {\n const calibrage = JSON.parse(this.chosenPlan.calibration);\n navigations.map(navigation => {\n const positionsOnPlan = navigation.positionOnPlan.map((entry) =>\n JSON.parse(entry),\n );\n const positionOnPlan = positionsOnPlan.find(\n (data) => data.planID === this.chosenPlan.id,\n );\n if (positionOnPlan) {\n const realWidth = img.width / coeffX;\n const realHeight = img.height / coeffY;\n let navY = (positionOnPlan.y * realHeight) / calibrage.imgHeight;\n let navX = (positionOnPlan.x * realWidth) / calibrage.imgWidth;\n if (element.angle) {\n const rotatePos = rotate(\n { x: navX, y: navY },\n { x: element.cx, y: element.cy },\n element.angle,\n );\n navX = rotatePos.x;\n navY = rotatePos.y;\n }\n\n const valueX =\n Math.pow(navX - element.cx, 2) / Math.pow(element.rx, 2);\n const valueY =\n Math.pow(navY - element.cy, 2) / Math.pow(element.ry, 2);\n const result = valueX + valueY;\n if (result <= 1 && !this.navIDsZoneEdit.includes(navigation.id)) {\n this.navIDsZoneEdit.push(navigation.id);\n }\n }\n\n // old calibration\n // const position = JSON.parse(navigation.position);\n // let navX = (calibrage.offsetX + position.x * calibrage.x) / coeffX;\n // let navY = (calibrage.offsetY + position.z * calibrage.y) / coeffY;\n // if (element.angle) {\n // const rotatePos = rotate(\n // { x: navX, y: navY },\n // { x: element.cx, y: element.cy },\n // element.angle,\n // );\n // navX = rotatePos.x;\n // navY = rotatePos.y;\n // }\n\n // const valueX =\n // Math.pow(navX - element.cx, 2) / Math.pow(element.rx, 2);\n // const valueY =\n // Math.pow(navY - element.cy, 2) / Math.pow(element.ry, 2);\n // const result = valueX + valueY;\n // if (result <= 1 && !this.navIDsZoneEdit.includes(navigation.id)) {\n // this.navIDsZoneEdit.push(navigation.id);\n // }\n });\n } // EO\n\n async setScanInPolygon(img: any, coeffX: number, coeffY: number, element: { segList: any; }, navigations: any[]) {\n const calibrage = JSON.parse(this.chosenPlan.calibration);\n navigations.map(async (navigation) => {\n\n const positionsOnPlan = navigation.positionOnPlan.map((entry) =>\n JSON.parse(entry),\n );\n const positionOnPlan = positionsOnPlan.find(\n (data) => data.planID === this.chosenPlan.id,\n );\n if (positionOnPlan) {\n const realWidth = img.width / coeffX;\n const realHeight = img.height / coeffY;\n let navY = (positionOnPlan.y * realHeight) / calibrage.imgHeight;\n let navX = (positionOnPlan.x * realWidth) / calibrage.imgWidth;\n\n const p = {\n x: navX,\n y: navY,\n };\n if (\n isInPolygon(p, element.segList) &&\n !this.navIDsZoneEdit.includes(navigation.id)\n ) {\n this.navIDsZoneEdit.push(navigation.id);\n }\n }\n\n // old calibration\n // const position = JSON.parse(navigation.position);\n // const p = {\n // x: (calibrage.offsetX + position.x * calibrage.x) / coeffX,\n // y: (calibrage.offsetY + position.z * calibrage.y) / coeffY,\n // };\n // if (element.angle) {\n // p = this.rotate(\n // p,\n // { x: element.cx, y: element.cy },\n // element.angle,\n // );\n // }\n // if (\n // isInPolygon(p, element.segList) &&\n // !this.navIDsZoneEdit.includes(navigation.id)\n // ) {\n // this.navIDsZoneEdit.push(navigation.id);\n // }\n });\n }\n\n clearDivPlan() {\n if (this.divPlan) this.divPlan.innerHTML = \"\";\n }\n\n\n /**\n * Trigger each by the selectionComponent when selection change\n * Update the current selected scan buttons\n * @param selection new selection\n */\n onSelectionChanged(selection: Rectangle) {\n const unselectedButtons: HTMLButtonElement[] = [];\n const newSelectedButtons = [];\n\n /** For each button, decide whether will be add to selected list or unselected list */\n for (const button of this.buttonElements) {\n const isSelected = buttonIsInSelection(button, selection);\n if (this.buttonsInSelection.includes(button)) {\n /** If the button is already in the selected list, we check if it should be unselect */\n if (!isSelected) {\n unselectedButtons.push(button);\n }\n } else if (isSelected) {\n newSelectedButtons.push(button);\n }\n }\n\n /** Visually Update unselected list */\n for (const button of unselectedButtons) {\n setVisuallySelected(button, false);\n }\n\n /** Visually Update selected list */\n for (const button of newSelectedButtons) {\n setVisuallySelected(button, true);\n }\n\n /** Remove unselected list */\n this.buttonsInSelection = this.buttonsInSelection.filter((button) => {\n return !unselectedButtons.includes(button);\n });\n /** Add new selected buttons */\n this.buttonsInSelection = [\n ...this.buttonsInSelection,\n ...newSelectedButtons,\n ];\n }\n\n\n\n /**\n * Trigger when the user click to add the selected scans\n */\n onSelectionAdd() {\n for (const button of this.buttonsInSelection) {\n if (!this.chosenScansOnPlan.includes(button.id)) {\n this.onButtonScanClicked(button);\n }\n }\n\n this.onSelectionChanged({ top: 0, left: 0, width: 0, height: 0 });\n }\n\n /**\n * Trigger when the user click to remove the selected scans\n */\n onSelectionRemove() {\n for (const button of this.buttonsInSelection) {\n if (this.chosenScansOnPlan.includes(button.id)) {\n this.onButtonScanClicked(button);\n }\n }\n this.onSelectionChanged({ top: 0, left: 0, width: 0, height: 0 });\n }\n\n /**\n * Trigger when the user click to select all scans\n */\n onSelectAll() {\n this.buttonsInSelection = [...this.buttonElements];\n for (const button of this.buttonsInSelection) {\n setVisuallySelected(button, true);\n }\n }\n\n /**\n * Trigger when the user change the size of the scan points\n * @param event\n */\n onChangeScanSize(event: any) {\n const factor = event.target.value;\n\n for (const button of this.buttonElements) {\n button.style.transform = `scale(${factor})`;\n }\n }\n\n /**\n * When a button representing a scan is clicked\n * @param button\n */\n onButtonScanClicked(button: HTMLElement) {\n this.selectionChanged = true;\n if (this.isSettingStartSweep) {\n if (this.startSweepID === button.id) {\n // we deselect the starting point\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\n this.startSweepID = null;\n return;\n }\n button.style.backgroundImage = `url('https://api.iconify.design/ic/baseline-flag-circle.svg?color=white&width=17&height=17')`;\n if (!this.chosenScansOnPlan.includes(button.id)) {\n this.chosenScansOnPlan.push(button.id);\n }\n if (this.startSweepID) {\n // we are changing start sweep\n const btnChanged = this.buttonElements.find((btn) => btn.id === this.startSweepID);\n btnChanged.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\n }\n this.startSweepID = button.id;\n return;\n }\n if (!this.chosenScansOnPlan.includes(button.id)) {\n // add to selection\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=green&height=17&width=17\")`;\n this.chosenScansOnPlan.push(button.id);\n } else {\n // remove from selection\n if (this.occupiedSweeps.includes(button.id) && !this.navIDsZoneEdit.includes(button.id)) {\n // the sweep belongs to another zone => set orange\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:adjust.svg?color=orange&height=17&width=17\")`;\n } else {\n button.style.backgroundImage = `url(\"https://api.iconify.design/mdi:close-circle-outline.svg?color=red&height=17&width=17\")`;\n }\n const index = this.chosenScansOnPlan.indexOf(button.id);\n this.chosenScansOnPlan.splice(index, 1);\n }\n }\n\n onSaveSelection() {\n if (this.multipleFloors) {\n // rassemble all sweeps per floors\n let finalSweeps = [];\n Array.from(this.inputSweepsPerFloor.keys()).forEach(floorID => {\n if (this.chosenSweepsPerFloor.get(floorID)) {\n // the sweeps for this floor were modified, we take them\n finalSweeps = [...finalSweeps, ...this.chosenSweepsPerFloor.get(floorID)];\n } else {\n // was not modified, we take the previous values\n finalSweeps = [...finalSweeps, ...this.inputSweepsPerFloor.get(floorID)];\n }\n });\n // console.log(\"final sweeps\", finalSweeps);\n this.sweepsSelected.emit({ \"sweeps\": finalSweeps, \"startSweepID\": this.startSweepID });\n } else {\n this.sweepsSelected.emit({ \"sweeps\": this.chosenScansOnPlan, \"startSweepID\": this.startSweepID });\n }\n }\n\n onCancel() {\n if (this.selectionChanged) {\n const message = this.translate.instant(\"confirm.cancelModifZoneSweeps\");\n if (window.confirm(message)) {\n this.sweepsSelected.emit(null);\n }\n } else {\n this.sweepsSelected.emit(null);\n }\n }\n\n /**\n * Adds current selection of sweeps for current floor (plan) for multifloor zone.\n * It has to be saved anyway with onSaveSelection!\n */\n onValidateForFloor() {\n if (this.multipleFloors) {\n this.chosenSweepsPerFloor.set(this.chosenPlan.zoneID, [...this.chosenScansOnPlan]);\n this.selectionChanged = false;\n }\n }\n}\n","<div ngbDropdown class=\"sp-row d-inline-block\">\n <div class=\"col-sm-3\" *ngIf=\"plans\">\n <button type=\"button\" class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\"\n ngbDropdownToggle>{{chosenPlan ?\n chosenPlan.name : ('Choose Plan' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button type=\"button\" ngbDropdownItem *ngFor=\"let plan of plans\" (click)=\"onPlanClick(plan)\"\n [disabled]=\"!plan.calibration\">{{ plan.name }}\n </button>\n </div>\n </div>\n</div>\n<div class=\"sp-row\">\n <lib-selection class=\"col-md-8\" (onSelectionChanged)=\"onSelectionChanged($event)\">\n <lib-plan-legend [isAudioZone]=\"editingAudioZone\" *ngIf=\"buttonElements.length > 0\"></lib-plan-legend>\n <div class=\"selectZone\" oncontextmenu=\"return false;\">\n <div class=\"sp-row\">\n <div style=\"overflow: hidden;width:100%;\">\n <div style=\"height: 400px; width: 100%;\" id=\"planDiv\">\n </div>\n </div>\n </div>\n </div>\n </lib-selection>\n \n <div class=\"col-md-4 scanTool\" *ngIf=\"buttonElements.length > 0\">\n <div class=\"sp-row d-inline-block\">\n <h2>{{'selectTool.title' | translate}}</h2>\n <div class=\"protip\">{{'selectTool.tip' | translate}}.</div>\n </div>\n \n <div class=\"sp-row\">\n <div class=\"col-3\" style=\"padding:0px\">\n <label class=\"tool-label\" for=\"scanSize\">{{'selectTool.size' | translate}}</label>\n </div>\n <div class=\"col-9\">\n <input type=\"range\" class=\"form-range\" min=\"0.001\" max=\"5\" step=\"0.01\" value=\"1\"\n id=\"scanSize\" (input)=\"onChangeScanSize($event)\">\n </div>\n </div>\n \n <div class=\"sp-row\">\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onSelectAll()\">{{'selectTool.selectAll' | translate}}</button>\n </div>\n \n <div *ngIf=\"buttonsInSelection.length > 0\" class=\"edit-selected\">\n <span class=\"tool-label\">{{'selectTool.edit' | translate}} : </span>\n <div class=\"sp-row\">\n <button class=\"btn rounded-pill btn-primary ms-3 me-2\" (click)=\"onSelectionAdd()\">{{'selectTool.add' | translate}}</button>\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onSelectionRemove()\">{{'selectTool.undo' | translate}}</button>\n </div>\n </div>\n\n <div class=\"sp-row\">\n <div *ngIf=\"multipleFloors\"> \n {{ chosenSweepsPerFloor.get(chosenPlan.zoneID) ? chosenSweepsPerFloor.get(chosenPlan.zoneID).length : \"0\"}} {{'scan points selected on this floor' | translate}} \n <button class=\"btn btn-primary rounded-pill\" (click)=\"onValidateForFloor()\" [disabled]=\"!selectionChanged\">{{'Update selection for this floor' | translate}}</button>\n </div>\n <div *ngIf=\"!multipleFloors\">\n {{ chosenScansOnPlan.length }} {{'scan points chosen' | translate}} \n </div>\n </div>\n <div *ngIf=\"!editingAudioZone\" class=\"sp-row\">\n <lib-radio-button label=\"{{ 'selectTool.chooseStartPoint' | translate }}\" (isCheckedEvent)=\"isSettingStartSweep=!isSettingStartSweep\"></lib-radio-button>\n </div>\n <div class=\"sp-row\">\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onSaveSelection()\">{{'selectTool.saveSelection' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'selectTool.cancelSelection' | translate}}</button>\n </div>\n </div>\n\n</div>\n \n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport {\n UntypedFormGroup,\n UntypedFormBuilder,\n Validators,\n AbstractControl,\n ValidatorFn,\n ValidationErrors,\n} from '@angular/forms';\nimport {\n Zone,\n Plan,\n Layer,\n ZoneService,\n LayerService,\n BaseUserService,\n NavigationService,\n} from '@smarterplan/ngx-smarterplan-core';\n@Component({\n selector: 'lib-add-zone',\n templateUrl: './add-zone.component.html',\n styleUrls: ['./add-zone.component.scss'],\n})\nexport class AddZoneComponent implements OnInit {\n @Input() zoneEdit: Zone;\n\n @Input() spaceID: string;\n\n @Input() images360: { path: string; filename: string }[];\n\n @Input() navigationIDs: string[];\n\n @Input() zones: Zone[];\n\n @Input() newZoneDataFromEditor: any;\n\n @Output() updatedZone = new EventEmitter<any>();\n\n @Input() chosenPlan: Plan;\n\n @Input() isMuseumVisit: boolean = false;\n\n @Input() defaultZone: Zone;\n\n parentZones: Zone[] = [];\n\n carouselIsVisible = false;\n\n zoneForm: UntypedFormGroup;\n\n isSubmitted = false;\n\n currentScanShowing: number;\n\n chosenScans: number[] = [];\n\n layers: Layer[];\n\n fromPlan: boolean = false;\n\n chosenScansOnPlan: string[] = [];\n\n currentOrgId: string;\n\n zoneInitialNavCount = 0;\n\n zoneIsMatterportFloor = false;\n\n multipleFloors = false;\n\n constructor(\n private fb: UntypedFormBuilder,\n private zoneService: ZoneService,\n private layerService: LayerService,\n private userService: BaseUserService,\n private navigationService: NavigationService\n ) { }\n\n async ngOnInit() {\n this.parentZones = this.zones.filter(\n (zone) => zone.layer && zone.layer.name === 'FLOOR'\n );\n if (!this.defaultZone) {\n this.defaultZone = this.getDefaultZone();\n }\n this.parentZones.unshift(this.defaultZone);\n await this.updateLayers();\n this.initZoneForm();\n }\n\n async updateLayers() {\n this.currentOrgId = this.userService.currentOrganisation(this.spaceID).id;\n const layers = await this.layerService.getLayerForOrganisation(\n this.currentOrgId\n );\n // filter out layers created by the system\n this.layers = layers.filter(\n (l) => l.name !== 'BUILDING' && l.name !== 'FLOOR'\n );\n }\n\n async initZoneForm() {\n if (this.zoneEdit) {\n if (this.zoneEdit.metadata) {\n const metadata = JSON.parse(this.zoneEdit.metadata);\n this.zoneIsMatterportFloor = metadata.hasOwnProperty(\n 'matterportFloorSequence'\n );\n }\n const isVirtual = this.zoneService.zoneIsVirtual(this.zoneEdit);\n if (!isVirtual) {\n await this.loadNavigations();\n }\n this.isMuseumVisit = this.zoneEdit.isMuseumVisitZone === true;\n this.multipleFloors = this.zoneEdit.isMultipleFloorZone === true;\n this.zoneForm = this.fb.group({\n id: this.zoneEdit.id,\n name: [this.zoneEdit.name, [Validators.required]],\n code_ref: this.zoneEdit.code_ref ? this.zoneEdit.code_ref : null,\n layerID: this.zoneEdit.layer ? this.zoneEdit.layer.id : null,\n surface: this.zoneEdit.surface ? this.zoneEdit.surface : 0,\n parentID: this.zoneEdit.parentID,\n parent: { value: this.zoneEdit.parent.name, disabled: true },\n newLayer: [null, [this.layerNameValidator()]],\n isMuseumVisitZone: this.isMuseumVisit,\n startSweepID: this.zoneEdit.startSweepID,\n });\n this.onChangeMultipleFloors();\n } else {\n this.zoneForm = this.fb.group({\n name: [\n this.newZoneDataFromEditor ? this.newZoneDataFromEditor.name : '',\n [Validators.required],\n ],\n code_ref: null,\n layerID: null,\n surface: 0,\n parentID: this.defaultZone.id,\n newLayer: [null, [this.layerNameValidator()]],\n isMuseumVisitZone: this.isMuseumVisit,\n startSweepID: null,\n });\n }\n }\n\n async onSubmitZone() {\n this.isSubmitted = true;\n if (!this.zoneForm.valid) {\n return;\n }\n const formValue = this.zoneForm.getRawValue(); //because we need values of disables controls as well\n if (formValue.newLayer) {\n await this.createLayer(formValue.newLayer).then((layer) => {\n formValue.layerID = layer.id;\n });\n }\n\n const zoneInput = {\n name: formValue.name,\n surface: Math.round(formValue.surface * 100) / 100,\n spaceID: this.spaceID,\n layerID: formValue.layerID,\n parentID: formValue.parentID,\n isMuseumVisitZone: this.isMuseumVisit,\n isMultipleFloorZone: this.multipleFloors,\n sweepIDs: [],\n startSweepID: formValue.startSweepID,\n } as Zone;\n\n if (formValue.code_ref) {\n zoneInput.code_ref = formValue.code_ref;\n }\n\n try {\n this.zoneForm = null;\n this.isSubmitted = false;\n if (this.zoneEdit) {\n const zoneUpdate = zoneInput;\n zoneUpdate.sweepIDs = this.zoneEdit.sweepIDs;\n zoneUpdate.id = formValue.id;\n await this.setSweepsAndNodeForZoneInput(zoneUpdate);\n await this.zoneService.updateZone(zoneUpdate);\n this.zoneEdit = null;\n this.updatedZone.emit(zoneUpdate.id);\n } else {\n await this.setSweepsAndNodeForZoneInput(zoneInput);\n if (!zoneInput.parentID) {\n // set building as parent\n zoneInput.parentID = this.defaultZone.id;\n }\n await this.zoneService.create(zoneInput).then((zoneCreated) => {\n this.updatedZone.emit(zoneCreated.id);\n });\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n onCancel() {\n this.isSubmitted = false;\n this.zoneForm = null;\n this.chosenScansOnPlan = [];\n this.chosenScans = [];\n this.updatedZone.emit(false);\n }\n\n get name(): AbstractControl {\n return this.zoneForm.get('name');\n }\n\n get newLayer(): AbstractControl {\n return this.zoneForm.get('newLayer');\n }\n\n toggleCarousel() {\n this.carouselIsVisible = true;\n this.chosenScansOnPlan = [];\n }\n\n togglePlan() {\n this.fromPlan = true;\n this.chosenScans = [];\n }\n\n onAddScan() {\n if (!this.chosenScans.includes(this.currentScanShowing)) {\n // console.log(\"adding scan\", this.currentScanShowing);\n this.chosenScans.push(this.currentScanShowing);\n } else {\n alert('Scan already added!');\n }\n }\n\n onRemoveScanImage(scan: any) {\n const index = this.chosenScans.indexOf(scan);\n this.chosenScans.splice(index, 1);\n }\n\n onRemoveScanPlan(scan: any) {\n const index = this.chosenScansOnPlan.indexOf(scan);\n this.chosenScansOnPlan.splice(index, 1);\n }\n\n async setSweepsAndNodeForZoneInput(zoneInput: Zone) {\n if (\n this.chosenScans.length > 0 &&\n this.chosenScans.length !== this.zoneInitialNavCount &&\n !this.fromPlan\n ) {\n // if we chose scans from the carousel\n const sweepIDs: string[] = [];\n this.chosenScans.map(async (scan) => {\n const imageUuid = this.images360[scan].filename.split('_')[0];\n const sweepID = this.navigationIDs.find((nav) => {\n return nav.includes(imageUuid);\n });\n if (sweepID) {\n sweepIDs.push(sweepID);\n }\n });\n zoneInput.sweepIDs = sweepIDs;\n } else {\n // we are not coming from gallery choice\n if (this.chosenScansOnPlan.length > 0) {\n zoneInput.sweepIDs = this.chosenScansOnPlan;\n }\n }\n\n if (zoneInput.sweepIDs && zoneInput.sweepIDs.length > 0) {\n const navForSweep =\n await this.navigationService.getNavigationsForMatterportIDForSpace(\n zoneInput.sweepIDs[0],\n this.spaceID\n );\n zoneInput.nodeIDs = [navForSweep[0].nodeID];\n }\n }\n\n async createLayer(name: string): Promise<Layer> {\n return this.layerService.createLayerForOrganisation(\n name,\n this.currentOrgId\n );\n }\n\n async loadNavigations(): Promise<any> {\n if (this.zoneEdit.sweepIDs.length > 0) {\n this.zoneInitialNavCount = this.zoneEdit.sweepIDs.length;\n const navList: number[] = [];\n const scansZoneEdit: string[] = [];\n await Promise.all(\n this.zoneEdit.sweepIDs.map(async (sweepID: string) => {\n scansZoneEdit.push(sweepID);\n const index = this.images360.findIndex((im) => {\n return im.filename.includes(sweepID.slice(0, 8));\n });\n if (index !== -1) {\n navList.push(index);\n }\n })\n );\n this.chosenScans = navList;\n this.chosenScansOnPlan = scansZoneEdit;\n return Promise.resolve();\n }\n return Promise.resolve();\n }\n\n // iniPlanForDraw() {\n // this.togglePlan();\n // setTimeout(() => {\n // this.onPlanClick();\n // }, 500);\n // }\n\n /**\n * Adds all sweeps of the space\n */\n onAddAll() {\n const defaultZone = this.getDefaultZone();\n if (defaultZone) {\n this.chosenScansOnPlan = defaultZone.sweepIDs;\n this.zoneForm.get('parentID').setValue(defaultZone.id);\n this.zoneForm.get('parentID').disable();\n this.multipleFloors = true;\n }\n }\n\n getDefaultZone(): Zone {\n return this.zones.find(\n (zone) =>\n zone.layer &&\n zone.layer.name === 'BUILDING' &&\n zone.sweepIDs &&\n zone.sweepIDs.length > 0\n );\n }\n /**\n * Multiple floors\n */\n onChangeMultipleFloors() {\n if (this.multipleFloors) {\n const defaultZone = this.getDefaultZone();\n if (defaultZone) {\n this.zoneForm.get('parentID').setValue(defaultZone.id);\n this.zoneForm.get('parentID').disable();\n }\n } else {\n this.zoneForm.get('parentID').enable();\n }\n }\n\n onSelectedSweepsFromPlan(result: { sweeps: string[]; startSweepID: string }) {\n if (result) {\n if (result.sweeps) {\n this.chosenScansOnPlan = result.sweeps;\n }\n if (result.startSweepID) {\n this.zoneForm.controls.startSweepID.setValue(result.startSweepID);\n }\n }\n this.fromPlan = false;\n }\n\n layerNameValidator(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n if (!control.value) {\n return null;\n }\n const forbidden = this.layers\n .map((l) => l.name.toLowerCase())\n .includes(control.value.toLowerCase());\n return forbidden ? { forbiddenName: { value: control.value } } : null;\n };\n }\n}\n","<div class=\"main-container\" *ngIf=\"zoneForm\">\n <div class=\"col-7\">\n <form (ngSubmit)=\"onSubmitZone()\" [formGroup]=\"zoneForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" required formControlName=\"name\">\n <!-- <div class=\"invalid-feedback\">\n {{'A name is required' | translate}}\n </div> -->\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'codeRef' | translate}}</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" formControlName=\"code_ref\">\n </div>\n </div>\n <div class=\"mb-3 row\" *ngIf=\"!isMuseumVisit && !zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{'Type of zone' | translate}}</label>\n <div class=\"col-sm-10\">\n <select class=\"form-control\" formControlName=\"layerID\">\n <option value=\"null\" selected disabled hidden> {{ zoneEdit && zoneEdit.layer ?\n zoneEdit.layer.name : 'Choose type'}}</option>\n <option *ngFor=\"let layer of layers\" [value]=\"layer.id\">\n {{ layer.name }}\n </option>\n </select>\n <p class=\"mt-1 new-type-text\">{{'or add new type of zone' | translate }}</p>\n <input type=\"text\" class=\"form-control new-type-input\" formControlName=\"newLayer\">\n <div *ngIf=\"newLayer.invalid && (newLayer.dirty || newLayer.touched)\" class=\"text-danger\">\n <div *ngIf=\"newLayer.errors?.['forbiddenName']\">\n {{'Layer exists already' | translate}}\n </div>\n </div>\n </div>\n </div>\n <!--If Editing Zone possibility to assign it to museum itinerary-->\n <div class=\"mb-3 row\" *ngIf=\"zoneEdit && !zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{ 'Museum Itinerary' | translate }}</label>\n <div class=\"col-sm-10\">\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"isMuseumVisit\"\n [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div>\n\n <div class=\"mb-3 row\" *ngIf=\"!zoneEdit || zoneEdit.isMultipleFloorZone\">\n <label class=\"col-sm-2 col-form-label\">{{ 'Multiple Floors' | translate }}</label>\n <div class=\"col-sm-10\">\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"multipleFloors\"\n [disabled]=\"zoneEdit !== undefined && zoneEdit !== null\" (change)=\"onChangeMultipleFloors()\"\n [ngModelOptions]=\"{standalone: true}\">\n <div class='text-danger' *ngIf=\"zoneEdit\">\n {{'cannotChangeMultifloor' | translate}}\n </div>\n </div>\n\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Surface' | translate}}</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" formControlName=\"surface\">\n </div>\n </div>\n\n <div class=\"mb-3 row\" *ngIf=\"!zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{'Parent zone' | translate}}</label>\n <div class=\"col-sm-10\">\n <input *ngIf=\"zoneEdit\" type=\"text\" class=\"form-control\" formControlName=\"parent\">\n <div class=\"text-danger\" *ngIf=\"zoneEdit\">\n {{'cannotChangeParent' | translate}}\n </div>\n <select *ngIf=\"!zoneEdit\" class=\"form-control\" formControlName=\"parentID\">\n <option *ngFor=\"let zone of parentZones\" [ngValue]=\"zone.id\">\n {{ zone.name }}\n </option>\n </select>\n\n </div>\n </div>\n\n <div class=\"mb-3 row\" style=\"max-height: 200px; overflow: auto;\" *ngIf=\"!zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{'Scan Points' | translate}}</label>\n <!-- <p class=\"col-sm-2\" *ngIf=\"zoneEdit\">{{ zoneEdit.sweepIDs.length }} scans</p> -->\n <p class=\"col\" *ngIf=\"chosenScansOnPlan.length === 0 && chosenScans.length === 0\">\n {{'No scan points chosen' | translate}}</p>\n <div class=\"col-sm-5\" *ngIf=\"chosenScansOnPlan && chosenScansOnPlan.length > 0\">\n <p>{{ chosenScansOnPlan.length }} {{'scan points chosen' | translate}}</p>\n <!-- <div *ngFor=\"let scan of chosenScansOnPlan\">\n <div class=\"row\">\n <p class=\"me-2\">{{ scan | slice:0:8 }}</p>\n <div (click)=\"onRemoveScanPlan(scan)\" [style.cursor]=\"'pointer'\">\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\n </div>\n </div>\n </div> -->\n </div>\n <div class=\"col-sm-5\" *ngIf=\"carouselIsVisible && chosenScans && chosenScans.length > 0\">\n <p>{{ chosenScans.length }} {{'scan points chosen' | translate}}</p>\n <div *ngFor=\"let scan of chosenScans\">\n <div class=\"row\">\n <p class=\"me-2\">{{ images360[scan].filename }}</p>\n <div (click)=\"onRemoveScanImage(scan)\" [style.cursor]=\"'pointer'\">\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"row mb-3 mt-3\" *ngIf=\"!zoneIsMatterportFloor\">\n <div class=\"col\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n (click)=\"togglePlan()\">{{'Choose scan points on plan' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"toggleCarousel()\"\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\n {{'Choose scan points from gallery' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAll()\"\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\n {{'add-all-scans' | translate}}</button>\n </div>\n </div>\n\n <!-- <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'No visible scan points' | translate}}</label>\n <div class=\"col-sm-3\">\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"noScanPoints\"\n [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div> -->\n\n <div *ngIf=\"carouselIsVisible\" class=\"mb-2\">\n <lib-carousel *ngIf=\"images360 && images360.length > 0\" [images]=\"images360\"\n (currentScan)=\"currentScanShowing=$event\"></lib-carousel>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2 mt-3\"\n (click)=\"onAddScan()\">{{'Add to zone' | translate}}</button>\n </div>\n <div class=\"mt-3\">\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\"\n [disabled]=\"fromPlan || !zoneForm.valid\">{{'Save' | translate}}</button>\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </form>\n </div>\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\n <lib-sweep-plan-selection style=\"width: 100%;\" [newZoneData]=\"newZoneDataFromEditor\" [spaceID]=\"spaceID\"\n [multipleFloors]=\"multipleFloors\" [inputZone]=\"zoneEdit\"\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\n </div>\n</div>","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { UntypedFormGroup, UntypedFormBuilder, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ZoneService, LayerService, BaseUserService, NavigationService, Layer, Zone, CommentType, CommentService, Comment, filterUniqueArrayByID } from '@smarterplan/ngx-smarterplan-core';\n\n\n@Component({\n selector: 'lib-add-audio-zone',\n templateUrl: './add-audio-zone.component.html',\n styleUrls: ['./add-audio-zone.component.scss'],\n})\nexport class AddAudioZoneComponent implements OnInit {\n\n @Input() spaceID: string;\n\n @Output() updatedZone = new EventEmitter<any>();\n\n @Input() defaultZone: Zone;\n\n @Input() zones: Zone[];\n\n @Input() parentZone: Zone;\n\n isSubmitted = false;\n\n fromPlan: boolean = false;\n\n chosenScansOnPlan: string[] = [];\n\n currentOrgId: string;\n\n audioLayer: Layer;\n\n commentForm: UntypedFormGroup;\n\n fileToUpload: File;\n\n audiosForSpace: Comment[];\n\n isAddingAudio = false;\n\n chosenAudio: Comment;\n\n audioZones: Zone[];\n\n @Input() currentAudioZone: Zone;\n\n scansModified = false;\n\n occupiedSweeps: string[] = [];\n\n unavailableSweeps: string[] = [];\n\n working = false;\n\n audioUploaded = false;\n\n constructor(\n private fb: UntypedFormBuilder,\n private zoneService: ZoneService,\n private layerService: LayerService,\n private userService: BaseUserService,\n private navigationService: NavigationService,\n private commentService: CommentService,\n private translate: TranslateService,\n ) { }\n\n ngOnInit(): void {\n if (this.currentAudioZone) {\n // we are editing zone\n this.chosenAudio = this.currentAudioZone.audio;\n this.chosenScansOnPlan = this.currentAudioZone.sweepIDs;\n this.parentZone = this.currentAudioZone.parent;\n }\n this.setup();\n }\n\n async setup() {\n const mission = this.userService.currentMission(this.spaceID);\n this.currentOrgId = mission.organisationID;\n let layers = await this.layerService.getLayerForOrganisation(\n this.currentOrgId,\n );\n this.audioLayer = layers.find((layer) => layer.name === \"AUDIO\");\n if (!this.audioLayer) {\n // first time creating Audio Zone \n this.audioLayer = await this.layerService.createLayerForOrganisation(\"AUDIO\", this.currentOrgId);\n }\n if (!this.parentZone) {\n this.parentZone = this.defaultZone;\n }\n this.audioZones = this.zones.filter((zone) => zone.audioID && zone.parentID === this.parentZone.id);\n this.occupiedSweeps = this.audioZones.flatMap((zone) => zone.sweepIDs);\n // unavailable sweeps: sweeps that do not belong to parent zone\n this.unavailableSweeps = this.defaultZone.sweepIDs.filter((sweep) => !this.parentZone.sweepIDs.includes(sweep));\n await this.getAudios();\n this.commentForm = this.fb.group({\n title: [null, Validators.required],\n spaceID: this.spaceID,\n type: CommentType.AUDIO,\n ownerID: mission.id,\n });\n }\n\n async onSubmit() {\n this.isSubmitted = true;\n this.working = true;\n if (this.currentAudioZone) {\n await this.zoneService.updateZone({\n id: this.currentAudioZone.id,\n sweepIDs: this.chosenScansOnPlan,\n });\n await this.removeTakenSweepsFromOtherZones();\n this.updatedZone.emit(this.currentAudioZone.id);\n this.working = false;\n } else {\n const zoneInput = {\n name: `${this.parentZone.name} - ${this.chosenAudio.title}`,\n surface: 0,\n spaceID: this.spaceID,\n layerID: this.audioLayer.id,\n parentID: this.parentZone.id,\n isMuseumVisitZone: false,\n isMultipleFloorZone: this.parentZone.isMultipleFloorZone,\n audioID: this.chosenAudio.id,\n } as Zone;\n try {\n await this.setSweepsAndNodeForZoneInput(zoneInput);\n await this.zoneService\n .create(zoneInput)\n .then(async (zoneCreated) => {\n this.currentAudioZone = zoneCreated;\n await this.removeTakenSweepsFromOtherZones();\n this.updatedZone.emit(zoneCreated.id);\n });\n this.working = false;\n } catch (error) {\n console.error(error);\n this.working = false;\n }\n }\n }\n\n async setSweepsAndNodeForZoneInput(zoneInput: Zone) {\n if (this.chosenScansOnPlan.length > 0) {\n zoneInput.sweepIDs = this.chosenScansOnPlan;\n }\n if (zoneInput.sweepIDs && zoneInput.sweepIDs.length > 0) {\n const navForSweep =\n await this.navigationService.getNavigationsForMatterportIDForSpace(\n zoneInput.sweepIDs[0],\n this.spaceID,\n );\n zoneInput.nodeIDs = [navForSweep[0].nodeID];\n }\n }\n\n onCancel() {\n if (this.scansModified) {\n const message = this.translate.instant(\"confirm.cancelEditZone\");\n if (!window.confirm(message)) {\n return;\n }\n }\n this.commentForm = null;\n this.chosenScansOnPlan = [];\n this.updatedZone.emit(false);\n }\n\n togglePlan() {\n this.fromPlan = true;\n }\n\n onSelectedSweepsFromPlan(result: { \"sweeps\": string[]; \"startSweepID\": string; }) {\n if (result && result.sweeps) {\n this.chosenScansOnPlan = result.sweeps;\n this.scansModified = true;\n }\n this.fromPlan = false;\n }\n\n handleFileInput(event: Event) {\n const target = event.target as HTMLInputElement;\n this.fileToUpload = (target.files as FileList)[0];\n }\n\n async onUploadAudio() {\n this.working = true;\n const commentInput = this.commentForm.value;\n try {\n const newAudio = await this.commentService.createCommentWithFile(\n commentInput,\n this.fileToUpload,\n );\n this.audiosForSpace.push(newAudio);\n this.isAddingAudio = false;\n this.working = false;\n this.audioUploaded = true;\n } catch (e) {\n this.working = false;\n this.audioUploaded = false;\n console.log(e);\n }\n\n }\n\n async getAudios() {\n const attachments = await this.commentService.getCommentsBySpaceID(this.spaceID);\n if (attachments) {\n this.audiosForSpace = attachments.filter((attachment) => attachment.type === CommentType.AUDIO);\n }\n }\n\n onCancelAudioUpload() {\n this.commentForm = null;\n this.isAddingAudio = false;\n this.fileToUpload = null;\n }\n\n onChooseAudio(audio: Comment) {\n this.chosenAudio = audio;\n this.currentAudioZone = this.audioZones.find((zone) => zone.audioID === this.chosenAudio.id);\n if (this.currentAudioZone) {\n this.chosenScansOnPlan = this.currentAudioZone.sweepIDs;\n } else {\n this.chosenScansOnPlan = [];\n }\n }\n\n /**\n * Removes newly selected sweeps for current zone (they are in chosenScansOnPlan) from other audio zones. \n * Rule: one sweep = one audio.\n */\n async removeTakenSweepsFromOtherZones() {\n await Promise.all(this.audioZones.map(async (zone) => {\n if (zone.id !== this.currentAudioZone.id) {\n const newSweeps = zone.sweepIDs.filter((sweepID) => !this.chosenScansOnPlan.includes(sweepID));\n if (newSweeps.length !== zone.sweepIDs.length) {\n await this.zoneService.updateZone({ id: zone.id, sweepIDs: newSweeps });\n }\n }\n }));\n }\n\n /**\n * Delete audio as Comment, all its audio Zones and file from S3 (using lambda function)\n */\n async onDeleteAudio() {\n const message = this.translate.instant(\"confirm.deleteAudio\");\n if (window.confirm(message)) {\n await this.commentService.deleteComment(this.chosenAudio.id);\n const index = this.audiosForSpace.indexOf(this.chosenAudio);\n this.audiosForSpace.splice(index, 1);\n\n // delete all zones with this comment audio\n const audioZonesToDelete = this.zones.filter((z) => z.audioID === this.chosenAudio.id);\n await Promise.all(audioZonesToDelete.map(async (zone) => {\n await this.zoneService.deleteZone(zone.id);\n const indexZone = this.audioZones.indexOf(this.currentAudioZone);\n if (indexZone !== -1) {\n this.audioZones.slice(indexZone, 1);\n }\n }));\n this.currentAudioZone = null;\n this.chosenAudio = null;\n }\n }\n\n}\n","<div class=\"main-container\">\n <div class=\"col-lg-6 col-md-6 col-sm-7\" *ngIf=\"isAddingAudio\">\n <form (ngSubmit)=\"onUploadAudio()\" [formGroup]=\"commentForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" required formControlName=\"title\">\n </div>\n </div>\n <div>\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\n {{'Choose File' | translate}}</label>\n <p *ngIf=\"fileToUpload\">{{ fileToUpload.name}}</p>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\n <lib-loader></lib-loader>\n </div>\n \n <div class=\"mt-3\">\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || working\">{{'Upload' | translate}}</button>\n <button type=\"button\" (click)=\"onCancelAudioUpload()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </form>\n </div>\n <ngb-alert type=\"success\" [dismissible]=\"true\" *ngIf=\"!working && audioUploaded\" (closed)=\"audioUploaded=false\">\n {{ 'add-audio.success' | translate }} !\n </ngb-alert>\n <div class=\"col-7\" *ngIf=\"!isAddingAudio && audiosForSpace\">\n \n <div class=\"instruction-row\" >\n <p>1.</p>\n <div ngbDropdown class=\"d-inline-block\">\n <div>\n <button type=\"button\" class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\"\n ngbDropdownToggle>{{chosenAudio ?\n chosenAudio.title : ('choose-audio' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button type=\"button\" ngbDropdownItem *ngFor=\"let audio of audiosForSpace\" \n (click)=\"onChooseAudio(audio)\">{{ audio.title }}\n </button>\n </div>\n </div>\n </div>\n <p>{{'or' | translate}}</p>\n <button (click)=\"isAddingAudio=true\" class=\"btn btn-primary rounded-pill me-2\"> {{'add-audio.add' | translate}}</button>\n </div>\n <div class=\"instruction-row\">\n <p>2.</p>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"togglePlan()\" [disabled]=\"!chosenAudio\">\n {{'Choose scan points on plan' | translate}}</button>\n\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onDeleteAudio()\" [disabled]=\"!chosenAudio\">\n {{'Delete audio' | translate}}</button>\n \n </div>\n <div class=\"instruction-row\" *ngIf=\"chosenAudio\">\n <p>{{ chosenScansOnPlan.length }} {{'scans-chosen-audio' | translate}}</p>\n </div>\n\n <div class=\"mt-3\">\n <button class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || !this.chosenAudio\" (click)=\"onSubmit()\">{{'Save' | translate}}</button>\n <button (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\n <lib-sweep-plan-selection style=\"width: 100%;\" [inputZone]=\"currentAudioZone\" [spaceID]=\"spaceID\" \n [occupiedSweeps]=\"occupiedSweeps\" [unavailableSweeps]=\"unavailableSweeps\" [editingAudioZone]=\"true\"\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\n </div>\n</div>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Zone, ZoneService } from '@smarterplan/ngx-smarterplan-core';\n\n@Pipe({\n name: 'countAudioSweeps'\n})\nexport class CountAudioSweepsPipe implements PipeTransform {\n constructor(private zoneService: ZoneService) { }\n\n async transform(zone: Zone): Promise<number> {\n let childrenAudioZones = await this.zoneService.getZonesByParentZone(zone.id);\n if (childrenAudioZones.length > 0) {\n childrenAudioZones = childrenAudioZones.filter((zone) => zone.audioID);\n if (childrenAudioZones.length > 0) {\n return childrenAudioZones.flatMap((z) => z.sweepIDs).length;\n }\n }\n return 0;\n }\n\n}\n","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n MenuItem, ZoneService, SpaceService, VisitService,\n NavigationService, BaseUserService, PlanService, wait, Navigation, showScanPointsOnPlanInDiv, Plan, Space, Zone, SpModule, NavigatorService\n} from '@smarterplan/ngx-smarterplan-core';\nimport panzoom from \"panzoom\";\nimport { Subject, takeUntil } from 'rxjs';\n@Component({\n selector: 'lib-zones',\n templateUrl: './zones.component.html',\n styleUrls: ['./zones.component.scss']\n})\nexport class ZonesComponent implements OnInit {\n\n lotIndexDetails = -1;\n\n currentSpace: Space;\n\n @Output() updatedZone = new EventEmitter<boolean>();\n\n plans: Plan[];\n\n zoneForEdit: Zone;\n\n isEditingZone = false;\n\n captureDate: number;\n\n spaceID: string;\n\n navigations: string[];\n\n images360: any[];\n\n carouselIsVisible = false;\n\n planIsVisible = false;\n\n currentPlan: Plan;\n\n currentZone: Zone;\n\n loadingPlan = false;\n\n menuItems: MenuItem[] = [];\n\n isMuseumVisit = false;\n\n isMuseumModule = false;\n\n allZones: Zone[];\n\n floorZones: Zone[] = [];\n\n zonesMap: Map<string, Zone[]> = new Map();\n\n floorDetails: number = -1;\n\n defaultZone: Zone;\n\n defaultShowing = false;\n\n isAddingAudioTrack = false;\n\n parentZoneForAudio: Zone;\n\n destroy$ = new Subject();\n\n constructor(\n private route: ActivatedRoute,\n private zoneService: ZoneService,\n private spaceService: SpaceService,\n private visitService: VisitService,\n private navigationService: NavigationService,\n private userService: BaseUserService,\n private planService: PlanService,\n private translate: TranslateService,\n private navigatorService: NavigatorService,\n private router: Router,\n ) {\n // listen to the change of location via navigation bar dropdown\n this.navigatorService.locationIDChange\n .pipe(takeUntil(this.destroy$))\n .subscribe((spaceID) => {\n this.router.navigate([\"dashboard/localisation\", spaceID, \"zones\"]).catch(e => console.log(e.message));\n });\n\n this.route.params.subscribe((params) => {\n this.spaceID = params.id;\n this.resetZones().catch(e => console.log(e.message));\n });\n }\n\n async ngOnInit() {\n this.isMuseumModule = this.userService.getSpModule() === SpModule.MUSEUM;\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n setupMenuItems() {\n this.menuItems = [\n { label: \"Locations\", url: \"/localisation\" },\n {\n label: this.currentSpace.name,\n url: `/localisation/${this.spaceID}`,\n },\n {\n label: \"Zones\",\n url: `/localisation/${this.currentSpace.id}/zones`,\n },\n ];\n }\n\n onGoBack() {\n this.editCompleted(null);\n }\n\n ngOnChanges() {\n this.resetZones().catch(e => console.log(e.message));\n }\n\n async resetZones() {\n this.isMuseumVisit = false;\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\n this.setupMenuItems();\n\n this.allZones = await this.zoneService.getZonesBySpace(this.spaceID);\n this.defaultZone = this.allZones.find(\n (zone) => zone.layer && zone.layer.name === \"BUILDING\" && zone.sweepIDs,\n );\n\n this.floorZones = this.allZones.filter(\n (zone) => zone.layer && zone.layer.name === \"FLOOR\",\n );\n // sort alphabetically\n this.floorZones.sort((a, b) => a.name.localeCompare(b.name));\n // we add only children zones that are not Floors\n if (!!this.defaultZone) {\n this.zonesMap.set(this.defaultZone.id, this.allZones.filter((zone) => zone.parentID === this.defaultZone.id && !this.floorZones.includes(zone)));\n }\n for (const floor of this.floorZones) {\n const zonesForFloor = this.allZones.filter((zone) => zone.parentID === floor.id);\n this.zonesMap.set(\n floor.id,\n zonesForFloor.sort((a, b) => a.name.localeCompare(b.name)),\n );\n }\n this.resetNavigations();\n this.images360 = await this.visitService.loadImagesForSpace(\n this.currentSpace,\n );\n this.plans = await this.planService.getPlansWithZonesForSpace(\n this.spaceID,\n );\n this.plans = this.plans.filter((plan) => plan.isCurrentForZone);\n this.onPlansLoaded().catch(e => console.log(e.message));\n }\n\n resetNavigations() {\n this.navigations = [];\n const zonesWithSweeps = this.allZones.filter((zone) => zone.sweepIDs);\n this.navigations = [\n ...new Set(zonesWithSweeps.flatMap((zone) => zone.sweepIDs)),\n ];\n }\n\n async onPlansLoaded(): Promise<void> {\n if (this.planIsVisible && this.currentZone) {\n this.preparePlan().catch(e=>console.log(e.message));\n }\n }\n\n /**\n * onToggleDetail folds/unfolds details for a zone\n * @param index\n * @param zone\n */\n async onToggleDetail(index: number, zone: Zone) {\n this.lotIndexDetails = index === this.lotIndexDetails ? -1 : index;\n if (this.lotIndexDetails === -1) {\n this.currentZone = null;\n this.planIsVisible = false;\n return;\n }\n this.currentZone = zone;\n this.planIsVisible = true;\n if (!this.plans) {\n return; // wait until the plans are set\n }\n if (this.loadingPlan) {\n // another plan is already loading\n await wait(1000);\n }\n this.preparePlan().catch(e=>console.log(e.message));\n }\n\n onToggleDetailFloor(index: number, floor: Zone) {\n this.defaultShowing = false;\n this.floorDetails = index === this.floorDetails ? -1 : index;\n if (this.floorDetails === -1) {\n this.currentZone = null;\n this.planIsVisible = false;\n return;\n }\n this.currentZone = floor;\n this.planIsVisible = true;\n if (!this.plans) {\n console.log(\"plans not ready\");\n return; // wait until the plans are set\n }\n this.preparePlan().catch(e => console.log(e.message));\n }\n\n onToggleDefaultZone() {\n this.defaultShowing = !this.defaultShowing;\n this.currentZone = this.defaultShowing ? this.defaultZone : null;\n }\n\n async preparePlan() {\n this.loadingPlan = true;\n this.currentPlan = null;\n if (this.currentZone.virtual) {\n this.currentPlan = null;\n this.loadingPlan = false;\n return;\n }\n this.currentPlan = await this.planService.getCalibratedPlanForZone(\n this.currentZone,\n );\n if (this.currentPlan) {\n const scans = await this.navigationService.getNavigationsForZone(\n this.currentZone,\n );\n await this.showScanPointsOnPlan(scans);\n }\n this.loadingPlan = false;\n }\n\n toggleCarousel() {\n this.carouselIsVisible = true;\n }\n\n onEdit(zone: Zone) {\n this.zoneForEdit = zone;\n if (this.zoneForEdit.layer && this.zoneForEdit.layer.name === \"AUDIO\") {\n this.isAddingAudioTrack = true;\n } else {\n this.isEditingZone = true;\n }\n\n this.menuItems.push({\n label: `${zone.name}`,\n });\n }\n\n onAddLot() {\n this.isMuseumVisit = false;\n this.isEditingZone = true;\n this.menuItems.push({\n label: \"New\",\n });\n }\n\n onAddMuseumZone() {\n this.isMuseumVisit = true;\n this.isEditingZone = true;\n this.menuItems.push({\n label: \"New Museum Itinerary\",\n });\n }\n\n onAddAudioZone(parentZone: Zone) {\n this.parentZoneForAudio = parentZone;\n this.isAddingAudioTrack = true;\n this.menuItems.push({\n label: parentZone.name,\n });\n this.menuItems.push({\n label: \"add-audio.add\",\n });\n }\n\n async onDelete(zone: Zone) {\n const message = this.translate.instant(\"confirm.deleteZone\");\n // eslint-disable-next-line no-alert\n if (window.confirm(message)) {\n const childrenZones = await this.zoneService.getZonesByParentZone(zone.id);\n await Promise.all(childrenZones.map(async (childZone) => {\n await this.zoneService.deleteZone(childZone.id);\n this.allZones.splice(this.allZones.indexOf(childZone), 1);\n }));\n await this.zoneService.deleteZone(zone.id);\n this.allZones.splice(this.allZones.indexOf(zone), 1);\n // remove current zone from its parent list\n if (zone.parentID && Array.from(this.zonesMap.keys()).includes(zone.parentID)) {\n const zonesForParent = this.zonesMap.get(zone.parentID);\n zonesForParent.splice(zonesForParent.indexOf(zone), 1);\n this.zonesMap.set(zone.parentID, zonesForParent);\n }\n // we send update of location in order to force update of list of zones in nav bar\n this.navigatorService.locationIDChange.next(this.spaceID);\n }\n }\n\n editCompleted(event: any) {\n this.lotIndexDetails = -1;\n this.currentPlan = null;\n this.isEditingZone = false;\n this.isAddingAudioTrack = false;\n this.zoneForEdit = null;\n this.planIsVisible = false;\n this.carouselIsVisible = false;\n this.setupMenuItems();\n if (event) {\n this.resetZones().catch(e=> console.log(e.message));\n // we send update of location in order to force update of list of zones in nav bar\n this.navigatorService.locationIDChange.next(this.spaceID);\n }\n\n }\n\n async showScanPointsOnPlan(navigations: Navigation[]) {\n if (this.currentPlan) {\n const divPlan = document.querySelector(\"#planDiv\") as HTMLElement;\n await showScanPointsOnPlanInDiv(this.currentPlan, divPlan, navigations);\n panzoom(divPlan, {\n bounds: true,\n boundsPadding: 0,\n maxZoom: 3.5,\n });\n }\n }\n\n}\n","<div class=\"container-fluid\" *ngIf=\"currentSpace\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\n </div>\n <div class=\"row\" *ngIf=\"!isEditingZone && !isAddingAudioTrack\">\n <div class=\"col-md-6\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item default-zone-line-item\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\" *ngIf=\"defaultZone\">\n {{defaultZone.name}}\n <div class=\"default-zone-label\">{{ \"whole space\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"defaultShowing\" (click)=\"onToggleDefaultZone()\"></lib-chevron>\n </div>\n <div *ngIf=\"defaultShowing\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}:\n {{defaultZone.layer ? defaultZone.layer.name : \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"defaultZone.surface\">\n {{'Surface' | translate}}, m<sup>2</sup>: {{defaultZone.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!defaultZone.virtual\">{{'Scan Points' | translate}}:\n {{defaultZone.sweepIDs ? defaultZone.sweepIDs.length : \"No scan points\" | translate}} </li>\n </ul>\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\n <div *ngIf=\"pair.key == defaultZone.id\">\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item list-group-flush list-group-item-action\"\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\n {{lot.name}}\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\"\n (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\n\n </div>\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\n translate}}: {{lot.layer ? lot.layer.name :\n \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">\n {{'Surface' | translate}},m<sup>2</sup>: {{lot.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\n {{'Zone not visible in 3D visit' | translate}}</li>\n </ul>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\n </div>\n </li>\n </ul>\n\n </div>\n </div>\n </div>\n </li>\n\n <li class=\"list-group-item\" *ngFor=\"let floor of floorZones; index as index\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\n {{floor.name}}\n <!-- <small>({{ lot.metadata ? ('Calibrated' | translate) : ('Not calibrated' | translate)}})</small> -->\n <div class=\"museum-label\" *ngIf=\"floor.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"index==floorDetails\"\n (click)=\"onToggleDetailFloor(index, floor)\"></lib-chevron>\n </div>\n <div *ngIf=\"index==floorDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}: {{floor.layer ?\n floor.layer.name :\n \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.surface\">{{'Surface' | translate}}, m<sup>2</sup>:\n {{floor.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!floor.virtual\">{{'Scan Points' | translate}}:\n {{floor.sweepIDs ? floor.sweepIDs.length : \"No scan points\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.virtual\">{{'Zone not visible in 3D visit' |\n translate}}</li>\n </ul>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onEdit(floor)\">{{'Edit' |\n translate}}</button>\n\n <!-- List of children zones -->\n\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\n <div *ngIf=\"pair.key == floor.id\">\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item list-group-flush list-group-item-action\"\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\n <div><span *ngIf=\"lot.code_ref\">{{lot.code_ref}}_</span>{{lot.name}}</div>\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\"\n (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\n\n </div>\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\n translate}}: {{lot.layer ? lot.layer.name :\n \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">{{'Surface' | translate}},\n m<sup>2</sup>:\n {{lot.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual && lot.isMuseumVisitZone\">\n {{'Scan Points with audio' | translate}}: {{ lot | countAudioSweeps | async}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\n {{'Zone not visible in 3D visit' | translate}}</li> dist\n </ul>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\n </div>\n </li>\n </ul>\n\n </div>\n </div>\n </div>\n </li>\n </ul>\n\n <div>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddLot()\">{{'Add zone' |\n translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddMuseumZone()\" *ngIf=\"isMuseumModule\">\n {{'Add museum itinerary' | translate}}</button>\n </div>\n </div>\n <div class=\"col-md-6\" *ngIf=\"planIsVisible\">\n <div class=\"d-flex justify-content-center\" *ngIf=\"loadingPlan\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <div class=\"row\" style=\"overflow: hidden; flex-direction: column;\">\n <div *ngIf=\"currentPlan\">\n <lib-plan-legend [isAudioZone]=\"false\"></lib-plan-legend>\n <div class=\"planContainer\">\n <div class=\"mt-3 ms-3\" style=\"height: 500px; width: 100%;\" id=\"planDiv\"></div>\n </div>\n </div>\n\n <div *ngIf=\"!currentPlan && plans && !loadingPlan && currentZone\">\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"!currentZone.virtual && !currentZone.isMultipleFloorZone\">\n {{ 'Plan is not calibrated' | translate}}\n </div>\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.virtual\">\n {{ 'No scan points chosen' | translate}}\n </div>\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.isMultipleFloorZone\">\n {{ 'The zone is on several floors' | translate}}\n </div>\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"mb-3\" *ngIf=\"isEditingZone\">\n <lib-add-zone [zoneEdit]=\"zoneForEdit\" [spaceID]=\"spaceID\" [images360]=\"images360\" [navigationIDs]=\"navigations\"\n [zones]=\"allZones\" [defaultZone]=\"defaultZone\" (updatedZone)=\"editCompleted($event)\"\n [isMuseumVisit]=\"isMuseumVisit\"></lib-add-zone>\n </div>\n <div class=\"mb-3\" *ngIf=\"isAddingAudioTrack\">\n <lib-add-audio-zone [spaceID]=\"spaceID\" [defaultZone]=\"defaultZone\" [parentZone]=\"parentZoneForAudio\"\n [zones]=\"allZones\" [currentAudioZone]=\"zoneForEdit\" (updatedZone)=\"editCompleted($event)\"></lib-add-audio-zone>\n </div>\n</div>","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Space, Visit, MenuItem, SpaceService, VisitService, NodeService, InventoryStatus, NavigatorService } from '@smarterplan/ngx-smarterplan-core';\nimport { Subject, takeUntil } from 'rxjs';\n\n@Component({\n selector: 'lib-images',\n templateUrl: './images.component.html',\n styleUrls: ['./images.component.scss']\n})\nexport class ImagesComponent implements OnInit {\n\n images: Array<any>;\n\n spaceID: string;\n\n currentSpace: Space;\n\n currentVisit: Visit;\n\n currentImages: Array<any>;\n\n loading = false;\n\n currentScanID: string;\n\n menuItems: MenuItem[] = [];\n\n destroy$ = new Subject();\n\n constructor(\n private route: ActivatedRoute,\n private spaceService: SpaceService,\n private visitService: VisitService,\n private nodeService: NodeService,\n private navigatorService: NavigatorService,\n private router: Router,\n ) {\n this.navigatorService.locationIDChange\n .pipe(takeUntil(this.destroy$))\n .subscribe((spaceID) => {\n this.router.navigate([\"dashboard/localisation\", spaceID, \"images\"]);\n });\n\n this.route.params.subscribe((params) => {\n this.spaceID = params.id;;\n this.loadImages();\n });\n }\n\n ngOnInit(): void {\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n setupMenuItems() {\n this.menuItems = [\n { label: \"Locations\", url: \"/localisation\" },\n {\n label: this.currentSpace.name,\n url: `/localisation/${this.spaceID}`,\n },\n { label: \"360° Images\" },\n ];\n\n if (this.currentVisit) {\n this.menuItems.push({ label: this.currentVisit.name });\n }\n }\n\n onGoBack() {\n this.currentVisit = null;\n this.currentImages = null;\n this.setupMenuItems();\n }\n\n async loadImages() {\n this.loading = true;\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\n this.setupMenuItems();\n this.images = await this.visitService.loadImagesForSpace(\n this.currentSpace,\n );\n if (this.currentSpace.visits.length === 1) {\n this.setVisit(this.currentSpace.visits[0]);\n }\n this.loading = false;\n }\n\n setVisit(visit) {\n this.currentVisit = visit;\n this.currentImages = this.images.filter((im) => {\n return im.visit === visit;\n });\n this.setupMenuItems();\n }\n\n setCurrentScan(id) {\n this.currentScanID = id;\n }\n\n async onInventoryClick() {\n const { node } = this.currentVisit;\n const { filename } = this.currentImages[this.currentScanID]; // 110ee452_sweep.jpeg\n // check if node has already errors of inventory\n const missingFilesErrors = [\n InventoryStatus.ERROR_FILE_JSON_NOT_EXIST,\n InventoryStatus.ERROR_FILE_MODEL_NOT_EXIST,\n InventoryStatus.ERROR_FILE_OBJ_NOT_EXIST,\n ];\n if (\n node.inventoryStatus &&\n missingFilesErrors.includes(node.inventoryStatus)\n ) {\n alert(\n \"Files missing for this visit's inventory. Contact your administrator.\",\n );\n } else {\n await this.nodeService.updateNode({\n id: node.id,\n inventoryStatus: InventoryStatus.TO_RUN_ONE_IMAGE,\n navigationForInventory: filename.split(\"_\")[0],\n });\n alert(\n \"Automatic AI Inventory started! Detected equipments will appear soon in the visit.\",\n );\n }\n }\n\n}\n","<div class=\"container-fluid dashboard-tab col-sm-10 mb-3\" *ngIf=\"currentSpace\" >\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">{{'Loading' | translate}}...</span>\n </div>\n </div>\n <div ngbDropdown class=\"d-inline-block\" *ngIf=\"currentSpace.visits && currentSpace.visits.length > 0\">\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" *ngIf=\"!currentVisit\"\n ngbDropdownToggle>{{'Choose 3D visit' | translate}}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button ngbDropdownItem *ngFor=\"let visit of currentSpace.visits\" (click)=\"setVisit(visit)\"> {{ visit.name }}\n </button>\n </div>\n </div>\n <h3 *ngIf=\"currentVisit\">{{ currentVisit.name }}</h3>\n <div class=\"mt-3\" *ngIf=\"currentVisit && currentImages.length == 0 && !loading\">\n <h4>{{'No imported images' | translate }}</h4>\n <p>{{'For import: go Virtual Visits => Import Images' | translate}}</p>\n </div>\n <button *ngIf=\"currentVisit && currentImages.length > 0 && !loading\"\n class=\"btn btn-outline-primary rounded-pill no-lowercase mb-2\" (click)=\"onInventoryClick()\">\n {{'Run AI inventory on this image' | translate}}</button>\n <lib-carousel [images]=\"currentImages\" *ngIf=\"currentImages\" (currentScan)=\"setCurrentScan($event)\"></lib-carousel>\n </div>","import { Component, HostListener, NgZone, OnInit, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { TranslateService } from '@ngx-translate/core';\nimport { getDocument, PDFDocumentProxy } from \"pdfjs-dist\";\nimport { Zone, Plan, Space, MenuItem, PlanService, ZoneService, VisitService, SpaceService, sortAlphabeticallyOnName, downloadFileAsObject } from '@smarterplan/ngx-smarterplan-core';\n\n@Component({\n selector: 'lib-edit-plan',\n templateUrl: './edit-plan.component.html',\n styleUrls: ['./edit-plan.component.scss']\n})\nexport class EditPlanComponent implements OnInit {\n\n @ViewChild(\"dialog\") dialog!: any;\n\n @ViewChild(\"dialogZone\") dialogZone!: any;\n\n @ViewChild(\"preparing\") loadingModal: any;\n\n spaceID: string;\n\n chosenPlan: Plan;\n\n editedPlan: Plan;\n\n loading: boolean = false;\n\n svgEditor;\n\n svgEditorIframe;\n\n navigations: string[];\n\n zones: Zone[];\n\n isNewZone: boolean = false;\n\n newZoneData;\n\n editorUrl;\n\n editedZone: Zone;\n\n images360;\n\n\n /**\n * Options for svgEditor\n */\n private config: any = {\n noStorageOnLoad: true,\n forceStorage: true,\n // imgPath: \"/assets/editor/images/\",\n // extPath: \"/assets/editor/extensions/\",\n // langPath: \"/assets/editor/locale/\",\n // canvgPath: \"/assets/editor/canvg/\",\n // jspdfPath: \"/assets/editor/jspdf/\",\n // jGraduatePath: \"/assets/editor/jgraduate/images/\",\n // extIconsPath: \"/assets/editor/extensions/\",\n // stylesheets: [\n // \"/assets/editor/jgraduate/css/jGraduate.css\",\n // \"/assets/editor/spinbtn/jQuery.SpinButton.css\",\n // \"/assets/editor/jgraduate/css/jPicker.css\",\n // \"/assets/editor/svg-editor.css\",\n // ],\n dimensions: [10000, 10000],\n showlayers: true,\n noDefaultExtensions: true,\n basePath: \"/assets/editor/\",\n customExportImage: true,\n extensions: [\n \"ext-connector\",\n // \"ext-eyedropper\",\n // \"ext-grid\",\n // \"ext-markers\",\n // \"ext-overview_window\",\n // \"ext-spi-library\",\n // \"ext-spi-icon\",\n \"ext-sp-zone\",\n // \"ext-arrows\",\n // \"ext-sp-css\",\n // \"ext-placemark\",\n ],\n };\n\n currentSpace: Space;\n\n menuItems: MenuItem[] = [];\n\n constructor(\n private planService: PlanService,\n private route: ActivatedRoute,\n private router: Router,\n private modalService: NgbModal,\n private zoneService: ZoneService,\n private visitService: VisitService,\n private spaceService: SpaceService,\n private translate: TranslateService,\n private ngZone: NgZone,\n ) {\n this.chosenPlan = this.planService.getChosenPlan();\n }\n\n async ngOnInit() {\n this.editorUrl = \"/assets/editor/main.html\";\n this.spaceID = this.route.snapshot.queryParams.spaceID;\n this.currentSpace = await this.spaceService.getSpace(this.spaceID);\n this.setupMenuItems();\n if (this.spaceID && !this.planService.getChosenPlan()) {\n this.router.navigate([\n \"/dashboard/localisation\",\n this.spaceID,\n \"plans\",\n ]);\n } else if (!this.spaceID && !this.planService.getChosenPlan()) {\n this.router.navigate([\"/dashboard/localisation\"]);\n }\n }\n\n setupMenuItems() {\n this.menuItems = [\n { label: \"Locations\", url: \"/localisation\" },\n {\n label: this.currentSpace.name,\n url: `/localisation/${this.spaceID}`,\n },\n {\n label: \"Plans\",\n url: `/localisation/${this.currentSpace.id}/plans`,\n },\n {\n label: \"Edit\",\n url: `/localisation/${this.currentSpace.id}/plan-edit?spaceID=${this.currentSpace.id}`,\n },\n ];\n }\n\n @HostListener(\"window:message\", [\"$event\"])\n async switchAction(event) {\n if (event.origin === window.location.origin) {\n switch (event.data.message) {\n case \"save\":\n this.onSave(event.data.redirect);\n break;\n case \"close\":\n this.onCancel();\n break;\n case \"new-zone\":\n const modalReference = this.modalService.open(\n this.loadingModal,\n );\n const svg = unescape(\n encodeURIComponent(\n this.svgEditor.svgCanvas.getSvgString(),\n ),\n );\n\n const base64 = `data:image/svg+xml;base64,${window.btoa(\n svg,\n )}`;\n const currentSpace = await this.spaceService.getSpace(\n this.spaceID,\n );\n\n this.images360 = await this.visitService.loadImagesForSpace(\n currentSpace,\n );\n\n this.editedPlan = { ...this.chosenPlan };\n this.editedPlan.filepath = base64;\n this.newZoneData = event.data.zoneData;\n if (this.newZoneData.elements.length === 0) {\n modalReference.close();\n alert(this.translate.instant(\"edition.no-zone\"));\n break;\n }\n this.zones = await this.zoneService.getZonesBySpace(\n this.spaceID,\n );\n // this.zones = sortAlphabeticallyOnName(this.zones);\n // console.log(\"zones\", this.zones);\n // this.editedZone = this.zones.find(\n // (z) => z.name === this.newZoneData.name,\n // );\n this.resetNavigations();\n modalReference.close();\n this.modalService.open(this.dialogZone);\n\n break;\n\n default:\n break;\n }\n }\n }\n\n async resetNavigations() {\n this.navigations = [];\n const defaultZone = this.zones.find((zone) => !zone.parentID);\n if (defaultZone.sweepIDs.length > 0) {\n this.navigations = defaultZone.sweepIDs;\n }\n }\n\n async onLoad(svgEditor) {\n if (svgEditor.contentWindow.SvgEditor) {\n this.svgEditorIframe = svgEditor;\n this.svgEditor = new svgEditor.contentWindow.SvgEditor();\n\n await this.svgEditor.init();\n await this.svgEditor.setConfig(this.config, {\n allowInitialUserOverride: true,\n });\n\n if (this.chosenPlan && this.chosenPlan.extension === \"svg\") {\n this.loadSvg();\n }\n if (this.chosenPlan && this.chosenPlan.extension === \"pdf\") {\n this.loadPdf();\n }\n if (!this.chosenPlan.calibration || !this.chosenPlan.isModified) {\n setTimeout(() => {\n this.svgEditorIframe.contentWindow.postMessage(\n { action: \"disable-zone\" },\n \"*\",\n );\n }, 1000);\n }\n\n this.svgEditor.svgCanvas.setMode('ext-panning');\n this.svgEditor.bottomPanel.changeZoom(50)\n }\n }\n\n async onSave(redirect: boolean) {\n const imgBlob = await new Blob(\n [this.svgEditor.svgCanvas.getSvgString()],\n {\n type: \"image/svg+xml\",\n },\n );\n const [name] = this.chosenPlan.name.split(\".\");\n const imgFile: File = new File([imgBlob], `${name}-edited.svg`, {\n type: \"image/svg+xml\",\n lastModified: Date.now(),\n });\n this.planService.setPlanFileCache(imgFile);\n if (this.chosenPlan.isModified) {\n this.ngZone.run(() =>\n this.modalService.open(this.dialog));\n } else {\n this.ngZone.run(() =>\n this.router.navigate([\n \"/dashboard/localisation\",\n this.spaceID,\n \"plans\",\n ]));\n }\n }\n\n async updateSvg() {\n const newUrl = await this.planService.updatePlanFile();\n await this.planService.updatePlan({\n id: this.chosenPlan.id,\n annexe: newUrl,\n });\n this.planService.setPlanFileCache(null);\n this.ngZone.run(() =>\n this.router.navigate([\n \"/dashboard/localisation\",\n this.spaceID,\n \"plans\",\n ]));\n }\n\n async newSvg() {\n this.ngZone.run(() =>\n this.router.navigate([\n \"/dashboard/localisation\",\n this.spaceID,\n \"plans\",\n ]));\n }\n\n async onCancel() {\n if (window.confirm(this.translate.instant(\"edition.cancel-alert\"))) {\n this.ngZone.run(() =>\n this.router.navigate([\n \"/dashboard/localisation\",\n this.spaceID,\n \"plans\",\n ]));\n alert(this.translate.instant(\"edition.cancel\"));\n }\n }\n\n async loadSvg() {\n const svgRequest: any = await downloadFileAsObject(\n this.chosenPlan.annexe,\n );\n if (svgRequest) {\n const svgBlob = await svgRequest.Body;\n const reader = new FileReader();\n reader.onloadend = () => {\n this.svgEditor.loadFromDataURI(reader.result);\n };\n reader.readAsDataURL(svgBlob);\n }\n }\n\n async loadPdf() {\n this.svgEditorIframe.contentWindow.postMessage(\n { action: \"disable-zone\" },\n \"*\",\n );\n const canvas = document.querySelector(\n \"#canvas4pdf\",\n ) as HTMLCanvasElement;\n const context = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n\n const pdfjs = await import(\"pdfjs-dist\");\n pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/4.4.168/pdf.worker.min.mjs`;\n\n const pdf: PDFDocumentProxy = await getDocument(\n this.chosenPlan.filepath,\n ).promise;\n const page = await pdf.getPage(1);\n\n const viewPortParameters = { scale: 1.5 };\n const viewport = page.getViewport(viewPortParameters);\n this.svgEditor.svgCanvas.setResolution(viewport.width, viewport.height);\n\n canvas.height = viewport.height;\n canvas.width = viewport.width;\n const renderContext = {\n canvasContext: context,\n viewport,\n };\n const renderTask = page.render(renderContext).promise;\n renderTask.then(() => {\n const newImage = this.svgEditor.svgCanvas.addSVGElementFromJson({\n element: \"image\",\n attr: {\n x: 0,\n y: 0,\n width: viewport.width,\n height: viewport.height,\n id: this.svgEditor.svgCanvas.getNextId(),\n style: \"pointer-events:inherit\",\n },\n });\n this.svgEditor.svgCanvas.setHref(\n newImage,\n canvas.toDataURL(\"image/png\"),\n );\n\n this.svgEditor.svgCanvas.renameCurrentLayer(this.translate.instant(\"edition.plan-base\"));\n this.svgEditor.svgCanvas.createLayer(this.translate.instant(\"edition.personalization\"));\n });\n }\n\n async onLoadImg(img: any) {\n this.svgEditorIframe.contentWindow.postMessage(\n { action: \"disable-zone\" },\n \"*\",\n );\n const imgRequest: any = await downloadFileAsObject(\n this.chosenPlan.annexe,\n );\n if (imgRequest) {\n const imgBlob = await imgRequest.Body;\n const imgWidth = img.naturalWidth;\n const imgHeight = img.naturalHeight;\n // await this.svgEditor.setConfig({\n // dimensions: [imgWidth, imgHeight],\n // });\n this.svgEditor.svgCanvas.setResolution(imgWidth, imgHeight);\n\n const reader = new FileReader();\n reader.onloadend = () => {\n const newImage = this.svgEditor.svgCanvas.addSVGElementFromJson(\n {\n element: \"image\",\n attr: {\n x: 0,\n y: 0,\n width: imgWidth,\n height: imgHeight,\n id: this.svgEditor.svgCanvas.getNextId(),\n style: \"pointer-events:inherit\",\n },\n },\n );\n this.svgEditor.svgCanvas.setHref(newImage, reader.result);\n this.svgEditor.svgCanvas.renameCurrentLayer(this.translate.instant(\"edition.plan-base\"));\n this.svgEditor.svgCanvas.createLayer(this.translate.instant(\"edition.personalization\"));\n };\n reader.readAsDataURL(imgBlob);\n }\n }\n\n onNewZone(event) {\n this.isNewZone = false;\n if (event) {\n this.svgEditorIframe.contentWindow.postMessage(\n { action: \"rename-layer\", name: event },\n \"*\",\n );\n } else {\n this.svgEditorIframe.contentWindow.postMessage(\n { action: \"cancel-layer\" },\n \"*\",\n );\n }\n }\n\n}\n","<div class=\"row mt-3\">\n <div class=\"col\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems'></lib-tab-navigation>\n </div>\n </div>\n</div>\n<lib-add-zone *ngIf=\"isNewZone\" [images360]=\"images360\" [spaceID]=\"spaceID\" [navigationIDs]=\"navigations\"\n [zoneEdit]=\"editedZone\" [zones]=\"zones\" (updatedZone)=\"onNewZone($event)\" [chosenPlan]=\"editedPlan\"\n [newZoneDataFromEditor]=\"newZoneData\"></lib-add-zone>\n<iframe *ngIf=\"editorUrl\" #svgEditor [src]=\"editorUrl | safeUrl\" frameborder=\"0\"\n style=\"height:100%;width:100%;min-height:550px;max-height:750px\" (load)=\"onLoad(svgEditor)\"></iframe>\n<!-- chosenPlan && -->\n<!-- ./../../../../../../assets/svgeditor/index.html -->\n\n<img #imgPng *ngIf=\"chosenPlan && chosenPlan.extension !== 'svg' && svgEditor\" [src]=\"chosenPlan.filepath\"\n (load)=\"onLoadImg(imgPng)\" style=\"display: none;\">\n\n<canvas id=\"canvas4pdf\" style=\"display: none;\"></canvas>\n\n<ng-template #dialog let-modal>\n\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n {{'save plan edited' | translate}}\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"newSvg();modal.close('Close click')\">{{'Yes' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"updateSvg();modal.close('Close click')\">{{'No' |\n translate}}</button>\n </div>\n\n</ng-template>\n\n<ng-template #dialogZone let-modal>\n\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n {{'confirm.new-zone-from-plan' | translate}}\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-dark\"\n (click)=\"isNewZone = true;modal.close('Close click')\">{{'Validate' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"modal.close('Close click')\">{{'Cancel' |\n translate}}</button>\n </div>\n\n</ng-template>\n\n<ng-template #preparing let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">{{'Processing' | translate}}</h4>\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"d-flex justify-content-center\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n </div>\n\n</ng-template>","import { NgModule } from \"@angular/core\";\nimport { Routes, RouterModule } from \"@angular/router\";\nimport { CalibrationComponent } from \"./components/plans/calibration/calibration.component\";\nimport { DetailLocationComponent } from \"./components/detail-location/detail-location.component\";\nimport { EditPlanComponent } from \"./components/plans/edit-plan/edit-plan.component\";\nimport { ImagesComponent } from \"./components/images/images.component\";\nimport { LocationsComponent } from \"./components/locations/locations.component\";\nimport { PlansComponent } from \"./components/plans/plans.component\";\nimport { VisitsComponent } from \"./components/visits/visits.component\";\nimport { Models3dComponent } from \"./components/models3d/models3d.component\";\nimport { ZonesComponent } from \"./components/zones/zones.component\";\n\nconst routes: Routes = [\n {\n path: \"\",\n component: LocationsComponent,\n },\n {\n path: \":id\",\n children: [\n { path: \"\", component: DetailLocationComponent },\n { path: \"zones\", component: ZonesComponent },\n { path: \"visits\", component: VisitsComponent },\n { path: \"models3d\", component: Models3dComponent },\n { path: \"plans\", component: PlansComponent },\n {\n path: \"plan-calibration\",\n component: CalibrationComponent,\n },\n {\n path: \"plan-edit\",\n component: EditPlanComponent,\n },\n { path: \"images\", component: ImagesComponent },\n ],\n },\n ];\n \n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class LocationsRoutingModule { }","import { NgModule } from '@angular/core';\nimport { LocationsComponent } from './components/locations/locations.component';\nimport { DetailLocationComponent } from './components/detail-location/detail-location.component';\nimport { CalibrationComponent } from './components/plans/calibration/calibration.component';\nimport { PlansComponent } from './components/plans/plans.component';\nimport { VisitsComponent } from './components/visits/visits.component';\nimport { Models3dComponent } from './components/models3d/models3d.component';\nimport { ZonesComponent } from './components/zones/zones.component';\nimport { ImagesComponent } from './components/images/images.component';\nimport { EditPlanComponent } from './components/plans/edit-plan/edit-plan.component';\nimport { LocationsRoutingModule } from './ngx-smarterplan-location-routing.module';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TabNavigationComponent } from './components/tab-navigation/tab-navigation.component';\nimport { MapComponent } from './components/locations/map/map.component';\nimport { LeafletModule } from '@asymmetrik/ngx-leaflet';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { MapPopupComponent } from './components/locations/map/map-popup/map-popup.component';\nimport { CommonModule } from '@angular/common';\nimport { FormLocationComponent } from './components/form-location/form-location.component';\nimport { NgbAlertModule, NgbModule } from \"@ng-bootstrap/ng-bootstrap\";\nimport { ClipboardModule } from \"@angular/cdk/clipboard\";\nimport { ChevronComponent } from './components/chevron/chevron.component';\nimport { AddZoneComponent } from './components/zones/add-zone/add-zone.component';\nimport { SelectionComponent } from './components/zones/add-zone/selection/selection.component';\nimport { CarouselComponent } from './components/carousel/carousel.component';\nimport { NgxSmarterplanCoreModule } from '@smarterplan/ngx-smarterplan-core';\nimport { PdfViewerModule } from 'ng2-pdf-viewer';\nimport { SweepPlanSelectionComponent } from './components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component';\nimport { AddAudioZoneComponent } from './components/zones/add-audio-zone/add-audio-zone.component';\nimport { RadioButtonComponent } from './radio-button/radio-button.component';\nimport { PlanLegendComponent } from './components/plan-legend/plan-legend.component';\nimport { CountAudioSweepsPipe } from './pipes/count-audio-sweeps.pipe';\nimport { LandmarkPickerComponent } from './components/landmark-picker/landmark-picker.component';\n\n@NgModule({\n declarations: [\n LocationsComponent,\n DetailLocationComponent,\n LandmarkPickerComponent,\n CalibrationComponent,\n PlansComponent,\n VisitsComponent,\n Models3dComponent,\n ZonesComponent,\n ImagesComponent,\n EditPlanComponent,\n TabNavigationComponent,\n MapComponent,\n MapPopupComponent,\n FormLocationComponent,\n ChevronComponent,\n AddZoneComponent,\n SelectionComponent,\n CarouselComponent,\n SweepPlanSelectionComponent,\n AddAudioZoneComponent,\n RadioButtonComponent,\n PlanLegendComponent,\n CountAudioSweepsPipe,\n ],\n imports: [\n PdfViewerModule,\n ClipboardModule,\n NgbModule,\n NgbAlertModule,\n CommonModule,\n TranslateModule.forChild({\n extend: true\n }),\n LeafletModule,\n FormsModule,\n ReactiveFormsModule,\n NgxSmarterplanCoreModule,\n LocationsRoutingModule,\n ],\n exports: [MapComponent, TabNavigationComponent]\n})\nexport class NgxSmarterplanLocationsModule { }\n","/*\n * Public API Surface of ngx-smarterplan-locations\n */\n\nexport * from './lib/ngx-smarterplan-locations.service';\nexport * from './lib/ngx-smarterplan-locations.module';\n\n// Components\n\nexport * from './lib/components/locations/map/map.component';\nexport * from './lib/components/tab-navigation/tab-navigation.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1","i3","i5","i5.TabNavigationComponent","i6.MapComponent","i7.FormLocationComponent","i8","i4","i6","i7","i8.LandmarkPickerComponent","i9.TabNavigationComponent","i10.FormLocationComponent","i7.TabNavigationComponent","i8.ChevronComponent","i5.SelectionComponent","i6.RadioButtonComponent","i7.PlanLegendComponent","i4.CarouselComponent","i5.SweepPlanSelectionComponent","i6.SweepPlanSelectionComponent","i6.ChevronComponent","i7.AddZoneComponent","i8.AddAudioZoneComponent","i9.PlanLegendComponent","i10.CountAudioSweepsPipe","i6.CarouselComponent","i6.TabNavigationComponent"],"mappings":"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"}
|