@smarterplan/ngx-smarterplan-locations 0.0.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/README.md +24 -0
- package/esm2020/lib/components/carousel/carousel.component.mjs +28 -0
- package/esm2020/lib/components/chevron/chevron.component.mjs +18 -0
- package/esm2020/lib/components/detail-location/detail-location.component.mjs +154 -0
- package/esm2020/lib/components/form-location/form-location.component.mjs +215 -0
- package/esm2020/lib/components/images/images.component.mjs +91 -0
- package/esm2020/lib/components/locations/locations.component.mjs +138 -0
- package/esm2020/lib/components/locations/map/map-popup/map-popup.component.mjs +66 -0
- package/esm2020/lib/components/locations/map/map.component.mjs +91 -0
- package/esm2020/lib/components/plans/calibration/calibration.component.mjs +484 -0
- package/esm2020/lib/components/plans/edit-plan/edit-plan.component.mjs +314 -0
- package/esm2020/lib/components/plans/plans.component.mjs +211 -0
- package/esm2020/lib/components/tab-navigation/tab-navigation.component.mjs +40 -0
- package/esm2020/lib/components/visits/visits.component.mjs +227 -0
- package/esm2020/lib/components/zones/add-zone/add-zone.component.mjs +592 -0
- package/esm2020/lib/components/zones/add-zone/selection/selection.component.mjs +77 -0
- package/esm2020/lib/components/zones/zones.component.mjs +214 -0
- package/esm2020/lib/helper.service.mjs +2 -0
- package/esm2020/lib/ngx-smarterplan-location-routing.module.mjs +49 -0
- package/esm2020/lib/ngx-smarterplan-locations.module.mjs +107 -0
- package/esm2020/lib/ngx-smarterplan-locations.service.mjs +14 -0
- package/esm2020/public-api.mjs +6 -0
- package/esm2020/smarterplan-ngx-smarterplan-locations.mjs +5 -0
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs +3126 -0
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs.map +1 -0
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs +2987 -0
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs.map +1 -0
- package/lib/components/carousel/carousel.component.d.ts +12 -0
- package/lib/components/chevron/chevron.component.d.ts +9 -0
- package/lib/components/detail-location/detail-location.component.d.ts +51 -0
- package/lib/components/form-location/form-location.component.d.ts +40 -0
- package/lib/components/images/images.component.d.ts +28 -0
- package/lib/components/locations/locations.component.d.ts +49 -0
- package/lib/components/locations/map/map-popup/map-popup.component.d.ts +22 -0
- package/lib/components/locations/map/map.component.d.ts +22 -0
- package/lib/components/plans/calibration/calibration.component.d.ts +140 -0
- package/lib/components/plans/edit-plan/edit-plan.component.d.ts +54 -0
- package/lib/components/plans/plans.component.d.ts +59 -0
- package/lib/components/tab-navigation/tab-navigation.component.d.ts +13 -0
- package/lib/components/visits/visits.component.d.ts +51 -0
- package/lib/components/zones/add-zone/add-zone.component.d.ts +154 -0
- package/lib/components/zones/add-zone/selection/selection.component.d.ts +44 -0
- package/lib/components/zones/zones.component.d.ts +66 -0
- package/lib/helper.service.d.ts +6 -0
- package/lib/ngx-smarterplan-location-routing.module.d.ts +7 -0
- package/lib/ngx-smarterplan-locations.module.d.ts +31 -0
- package/lib/ngx-smarterplan-locations.service.d.ts +6 -0
- package/package.json +39 -0
- package/public-api.d.ts +2 -0
- package/smarterplan-ngx-smarterplan-locations.d.ts +5 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import { LevelStatus, enumToArray, uploadFileToS3, PropertyType, getSignedImageUrlForSpace, deleteFromS3 } from 'ngx-smarterplan-core';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "ngx-smarterplan-core";
|
|
6
|
+
import * as i2 from "@angular/forms";
|
|
7
|
+
import * as i3 from "@angular/common";
|
|
8
|
+
import * as i4 from "@ngx-translate/core";
|
|
9
|
+
export class FormLocationComponent {
|
|
10
|
+
constructor(spaceService, propertyService, userService, fb, missionService, layerService) {
|
|
11
|
+
this.spaceService = spaceService;
|
|
12
|
+
this.propertyService = propertyService;
|
|
13
|
+
this.userService = userService;
|
|
14
|
+
this.fb = fb;
|
|
15
|
+
this.missionService = missionService;
|
|
16
|
+
this.layerService = layerService;
|
|
17
|
+
this.isSubmitted = false;
|
|
18
|
+
this.addMissionForNewSpace = true;
|
|
19
|
+
this.imageToBeDeleted = false;
|
|
20
|
+
this.onChange = new EventEmitter();
|
|
21
|
+
this.levels = enumToArray(LevelStatus);
|
|
22
|
+
}
|
|
23
|
+
ngOnInit() {
|
|
24
|
+
if (this.location) {
|
|
25
|
+
this.initEditForm();
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
this.initForm();
|
|
29
|
+
}
|
|
30
|
+
this.handleInputImageText();
|
|
31
|
+
}
|
|
32
|
+
initForm() {
|
|
33
|
+
this.form = this.fb.group({
|
|
34
|
+
name: [null, [Validators.required]],
|
|
35
|
+
addresses: [""],
|
|
36
|
+
latitude: [null],
|
|
37
|
+
longitude: [null],
|
|
38
|
+
level: LevelStatus.LOW,
|
|
39
|
+
classGes: [null],
|
|
40
|
+
classEnergyConsumption: [null],
|
|
41
|
+
constructionYear: [null],
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
initEditForm() {
|
|
45
|
+
this.form = this.fb.group({
|
|
46
|
+
id: this.location.id,
|
|
47
|
+
name: [this.location.name, [Validators.required]],
|
|
48
|
+
addresses: this.location.addresses,
|
|
49
|
+
latitude: this.location.latitude,
|
|
50
|
+
longitude: this.location.longitude,
|
|
51
|
+
level: this.location.level,
|
|
52
|
+
classGes: this.location.classGes,
|
|
53
|
+
classEnergyConsumption: this.location.classEnergyConsumption,
|
|
54
|
+
constructionYear: this.location.constructionYear,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
handleImageInput(target) {
|
|
58
|
+
this.imageToUpload = target.files[0];
|
|
59
|
+
if (this.imageToUpload) {
|
|
60
|
+
this.imageInputContainer.nativeElement.style.display = "none";
|
|
61
|
+
const reader = new FileReader();
|
|
62
|
+
reader.addEventListener("load", () => {
|
|
63
|
+
this.currentImage = reader.result;
|
|
64
|
+
});
|
|
65
|
+
reader.readAsDataURL(this.imageToUpload);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async uploadImage(spaceID) {
|
|
69
|
+
if (this.imageToUpload) {
|
|
70
|
+
uploadFileToS3("locations/", this.imageToUpload, spaceID).then(async (url) => {
|
|
71
|
+
if (url) {
|
|
72
|
+
await this.spaceService.updateSpace({
|
|
73
|
+
id: spaceID,
|
|
74
|
+
annexes: url,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else if (this.imageToBeDeleted) {
|
|
80
|
+
await this.spaceService.updateSpace({
|
|
81
|
+
id: spaceID,
|
|
82
|
+
annexes: null,
|
|
83
|
+
});
|
|
84
|
+
await deleteFromS3(this.location.annexes);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
clearImageFile() {
|
|
88
|
+
this.imageToUpload = null;
|
|
89
|
+
this.currentImage = null;
|
|
90
|
+
this.imageInputContainer.nativeElement.style.display = "flex";
|
|
91
|
+
this.imageInput.nativeElement.value = "";
|
|
92
|
+
this.imageInputText = "Add picture";
|
|
93
|
+
}
|
|
94
|
+
async getLayerByName(name) {
|
|
95
|
+
const currentOrgId = this.userService.currentOrganisation().id;
|
|
96
|
+
const layers = await this.layerService.getLayerByNameForOrganisation(name, currentOrgId);
|
|
97
|
+
if (layers) {
|
|
98
|
+
return layers[0];
|
|
99
|
+
}
|
|
100
|
+
// create then
|
|
101
|
+
return this.layerService.createLayerForOrganisation(name, currentOrgId);
|
|
102
|
+
}
|
|
103
|
+
async onSubmit() {
|
|
104
|
+
this.isSubmitted = true;
|
|
105
|
+
if (!this.form.valid) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
let space;
|
|
110
|
+
if (this.location) {
|
|
111
|
+
this.changeCommaToDot();
|
|
112
|
+
space = await this.spaceService.updateSpace(this.form.value);
|
|
113
|
+
if (space) {
|
|
114
|
+
await this.uploadImage(space.id);
|
|
115
|
+
this.location = space;
|
|
116
|
+
this.onChange.emit(space);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
this.changeCommaToDot();
|
|
121
|
+
let layer = await this.getLayerByName("BUILDING");
|
|
122
|
+
if (!layer) {
|
|
123
|
+
layer = await this.layerService.createLayerForOrganisation("BUILDING", this.userService.currentOrganisation().id);
|
|
124
|
+
}
|
|
125
|
+
space = await this.spaceService.createSpace(this.form.value, layer);
|
|
126
|
+
const missions = this.userService.getManagerMissions();
|
|
127
|
+
if (space && missions.length > 0) {
|
|
128
|
+
const exampleMission = missions[0];
|
|
129
|
+
await this.uploadImage(space.id);
|
|
130
|
+
await this.propertyService.createProperty({
|
|
131
|
+
type: PropertyType.PROPERTY,
|
|
132
|
+
spaceID: space.id,
|
|
133
|
+
organisationID: exampleMission.organisationID,
|
|
134
|
+
});
|
|
135
|
+
// add directly a mission for this space
|
|
136
|
+
if (this.addMissionForNewSpace) {
|
|
137
|
+
await this.missionService.create({
|
|
138
|
+
spaceID: space.id,
|
|
139
|
+
userID: exampleMission.userID,
|
|
140
|
+
role: exampleMission.role,
|
|
141
|
+
level: exampleMission.level,
|
|
142
|
+
organisationID: exampleMission.organisationID,
|
|
143
|
+
orderedOrganisationID: exampleMission.organisationID,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
this.onChange.emit(space);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
this.onChange.emit(null);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error(error);
|
|
155
|
+
this.onChange.emit(null);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
onCancel() {
|
|
159
|
+
this.form.reset();
|
|
160
|
+
this.onChange.emit(null);
|
|
161
|
+
}
|
|
162
|
+
get name() {
|
|
163
|
+
return this.form.get("name");
|
|
164
|
+
}
|
|
165
|
+
changeCommaToDot() {
|
|
166
|
+
const updatedSpace = this.form.value;
|
|
167
|
+
if (updatedSpace.latitude &&
|
|
168
|
+
updatedSpace.latitude.toString().includes(",")) {
|
|
169
|
+
updatedSpace.latitude = updatedSpace.latitude
|
|
170
|
+
.toString()
|
|
171
|
+
.replace(",", ".");
|
|
172
|
+
Number.parseFloat(updatedSpace.latitude);
|
|
173
|
+
}
|
|
174
|
+
if (updatedSpace.longitude &&
|
|
175
|
+
updatedSpace.longitude.toString().includes(",")) {
|
|
176
|
+
updatedSpace.longitude = updatedSpace.longitude
|
|
177
|
+
.toString()
|
|
178
|
+
.replace(",", ".");
|
|
179
|
+
Number.parseFloat(updatedSpace.longitude);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
handleInputImageText() {
|
|
183
|
+
if (this.location && this.location.annexes) {
|
|
184
|
+
this.imageInputText = "Change picture";
|
|
185
|
+
getSignedImageUrlForSpace(this.location).then((url) => {
|
|
186
|
+
if (url) {
|
|
187
|
+
this.currentImage = url;
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
this.imageInputText = "Add picture";
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
FormLocationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormLocationComponent, deps: [{ token: i1.SpaceService }, { token: i1.PropertyService }, { token: i1.BaseUserService }, { token: i2.FormBuilder }, { token: i1.MissionService }, { token: i1.LayerService }], target: i0.ɵɵFactoryTarget.Component });
|
|
197
|
+
FormLocationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: FormLocationComponent, selector: "lib-form-location", inputs: { location: "location" }, outputs: { onChange: "onChange" }, viewQueries: [{ propertyName: "imageInputContainer", first: true, predicate: ["imageInputContainer"], descendants: true }, { propertyName: "imageInput", first: true, predicate: ["imageInput"], descendants: true }, { propertyName: "imageBasePreview", first: true, predicate: ["imageBasePreview"], descendants: true }], ngImport: i0, template: "<div class=\"col-md-6 form-new-loc\" *ngIf=\"form\">\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\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\" [class.is-invalid]=\"name.invalid && isSubmitted\" required\n formControlName=\"name\">\n <div class=\"invalid-feedback\">\n {{'Name is mandatory' | translate}}\n </div>\n </div>\n </div>\n \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\">\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 </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\">\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\">\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 </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\">\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\" \n class=\"btn btn-outline-primary rounded-pill\" (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 type=\"submit\" class=\"btn btn-outline-primary rounded-pill me-3\">{{'Save' | translate}}</button>\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\n translate}}</button>\n </form>\n</div>\n", styles: ["input[type=file]{display:none}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}.image-preview{object-fit:cover;max-height:400px;max-width:400px;display:flex;margin-bottom:15px}.imageInputContainer{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content}.image-name{display:flex}.col-form-label{margin-bottom:1rem;width:230px}.form-new-loc{background-color:#d3d3d3;margin-bottom:15px;padding:10px;width:80%;border-radius:10px}.col-sm-9 select{width:100%;height:31.25px;padding-left:10px}.btn-outline-primary{width:200px;margin-bottom:1rem;margin-right:1rem}\n"], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i4.TranslatePipe } });
|
|
198
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormLocationComponent, decorators: [{
|
|
199
|
+
type: Component,
|
|
200
|
+
args: [{ selector: 'lib-form-location', template: "<div class=\"col-md-6 form-new-loc\" *ngIf=\"form\">\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\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\" [class.is-invalid]=\"name.invalid && isSubmitted\" required\n formControlName=\"name\">\n <div class=\"invalid-feedback\">\n {{'Name is mandatory' | translate}}\n </div>\n </div>\n </div>\n \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\">\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 </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\">\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\">\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 </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\">\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\" \n class=\"btn btn-outline-primary rounded-pill\" (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 type=\"submit\" class=\"btn btn-outline-primary rounded-pill me-3\">{{'Save' | translate}}</button>\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\n translate}}</button>\n </form>\n</div>\n", styles: ["input[type=file]{display:none}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}.image-preview{object-fit:cover;max-height:400px;max-width:400px;display:flex;margin-bottom:15px}.imageInputContainer{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content}.image-name{display:flex}.col-form-label{margin-bottom:1rem;width:230px}.form-new-loc{background-color:#d3d3d3;margin-bottom:15px;padding:10px;width:80%;border-radius:10px}.col-sm-9 select{width:100%;height:31.25px;padding-left:10px}.btn-outline-primary{width:200px;margin-bottom:1rem;margin-right:1rem}\n"] }]
|
|
201
|
+
}], ctorParameters: function () { return [{ type: i1.SpaceService }, { type: i1.PropertyService }, { type: i1.BaseUserService }, { type: i2.FormBuilder }, { type: i1.MissionService }, { type: i1.LayerService }]; }, propDecorators: { imageInputContainer: [{
|
|
202
|
+
type: ViewChild,
|
|
203
|
+
args: ["imageInputContainer"]
|
|
204
|
+
}], imageInput: [{
|
|
205
|
+
type: ViewChild,
|
|
206
|
+
args: ["imageInput"]
|
|
207
|
+
}], imageBasePreview: [{
|
|
208
|
+
type: ViewChild,
|
|
209
|
+
args: ["imageBasePreview"]
|
|
210
|
+
}], location: [{
|
|
211
|
+
type: Input
|
|
212
|
+
}], onChange: [{
|
|
213
|
+
type: Output
|
|
214
|
+
}] } });
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1sb2NhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tbG9jYXRpb25zL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWxvY2F0aW9uL2Zvcm0tbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1sb2NhdGlvbi9mb3JtLWxvY2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBMEIsVUFBVSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBQ3JGLE9BQU8sRUFBUyxXQUFXLEVBQWtFLFdBQVcsRUFBRSxjQUFjLEVBQVMsWUFBWSxFQUFFLHlCQUF5QixFQUFnQixZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7O0FBT25PLE1BQU0sT0FBTyxxQkFBcUI7SUFnQzlCLFlBQ1ksWUFBMEIsRUFDMUIsZUFBZ0MsRUFDaEMsV0FBNEIsRUFDNUIsRUFBZSxFQUNmLGNBQThCLEVBQzlCLFlBQTBCO1FBTDFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQXBCdEMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFJcEIsMEJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBTTdCLHFCQUFnQixHQUFZLEtBQUss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QUFHLENBQUM7aUJBQzNCO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDTjthQUFNO1lBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7U0FDdkM7SUFDTCxDQUFDOztrSEE1T1EscUJBQXFCO3NHQUFyQixxQkFBcUIsNGJDVGxDLGt6SUErRkE7MkZEdEZhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUI7aVBBUzNCLG1CQUFtQjtzQkFEbEIsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBSWhDLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxZQUFZO2dCQUl2QixnQkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBSTdCLFFBQVE7c0JBRFAsS0FBSztnQkFpQkksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3BhY2UsIExldmVsU3RhdHVzLCBTcGFjZVNlcnZpY2UsIFByb3BlcnR5U2VydmljZSwgQmFzZVVzZXJTZXJ2aWNlLCBNaXNzaW9uU2VydmljZSwgZW51bVRvQXJyYXksIHVwbG9hZEZpbGVUb1MzLCBMYXllciwgUHJvcGVydHlUeXBlLCBnZXRTaWduZWRJbWFnZVVybEZvclNwYWNlLCBMYXllclNlcnZpY2UsIGRlbGV0ZUZyb21TMyB9IGZyb20gJ25neC1zbWFydGVycGxhbi1jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWZvcm0tbG9jYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1sb2NhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zvcm0tbG9jYXRpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtTG9jYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgZm9ybTogRm9ybUdyb3VwO1xuXG4gICAgQFZpZXdDaGlsZChcImltYWdlSW5wdXRDb250YWluZXJcIilcbiAgICBpbWFnZUlucHV0Q29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZChcImltYWdlSW5wdXRcIilcbiAgICBpbWFnZUlucHV0OiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZChcImltYWdlQmFzZVByZXZpZXdcIilcbiAgICBpbWFnZUJhc2VQcmV2aWV3OiBFbGVtZW50UmVmO1xuXG4gICAgQElucHV0KClcbiAgICBsb2NhdGlvbjogU3BhY2U7XG5cbiAgICBpbWFnZVRvVXBsb2FkOiBhbnk7XG5cbiAgICBpc1N1Ym1pdHRlZCA9IGZhbHNlO1xuXG4gICAgbGV2ZWxzOiBBcnJheTxMZXZlbFN0YXR1cz47XG5cbiAgICBhZGRNaXNzaW9uRm9yTmV3U3BhY2UgPSB0cnVlO1xuXG4gICAgaW1hZ2VJbnB1dFRleHQ6IHN0cmluZztcblxuICAgIGN1cnJlbnRJbWFnZTogc3RyaW5nO1xuXG4gICAgaW1hZ2VUb0JlRGVsZXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTcGFjZSB8IG51bGw+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBzcGFjZVNlcnZpY2U6IFNwYWNlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwcm9wZXJ0eVNlcnZpY2U6IFByb3BlcnR5U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgcHJpdmF0ZSBtaXNzaW9uU2VydmljZTogTWlzc2lvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbGF5ZXJTZXJ2aWNlOiBMYXllclNlcnZpY2UsXG4gICAgKSB7XG4gICAgICAgIHRoaXMubGV2ZWxzID0gZW51bVRvQXJyYXkoTGV2ZWxTdGF0dXMpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5sb2NhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5pbml0RWRpdEZvcm0oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbmRsZUlucHV0SW1hZ2VUZXh0KCk7XG4gICAgfVxuXG4gICAgaW5pdEZvcm0oKSB7XG4gICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgbmFtZTogW251bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICAgICAgICBhZGRyZXNzZXM6IFtcIlwiXSxcbiAgICAgICAgICAgIGxhdGl0dWRlOiBbbnVsbF0sXG4gICAgICAgICAgICBsb25naXR1ZGU6IFtudWxsXSxcbiAgICAgICAgICAgIGxldmVsOiBMZXZlbFN0YXR1cy5MT1csXG4gICAgICAgICAgICBjbGFzc0dlczogW251bGxdLFxuICAgICAgICAgICAgY2xhc3NFbmVyZ3lDb25zdW1wdGlvbjogW251bGxdLFxuICAgICAgICAgICAgY29uc3RydWN0aW9uWWVhcjogW251bGxdLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpbml0RWRpdEZvcm0oKSB7XG4gICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgaWQ6IHRoaXMubG9jYXRpb24uaWQsXG4gICAgICAgICAgICBuYW1lOiBbdGhpcy5sb2NhdGlvbi5uYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgICAgICAgYWRkcmVzc2VzOiB0aGlzLmxvY2F0aW9uLmFkZHJlc3NlcyxcbiAgICAgICAgICAgIGxhdGl0dWRlOiB0aGlzLmxvY2F0aW9uLmxhdGl0dWRlLFxuICAgICAgICAgICAgbG9uZ2l0dWRlOiB0aGlzLmxvY2F0aW9uLmxvbmdpdHVkZSxcbiAgICAgICAgICAgIGxldmVsOiB0aGlzLmxvY2F0aW9uLmxldmVsLFxuICAgICAgICAgICAgY2xhc3NHZXM6IHRoaXMubG9jYXRpb24uY2xhc3NHZXMsXG4gICAgICAgICAgICBjbGFzc0VuZXJneUNvbnN1bXB0aW9uOiB0aGlzLmxvY2F0aW9uLmNsYXNzRW5lcmd5Q29uc3VtcHRpb24sXG4gICAgICAgICAgICBjb25zdHJ1Y3Rpb25ZZWFyOiB0aGlzLmxvY2F0aW9uLmNvbnN0cnVjdGlvblllYXIsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhbmRsZUltYWdlSW5wdXQodGFyZ2V0OiBFdmVudFRhcmdldCkge1xuICAgICAgICB0aGlzLmltYWdlVG9VcGxvYWQgPSAodGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzWzBdO1xuICAgICAgICBpZiAodGhpcy5pbWFnZVRvVXBsb2FkKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlSW5wdXRDb250YWluZXIubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZSA9IHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTCh0aGlzLmltYWdlVG9VcGxvYWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgdXBsb2FkSW1hZ2Uoc3BhY2VJRDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlVG9VcGxvYWQpIHtcbiAgICAgICAgICAgIHVwbG9hZEZpbGVUb1MzKFwibG9jYXRpb25zL1wiLCB0aGlzLmltYWdlVG9VcGxvYWQsIHNwYWNlSUQpLnRoZW4oXG4gICAgICAgICAgICAgICAgYXN5bmMgKHVybCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS51cGRhdGVTcGFjZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHNwYWNlSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5uZXhlczogdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmltYWdlVG9CZURlbGV0ZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnVwZGF0ZVNwYWNlKHtcbiAgICAgICAgICAgICAgICBpZDogc3BhY2VJRCxcbiAgICAgICAgICAgICAgICBhbm5leGVzOiBudWxsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCBkZWxldGVGcm9tUzModGhpcy5sb2NhdGlvbi5hbm5leGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFySW1hZ2VGaWxlKCkge1xuICAgICAgICB0aGlzLmltYWdlVG9VcGxvYWQgPSBudWxsO1xuICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZSA9IG51bGw7XG4gICAgICAgIHRoaXMuaW1hZ2VJbnB1dENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcbiAgICAgICAgdGhpcy5pbWFnZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIlwiO1xuICAgICAgICB0aGlzLmltYWdlSW5wdXRUZXh0ID0gXCJBZGQgcGljdHVyZVwiO1xuICAgIH1cblxuICAgIGFzeW5jIGdldExheWVyQnlOYW1lKG5hbWU6IHN0cmluZyk6IFByb21pc2U8TGF5ZXI+IHtcbiAgICAgICAgY29uc3QgY3VycmVudE9yZ0lkID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50T3JnYW5pc2F0aW9uKCkuaWQ7XG4gICAgICAgIGNvbnN0IGxheWVycyA9IGF3YWl0IHRoaXMubGF5ZXJTZXJ2aWNlLmdldExheWVyQnlOYW1lRm9yT3JnYW5pc2F0aW9uKFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGN1cnJlbnRPcmdJZCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxheWVycykge1xuICAgICAgICAgICAgcmV0dXJuIGxheWVyc1swXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGUgdGhlblxuICAgICAgICByZXR1cm4gdGhpcy5sYXllclNlcnZpY2UuY3JlYXRlTGF5ZXJGb3JPcmdhbmlzYXRpb24obmFtZSwgY3VycmVudE9yZ0lkKTtcbiAgICB9XG5cbiAgICBhc3luYyBvblN1Ym1pdCgpIHtcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBzcGFjZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDb21tYVRvRG90KCk7XG4gICAgICAgICAgICAgICAgc3BhY2UgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS51cGRhdGVTcGFjZSh0aGlzLmZvcm0udmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwbG9hZEltYWdlKHNwYWNlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IHNwYWNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoc3BhY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDb21tYVRvRG90KCk7XG4gICAgICAgICAgICAgICAgbGV0IGxheWVyID0gYXdhaXQgdGhpcy5nZXRMYXllckJ5TmFtZShcIkJVSUxESU5HXCIpO1xuICAgICAgICAgICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIgPSBhd2FpdCB0aGlzLmxheWVyU2VydmljZS5jcmVhdGVMYXllckZvck9yZ2FuaXNhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQlVJTERJTkdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXNlclNlcnZpY2UuY3VycmVudE9yZ2FuaXNhdGlvbigpLmlkLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzcGFjZSA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmNyZWF0ZVNwYWNlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGxheWVyLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtaXNzaW9ucyA9IHRoaXMudXNlclNlcnZpY2UuZ2V0TWFuYWdlck1pc3Npb25zKCk7XG4gICAgICAgICAgICAgICAgaWYgKHNwYWNlICYmIG1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhhbXBsZU1pc3Npb24gPSBtaXNzaW9uc1swXTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGxvYWRJbWFnZShzcGFjZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvcGVydHlTZXJ2aWNlLmNyZWF0ZVByb3BlcnR5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BlcnR5VHlwZS5QUk9QRVJUWSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlSUQ6IHNwYWNlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IGV4YW1wbGVNaXNzaW9uLm9yZ2FuaXNhdGlvbklELFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGRpcmVjdGx5IGEgbWlzc2lvbiBmb3IgdGhpcyBzcGFjZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hZGRNaXNzaW9uRm9yTmV3U3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUlEOiBzcGFjZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySUQ6IGV4YW1wbGVNaXNzaW9uLnVzZXJJRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlOiBleGFtcGxlTWlzc2lvbi5yb2xlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBleGFtcGxlTWlzc2lvbi5sZXZlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogZXhhbXBsZU1pc3Npb24ub3JnYW5pc2F0aW9uSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZE9yZ2FuaXNhdGlvbklEOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlTWlzc2lvbi5vcmdhbmlzYXRpb25JRCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChzcGFjZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DYW5jZWwoKSB7XG4gICAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XG4gICAgfVxuXG4gICAgZ2V0IG5hbWUoKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoXCJuYW1lXCIpO1xuICAgIH1cblxuICAgIGNoYW5nZUNvbW1hVG9Eb3QoKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRTcGFjZSA9IHRoaXMuZm9ybS52YWx1ZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdXBkYXRlZFNwYWNlLmxhdGl0dWRlICYmXG4gICAgICAgICAgICB1cGRhdGVkU3BhY2UubGF0aXR1ZGUudG9TdHJpbmcoKS5pbmNsdWRlcyhcIixcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB1cGRhdGVkU3BhY2UubGF0aXR1ZGUgPSB1cGRhdGVkU3BhY2UubGF0aXR1ZGVcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiLFwiLCBcIi5cIik7XG4gICAgICAgICAgICBOdW1iZXIucGFyc2VGbG9hdCh1cGRhdGVkU3BhY2UubGF0aXR1ZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHVwZGF0ZWRTcGFjZS5sb25naXR1ZGUgJiZcbiAgICAgICAgICAgIHVwZGF0ZWRTcGFjZS5sb25naXR1ZGUudG9TdHJpbmcoKS5pbmNsdWRlcyhcIixcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB1cGRhdGVkU3BhY2UubG9uZ2l0dWRlID0gdXBkYXRlZFNwYWNlLmxvbmdpdHVkZVxuICAgICAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIsXCIsIFwiLlwiKTtcbiAgICAgICAgICAgIE51bWJlci5wYXJzZUZsb2F0KHVwZGF0ZWRTcGFjZS5sb25naXR1ZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlSW5wdXRJbWFnZVRleHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvY2F0aW9uICYmIHRoaXMubG9jYXRpb24uYW5uZXhlcykge1xuICAgICAgICAgICAgdGhpcy5pbWFnZUlucHV0VGV4dCA9IFwiQ2hhbmdlIHBpY3R1cmVcIjtcbiAgICAgICAgICAgIGdldFNpZ25lZEltYWdlVXJsRm9yU3BhY2UodGhpcy5sb2NhdGlvbikudGhlbigodXJsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZSA9IHVybDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VJbnB1dFRleHQgPSBcIkFkZCBwaWN0dXJlXCI7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY29sLW1kLTYgZm9ybS1uZXctbG9jXCIgKm5nSWY9XCJmb3JtXCI+XG4gICAgPGZvcm0gKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J05hbWUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW2NsYXNzLmlzLWludmFsaWRdPVwibmFtZS5pbnZhbGlkICYmIGlzU3VibWl0dGVkXCIgcmVxdWlyZWRcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxuICAgICAgICAgICAge3snTmFtZSBpcyBtYW5kYXRvcnknIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgXG4gICAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydBZGRyZXNzJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzZXNcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgXG4gICAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydDb25zdHJ1Y3Rpb24geWVhcicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiY29uc3RydWN0aW9uWWVhclwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICBcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0xhdGl0dWRlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJsYXRpdHVkZVwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICBcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0xvbmdpdHVkZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibG9uZ2l0dWRlXCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gIFxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgcm93XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQWNjZXNzIGxldmVsJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XG4gICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImQtaW5saW5lLWJsb2NrIGN1c3RvbS1zZWxlY3Qgcm91bmRlZC1waWxsXCIgZm9ybUNvbnRyb2xOYW1lPVwibGV2ZWxcIj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxldmVsIG9mIGxldmVsc1wiIFt2YWx1ZV09XCJsZXZlbFwiPnt7bGV2ZWwgfCB0cmFuc2xhdGV9fTwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICBcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0VuZXJneSBDbGFzcycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2xhc3NFbmVyZ3lDb25zdW1wdGlvblwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICBcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0dyZWVuaG91c2UgZ2FzIGVtaXNzaW9uIENsYXNzJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjbGFzc0dlc1wiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICBcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0NvdmVyIHBpY3R1cmUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cbiAgICAgICAgICA8aW1nICNpbWFnZUJhc2VQcmV2aWV3ICpuZ0lmPVwiY3VycmVudEltYWdlXCIgY2xhc3M9XCJpbWFnZS1wcmV2aWV3XCIgW3NyY109XCJjdXJyZW50SW1hZ2VcIj5cbiAgICAgICAgICA8bGFiZWwgI2ltYWdlSW5wdXRDb250YWluZXIgZm9yPVwiaW1hZ2VcIlxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxhYmVsLWZpbGUgYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgaW1hZ2VJbnB1dENvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGlucHV0ICNpbWFnZUlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJpbWFnZVwiIChjaGFuZ2UpPVwiaGFuZGxlSW1hZ2VJbnB1dCgkZXZlbnQudGFyZ2V0KVwiIC8+XG4gICAgICAgICAgICB7eyBpbWFnZUlucHV0VGV4dCB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiY3VycmVudEltYWdlICYmICFpbWFnZVRvVXBsb2FkXCIgXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwiaW1hZ2VUb0JlRGVsZXRlZD10cnVlO2NsZWFySW1hZ2VGaWxlKClcIj57eydEZWxldGUgcGljdHVyZScgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2UtbmFtZVwiICpuZ0lmPVwiaW1hZ2VUb1VwbG9hZFwiPlxuICAgICAgICAgICAgPHAgPnt7IGltYWdlVG9VcGxvYWQubmFtZX19PC9wPlxuICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiY2xlYXJJbWFnZUZpbGUoKVwiICBbc3R5bGUuY3Vyc29yXT1cIidwb2ludGVyJ1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6dHJhc2gtY2FuLW91dGxpbmVcIj48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiICpuZ0lmPVwiIWxvY2F0aW9uXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQ3JlYXRlIG1pc3Npb24gZm9yIHRoaXMgc3BhY2UnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTNcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJhZGRNaXNzaW9uRm9yTmV3U3BhY2VcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gIFxuICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtM1wiPnt7J1NhdmUnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIj57eydDYW5jZWwnIHxcbiAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICA8L2Zvcm0+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { InventoryStatus } from 'ngx-smarterplan-core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/router";
|
|
5
|
+
import * as i2 from "ngx-smarterplan-core";
|
|
6
|
+
import * as i3 from "../tab-navigation/tab-navigation.component";
|
|
7
|
+
import * as i4 from "../carousel/carousel.component";
|
|
8
|
+
import * as i5 from "@angular/common";
|
|
9
|
+
import * as i6 from "@ng-bootstrap/ng-bootstrap";
|
|
10
|
+
import * as i7 from "@ngx-translate/core";
|
|
11
|
+
export class ImagesComponent {
|
|
12
|
+
constructor(route, spaceService, visitService, nodeService) {
|
|
13
|
+
this.route = route;
|
|
14
|
+
this.spaceService = spaceService;
|
|
15
|
+
this.visitService = visitService;
|
|
16
|
+
this.nodeService = nodeService;
|
|
17
|
+
this.loading = false;
|
|
18
|
+
this.menuItems = [];
|
|
19
|
+
}
|
|
20
|
+
ngOnInit() {
|
|
21
|
+
this.spaceID = this.route.snapshot.paramMap.get("id");
|
|
22
|
+
this.loadImages();
|
|
23
|
+
}
|
|
24
|
+
setupMenuItems() {
|
|
25
|
+
this.menuItems = [
|
|
26
|
+
{ label: "Locations", url: "/localisation" },
|
|
27
|
+
{
|
|
28
|
+
label: this.currentSpace.name,
|
|
29
|
+
url: `/localisation/${this.spaceID}`,
|
|
30
|
+
},
|
|
31
|
+
{ label: "360° Images" },
|
|
32
|
+
];
|
|
33
|
+
if (this.currentVisit) {
|
|
34
|
+
this.menuItems.push({ label: this.currentVisit.name });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
onGoBack() {
|
|
38
|
+
this.currentVisit = null;
|
|
39
|
+
this.currentImages = null;
|
|
40
|
+
this.setupMenuItems();
|
|
41
|
+
}
|
|
42
|
+
async loadImages() {
|
|
43
|
+
this.loading = true;
|
|
44
|
+
this.currentSpace = await this.spaceService.getSpace(this.spaceID);
|
|
45
|
+
this.setupMenuItems();
|
|
46
|
+
this.images = await this.visitService.loadImagesForSpace(this.currentSpace);
|
|
47
|
+
if (this.currentSpace.visits.length === 1) {
|
|
48
|
+
this.setVisit(this.currentSpace.visits[0]);
|
|
49
|
+
}
|
|
50
|
+
this.loading = false;
|
|
51
|
+
}
|
|
52
|
+
setVisit(visit) {
|
|
53
|
+
this.currentVisit = visit;
|
|
54
|
+
this.currentImages = this.images.filter((im) => {
|
|
55
|
+
return im.visit === visit;
|
|
56
|
+
});
|
|
57
|
+
this.setupMenuItems();
|
|
58
|
+
}
|
|
59
|
+
setCurrentScan(id) {
|
|
60
|
+
this.currentScanID = id;
|
|
61
|
+
}
|
|
62
|
+
async onInventoryClick() {
|
|
63
|
+
const { node } = this.currentVisit;
|
|
64
|
+
const { filename } = this.currentImages[this.currentScanID]; // 110ee452_sweep.jpeg
|
|
65
|
+
// check if node has already errors of inventory
|
|
66
|
+
const missingFilesErrors = [
|
|
67
|
+
InventoryStatus.ERROR_FILE_JSON_NOT_EXIST,
|
|
68
|
+
InventoryStatus.ERROR_FILE_MODEL_NOT_EXIST,
|
|
69
|
+
InventoryStatus.ERROR_FILE_OBJ_NOT_EXIST,
|
|
70
|
+
];
|
|
71
|
+
if (node.inventoryStatus &&
|
|
72
|
+
missingFilesErrors.includes(node.inventoryStatus)) {
|
|
73
|
+
alert("Files missing for this visit's inventory. Contact your administrator.");
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
await this.nodeService.updateNode({
|
|
77
|
+
id: node.id,
|
|
78
|
+
inventoryStatus: InventoryStatus.TO_RUN_ONE_IMAGE,
|
|
79
|
+
navigationForInventory: filename.split("_")[0],
|
|
80
|
+
});
|
|
81
|
+
alert("Automatic AI Inventory started! Detected equipments will appear soon in the visit.");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
ImagesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ImagesComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.SpaceService }, { token: i2.VisitService }, { token: i2.NodeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
86
|
+
ImagesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: ImagesComponent, selector: "lib-images", ngImport: i0, template: "<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>", styles: [""], components: [{ type: i3.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { type: i4.CarouselComponent, selector: "lib-carousel", inputs: ["images"], outputs: ["currentScan"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i6.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i6.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }], pipes: { "translate": i7.TranslatePipe } });
|
|
87
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ImagesComponent, decorators: [{
|
|
88
|
+
type: Component,
|
|
89
|
+
args: [{ selector: 'lib-images', template: "<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>", styles: [""] }]
|
|
90
|
+
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.SpaceService }, { type: i2.VisitService }, { type: i2.NodeService }]; } });
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2VzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2ltYWdlcy9pbWFnZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvaW1hZ2VzL2ltYWdlcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRWxELE9BQU8sRUFBbUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7OztBQU94SCxNQUFNLE9BQU8sZUFBZTtJQWtCeEIsWUFDWSxLQUFxQixFQUNyQixZQUEwQixFQUMxQixZQUEwQixFQUMxQixXQUF3QjtRQUh4QixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQVZwQyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBSWhCLGNBQVMsR0FBZSxFQUFFLENBQUM7SUFPeEIsQ0FBQztJQUVKLFFBQVE7UUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxjQUFjO1FBQ1YsSUFBSSxDQUFDLFNBQVMsR0FBRztZQUNiLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFO1lBQzVDO2dCQUNJLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxD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U0FBUzsrQkFDRSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFNwYWNlLCBWaXNpdCwgTWVudUl0ZW0sIFNwYWNlU2VydmljZSwgVmlzaXRTZXJ2aWNlLCBOb2RlU2VydmljZSwgSW52ZW50b3J5U3RhdHVzIH0gZnJvbSAnbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItaW1hZ2VzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ltYWdlcy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBpbWFnZXM6IEFycmF5PGFueT47XG5cbiAgICBzcGFjZUlEOiBzdHJpbmc7XG5cbiAgICBjdXJyZW50U3BhY2U6IFNwYWNlO1xuXG4gICAgY3VycmVudFZpc2l0OiBWaXNpdDtcblxuICAgIGN1cnJlbnRJbWFnZXM6IEFycmF5PGFueT47XG5cbiAgICBsb2FkaW5nID0gZmFsc2U7XG5cbiAgICBjdXJyZW50U2NhbklEOiBzdHJpbmc7XG5cbiAgICBtZW51SXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSBzcGFjZVNlcnZpY2U6IFNwYWNlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB2aXNpdFNlcnZpY2U6IFZpc2l0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBub2RlU2VydmljZTogTm9kZVNlcnZpY2UsXG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3BhY2VJRCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KFwiaWRcIik7XG4gICAgICAgIHRoaXMubG9hZEltYWdlcygpO1xuICAgIH1cblxuICAgIHNldHVwTWVudUl0ZW1zKCkge1xuICAgICAgICB0aGlzLm1lbnVJdGVtcyA9IFtcbiAgICAgICAgICAgIHsgbGFiZWw6IFwiTG9jYXRpb25zXCIsIHVybDogXCIvbG9jYWxpc2F0aW9uXCIgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5jdXJyZW50U3BhY2UubmFtZSxcbiAgICAgICAgICAgICAgICB1cmw6IGAvbG9jYWxpc2F0aW9uLyR7dGhpcy5zcGFjZUlEfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBsYWJlbDogXCIzNjDCsCBJbWFnZXNcIiB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWaXNpdCkge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMucHVzaCh7IGxhYmVsOiB0aGlzLmN1cnJlbnRWaXNpdC5uYW1lIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Hb0JhY2soKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpc2l0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2VzID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xuICAgIH1cblxuICAgIGFzeW5jIGxvYWRJbWFnZXMoKSB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY3VycmVudFNwYWNlID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0U3BhY2UodGhpcy5zcGFjZUlEKTtcbiAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xuICAgICAgICB0aGlzLmltYWdlcyA9IGF3YWl0IHRoaXMudmlzaXRTZXJ2aWNlLmxvYWRJbWFnZXNGb3JTcGFjZShcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNwYWNlLFxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50U3BhY2UudmlzaXRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5zZXRWaXNpdCh0aGlzLmN1cnJlbnRTcGFjZS52aXNpdHNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHNldFZpc2l0KHZpc2l0KSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpc2l0ID0gdmlzaXQ7XG4gICAgICAgIHRoaXMuY3VycmVudEltYWdlcyA9IHRoaXMuaW1hZ2VzLmZpbHRlcigoaW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpbS52aXNpdCA9PT0gdmlzaXQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgc2V0Q3VycmVudFNjYW4oaWQpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2NhbklEID0gaWQ7XG4gICAgfVxuXG4gICAgYXN5bmMgb25JbnZlbnRvcnlDbGljaygpIHtcbiAgICAgICAgY29uc3QgeyBub2RlIH0gPSB0aGlzLmN1cnJlbnRWaXNpdDtcbiAgICAgICAgY29uc3QgeyBmaWxlbmFtZSB9ID0gdGhpcy5jdXJyZW50SW1hZ2VzW3RoaXMuY3VycmVudFNjYW5JRF07IC8vIDExMGVlNDUyX3N3ZWVwLmpwZWdcbiAgICAgICAgLy8gY2hlY2sgaWYgbm9kZSBoYXMgYWxyZWFkeSBlcnJvcnMgb2YgaW52ZW50b3J5XG4gICAgICAgIGNvbnN0IG1pc3NpbmdGaWxlc0Vycm9ycyA9IFtcbiAgICAgICAgICAgIEludmVudG9yeVN0YXR1cy5FUlJPUl9GSUxFX0pTT05fTk9UX0VYSVNULFxuICAgICAgICAgICAgSW52ZW50b3J5U3RhdHVzLkVSUk9SX0ZJTEVfTU9ERUxfTk9UX0VYSVNULFxuICAgICAgICAgICAgSW52ZW50b3J5U3RhdHVzLkVSUk9SX0ZJTEVfT0JKX05PVF9FWElTVCxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgbm9kZS5pbnZlbnRvcnlTdGF0dXMgJiZcbiAgICAgICAgICAgIG1pc3NpbmdGaWxlc0Vycm9ycy5pbmNsdWRlcyhub2RlLmludmVudG9yeVN0YXR1cylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhbGVydChcbiAgICAgICAgICAgICAgICBcIkZpbGVzIG1pc3NpbmcgZm9yIHRoaXMgdmlzaXQncyBpbnZlbnRvcnkuIENvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yLlwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubm9kZVNlcnZpY2UudXBkYXRlTm9kZSh7XG4gICAgICAgICAgICAgICAgaWQ6IG5vZGUuaWQsXG4gICAgICAgICAgICAgICAgaW52ZW50b3J5U3RhdHVzOiBJbnZlbnRvcnlTdGF0dXMuVE9fUlVOX09ORV9JTUFHRSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uRm9ySW52ZW50b3J5OiBmaWxlbmFtZS5zcGxpdChcIl9cIilbMF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFsZXJ0KFxuICAgICAgICAgICAgICAgIFwiQXV0b21hdGljIEFJIEludmVudG9yeSBzdGFydGVkISBEZXRlY3RlZCBlcXVpcG1lbnRzIHdpbGwgYXBwZWFyIHNvb24gaW4gdGhlIHZpc2l0LlwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCBkYXNoYm9hcmQtdGFiIGNvbC1zbS0xMCBtYi0zXCIgKm5nSWY9XCJjdXJyZW50U3BhY2VcIiA+XG4gICAgPGRpdiBjbGFzcz1cIm0tM1wiPlxuICAgICAgPGxpYi10YWItbmF2aWdhdGlvbiBbbWVudUl0ZW1zXT0nbWVudUl0ZW1zJyAob25Hb0JhY2spPVwib25Hb0JhY2soKVwiPjwvbGliLXRhYi1uYXZpZ2F0aW9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyXCIgcm9sZT1cInN0YXR1c1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPnt7J0xvYWRpbmcnIHwgdHJhbnNsYXRlfX0uLi48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2tcIiAqbmdJZj1cImN1cnJlbnRTcGFjZS52aXNpdHMgJiYgY3VycmVudFNwYWNlLnZpc2l0cy5sZW5ndGggPiAwXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1sYWJlbC1maWxlIHJvdW5kZWQtcGlsbFwiIGlkPVwiZHJvcGRvd25CYXNpYzFcIiAqbmdJZj1cIiFjdXJyZW50VmlzaXRcIlxuICAgICAgICBuZ2JEcm9wZG93blRvZ2dsZT57eydDaG9vc2UgM0QgdmlzaXQnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duQmFzaWMxXCI+XG4gICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtICpuZ0Zvcj1cImxldCB2aXNpdCBvZiBjdXJyZW50U3BhY2UudmlzaXRzXCIgKGNsaWNrKT1cInNldFZpc2l0KHZpc2l0KVwiPiB7eyB2aXNpdC5uYW1lIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGgzICpuZ0lmPVwiY3VycmVudFZpc2l0XCI+e3sgY3VycmVudFZpc2l0Lm5hbWUgfX08L2gzPlxuICAgIDxkaXYgY2xhc3M9XCJtdC0zXCIgKm5nSWY9XCJjdXJyZW50VmlzaXQgJiYgY3VycmVudEltYWdlcy5sZW5ndGggPT0gMCAmJiAhbG9hZGluZ1wiPlxuICAgICAgPGg0Pnt7J05vIGltcG9ydGVkIGltYWdlcycgfCB0cmFuc2xhdGUgfX08L2g0PlxuICAgICAgPHA+e3snRm9yIGltcG9ydDogZ28gVmlydHVhbCBWaXNpdHMgPT4gSW1wb3J0IEltYWdlcycgfCB0cmFuc2xhdGV9fTwvcD5cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiY3VycmVudFZpc2l0ICYmIGN1cnJlbnRJbWFnZXMubGVuZ3RoID4gMCAmJiAhbG9hZGluZ1wiXG4gICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBuby1sb3dlcmNhc2UgbWItMlwiIChjbGljayk9XCJvbkludmVudG9yeUNsaWNrKClcIj5cbiAgICAgIHt7J1J1biBBSSBpbnZlbnRvcnkgb24gdGhpcyBpbWFnZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgIDxsaWItY2Fyb3VzZWwgW2ltYWdlc109XCJjdXJyZW50SW1hZ2VzXCIgKm5nSWY9XCJjdXJyZW50SW1hZ2VzXCIgKGN1cnJlbnRTY2FuKT1cInNldEN1cnJlbnRTY2FuKCRldmVudClcIj48L2xpYi1jYXJvdXNlbD5cbiAgPC9kaXY+Il19
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { LevelStatus, enumToArray, SearchObjectType } from 'ngx-smarterplan-core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "ngx-smarterplan-core";
|
|
5
|
+
import * as i2 from "@angular/router";
|
|
6
|
+
import * as i3 from "../tab-navigation/tab-navigation.component";
|
|
7
|
+
import * as i4 from "./map/map.component";
|
|
8
|
+
import * as i5 from "../form-location/form-location.component";
|
|
9
|
+
import * as i6 from "@angular/common";
|
|
10
|
+
import * as i7 from "@ng-bootstrap/ng-bootstrap";
|
|
11
|
+
import * as i8 from "@ngx-translate/core";
|
|
12
|
+
export class LocationsComponent {
|
|
13
|
+
constructor(spaceService, router, userService, viewerService, navigationService, navigatorService) {
|
|
14
|
+
this.spaceService = spaceService;
|
|
15
|
+
this.router = router;
|
|
16
|
+
this.userService = userService;
|
|
17
|
+
this.viewerService = viewerService;
|
|
18
|
+
this.navigationService = navigationService;
|
|
19
|
+
this.navigatorService = navigatorService;
|
|
20
|
+
this.isAdding = false;
|
|
21
|
+
this.filteredLocations = [];
|
|
22
|
+
this.isManager = false;
|
|
23
|
+
this.isMuseumUser = true;
|
|
24
|
+
this.locations = [];
|
|
25
|
+
this.menuItems = [];
|
|
26
|
+
/** Last filtered Locations, used when we go back on all locations from the search bar location */
|
|
27
|
+
this.lastFiltredLocations = [];
|
|
28
|
+
this.levels = enumToArray(LevelStatus);
|
|
29
|
+
this.userSubcription = this.userService.isChanged.subscribe((isConnected) => {
|
|
30
|
+
if (isConnected) {
|
|
31
|
+
this.refresh();
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
this.locationIDSubscription =
|
|
35
|
+
this.navigatorService.locationIDChange.subscribe((id) => {
|
|
36
|
+
this.changeSelectedLocation(id);
|
|
37
|
+
this.setupMenuItems();
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async ngOnInit() {
|
|
41
|
+
if (this.userService.cu) {
|
|
42
|
+
this.resetList();
|
|
43
|
+
this.updateUserRights();
|
|
44
|
+
}
|
|
45
|
+
this.setupMenuItems();
|
|
46
|
+
}
|
|
47
|
+
findSpaceById(id) {
|
|
48
|
+
return this.locations.find((loc) => loc.id === id);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Update when we change the selected location in filter (search bar)
|
|
52
|
+
* @param id for a location, if null display all last filtred location
|
|
53
|
+
*/
|
|
54
|
+
changeSelectedLocation(id) {
|
|
55
|
+
const space = id ? this.findSpaceById(id) : null;
|
|
56
|
+
this.filteredLocations = space ? [space] : this.lastFiltredLocations; // New selected space or last filtered location
|
|
57
|
+
}
|
|
58
|
+
refresh() {
|
|
59
|
+
this.updateUserRights();
|
|
60
|
+
this.resetList();
|
|
61
|
+
}
|
|
62
|
+
ngOnDestroy() {
|
|
63
|
+
this.userSubcription.unsubscribe();
|
|
64
|
+
this.locationIDSubscription.unsubscribe();
|
|
65
|
+
}
|
|
66
|
+
setupMenuItems() {
|
|
67
|
+
this.menuItems = [{ label: "All Locations", url: "/localisation" }];
|
|
68
|
+
if (this.isAdding) {
|
|
69
|
+
this.menuItems.push({ label: "New" });
|
|
70
|
+
}
|
|
71
|
+
if (this.filteredLocations.length === 1) {
|
|
72
|
+
const selectedLoc = this.filteredLocations[0];
|
|
73
|
+
this.menuItems.push({ label: selectedLoc.name });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
updateUserRights() {
|
|
77
|
+
this.isManager = this.userService.hasManagerRoleInAnyMission();
|
|
78
|
+
this.isMuseumUser = this.userService.hasOnlyMuseumRole();
|
|
79
|
+
}
|
|
80
|
+
isManagerForSpace(spaceID) {
|
|
81
|
+
return (this.userService.isManager(spaceID) ||
|
|
82
|
+
this.userService.isGuide(spaceID));
|
|
83
|
+
}
|
|
84
|
+
async resetList() {
|
|
85
|
+
this.locations = await this.spaceService.getLocationsForCurrentUser();
|
|
86
|
+
this.filteredLocations = this.locations;
|
|
87
|
+
this.lastFiltredLocations = this.locations;
|
|
88
|
+
this.isAdding = false;
|
|
89
|
+
this.changeSelectedLocation(this.navigatorService.currentNavBarLocationID); // Set for the current selected location
|
|
90
|
+
this.setupMenuItems();
|
|
91
|
+
}
|
|
92
|
+
onAddLocation() {
|
|
93
|
+
this.isAdding = true;
|
|
94
|
+
this.setupMenuItems();
|
|
95
|
+
}
|
|
96
|
+
handleImageInput(files) {
|
|
97
|
+
this.imageToUpload = files.item(0);
|
|
98
|
+
}
|
|
99
|
+
onFormChange(event) {
|
|
100
|
+
this.navigatorService.locationIDChange.next(null); /** Remove selected location */
|
|
101
|
+
this.isAdding = false;
|
|
102
|
+
if (event) {
|
|
103
|
+
this.resetList();
|
|
104
|
+
}
|
|
105
|
+
this.setupMenuItems();
|
|
106
|
+
}
|
|
107
|
+
async onVisitClick(loc, visit) {
|
|
108
|
+
if (!this.userService.userHasAccessToAllZonesInSpace(loc.id)) {
|
|
109
|
+
// get allowed sweep for the user
|
|
110
|
+
const allowedSweeps = await this.navigationService.getAllowedSweepsIDsForUserInSpace(loc.id);
|
|
111
|
+
const firstSweep = allowedSweeps[0];
|
|
112
|
+
this.viewerService.setSweepToMove(firstSweep);
|
|
113
|
+
}
|
|
114
|
+
if (this.userService.isGuide(loc.id)) {
|
|
115
|
+
this.router.navigate(["museum", loc.id]);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
this.router.navigate(["visit", loc.id], {
|
|
119
|
+
queryParams: { model3D: visit.model3d },
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
applyResultsSearchBar(results) {
|
|
124
|
+
this.filteredLocations = results || this.locations;
|
|
125
|
+
this.lastFiltredLocations = this.filteredLocations;
|
|
126
|
+
this.navigatorService.locationIDChange.next(null); // When we search with keyword, we would like to search on all locations
|
|
127
|
+
}
|
|
128
|
+
getSearchType() {
|
|
129
|
+
return SearchObjectType.LOCATION;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
LocationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: LocationsComponent, deps: [{ token: i1.SpaceService }, { token: i2.Router }, { token: i1.BaseUserService }, { token: i1.ViewerService }, { token: i1.NavigationService }, { token: i1.NavigatorService }], target: i0.ɵɵFactoryTarget.Component });
|
|
133
|
+
LocationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: LocationsComponent, selector: "lib-locations", ngImport: i0, template: "<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 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 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 *ngIf=\"isManagerForSpace(loc.id)\" class=\"btn-details\" [routerLink]=\"[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 <p *ngFor=\"let visit of loc.visits\" (click)=\"onVisitClick(loc, visit)\" class=\"visit-name\"\n [style.cursor]=\"'pointer'\" ngbTooltip=\"Visit\">{{ visit.name ? visit.name : loc.name}}</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", styles: [".searchbar{margin-bottom:10px}input[type=file]{display:none}.form-control{border-radius:var(--form-control-border-radius)}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}section .list-group{margin-top:15px}section .list-group-item{padding:5px 0}section .location-info{font-size:1.1em}section .location-img{width:100%;object-fit:cover;object-position:center bottom;height:165px}#img_container{position:relative;display:inline-block;text-align:center;width:250px}.img-main-container{max-width:250px;width:250px!important;margin-right:10px}.visit-name{color:var(--smarterplan-primary);font-weight:600}.btn-details{background-color:var(--smarterplan-primary-transparent);position:absolute;color:#fff;bottom:0px;right:0px;width:100%;height:30%;border:none;font-size:1em;text-transform:lowercase}#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.refreshIcon{color:var(--smarterplan-primary);cursor:pointer}.refreshIcon svg{vertical-align:middle!important}.add-location{width:12vw}.sp-row{display:flex;flex-direction:row}\n"], components: [{ type: i3.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { type: i1.SearchBarComponent, selector: "lib-search-bar", inputs: ["searchable", "objectType"], outputs: ["searchEvent"] }, { type: i4.MapComponent, selector: "lib-map", inputs: ["spaces"] }, { type: i5.FormLocationComponent, selector: "lib-form-location", inputs: ["location"], outputs: ["onChange"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }], pipes: { "translate": i8.TranslatePipe } });
|
|
134
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: LocationsComponent, decorators: [{
|
|
135
|
+
type: Component,
|
|
136
|
+
args: [{ selector: 'lib-locations', template: "<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 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 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 *ngIf=\"isManagerForSpace(loc.id)\" class=\"btn-details\" [routerLink]=\"[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 <p *ngFor=\"let visit of loc.visits\" (click)=\"onVisitClick(loc, visit)\" class=\"visit-name\"\n [style.cursor]=\"'pointer'\" ngbTooltip=\"Visit\">{{ visit.name ? visit.name : loc.name}}</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", styles: [".searchbar{margin-bottom:10px}input[type=file]{display:none}.form-control{border-radius:var(--form-control-border-radius)}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}section .list-group{margin-top:15px}section .list-group-item{padding:5px 0}section .location-info{font-size:1.1em}section .location-img{width:100%;object-fit:cover;object-position:center bottom;height:165px}#img_container{position:relative;display:inline-block;text-align:center;width:250px}.img-main-container{max-width:250px;width:250px!important;margin-right:10px}.visit-name{color:var(--smarterplan-primary);font-weight:600}.btn-details{background-color:var(--smarterplan-primary-transparent);position:absolute;color:#fff;bottom:0px;right:0px;width:100%;height:30%;border:none;font-size:1em;text-transform:lowercase}#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.refreshIcon{color:var(--smarterplan-primary);cursor:pointer}.refreshIcon svg{vertical-align:middle!important}.add-location{width:12vw}.sp-row{display:flex;flex-direction:row}\n"] }]
|
|
137
|
+
}], ctorParameters: function () { return [{ type: i1.SpaceService }, { type: i2.Router }, { type: i1.BaseUserService }, { type: i1.ViewerService }, { type: i1.NavigationService }, { type: i1.NavigatorService }]; } });
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9sb2NhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvbG9jYXRpb25zL2xvY2F0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBR2xELE9BQU8sRUFBRSxXQUFXLEVBQTRGLFdBQVcsRUFBbUIsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7OztBQVE3TCxNQUFNLE9BQU8sa0JBQWtCO0lBMkIzQixZQUNZLFlBQTBCLEVBQzFCLE1BQWMsRUFDZCxXQUE0QixFQUM1QixhQUE0QixFQUM1QixpQkFBb0MsRUFDcEMsZ0JBQWtDO1FBTGxDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBekI5QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLHNCQUFpQixHQUFZLEVBQUUsQ0FBQztRQUVoQyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWxCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXBCLGNBQVMsR0FBWSxFQUFFLENBQUM7UUFFeEIsY0FBUyxHQUFlLEVBQUUsQ0FBQztRQU0zQixrR0FBa0c7UUFDbEcseUJBQW9CLEdBQVksRUFBRSxDQUFD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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBMZXZlbFN0YXR1cywgU3BhY2UsIFNwYWNlU2VydmljZSwgQmFzZVVzZXJTZXJ2aWNlLCBWaWV3ZXJTZXJ2aWNlLCBOYXZpZ2F0aW9uU2VydmljZSwgTmF2aWdhdG9yU2VydmljZSwgZW51bVRvQXJyYXksIFZpc2l0LCBNZW51SXRlbSwgU2VhcmNoT2JqZWN0VHlwZSB9IGZyb20gJ25neC1zbWFydGVycGxhbi1jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItbG9jYXRpb25zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvY2F0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xvY2F0aW9ucy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIExvY2F0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBjcmVhdGVGb3JtOiBGb3JtR3JvdXA7XG5cbiAgICBsZXZlbHM6IEFycmF5PExldmVsU3RhdHVzPjtcblxuICAgIGltYWdlVG9VcGxvYWQ6IEZpbGU7XG5cbiAgICBpc0FkZGluZyA9IGZhbHNlO1xuXG4gICAgZmlsdGVyZWRMb2NhdGlvbnM6IFNwYWNlW10gPSBbXTtcblxuICAgIGlzTWFuYWdlciA9IGZhbHNlO1xuXG4gICAgaXNNdXNldW1Vc2VyID0gdHJ1ZTtcblxuICAgIGxvY2F0aW9uczogU3BhY2VbXSA9IFtdO1xuXG4gICAgbWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XG5cbiAgICB1c2VyU3ViY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIGxvY2F0aW9uSURTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIC8qKiBMYXN0IGZpbHRlcmVkIExvY2F0aW9ucywgdXNlZCB3aGVuIHdlIGdvIGJhY2sgb24gYWxsIGxvY2F0aW9ucyBmcm9tIHRoZSBzZWFyY2ggYmFyIGxvY2F0aW9uICovXG4gICAgbGFzdEZpbHRyZWRMb2NhdGlvbnM6IFNwYWNlW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHNwYWNlU2VydmljZTogU3BhY2VTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdmlld2VyU2VydmljZTogVmlld2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbmF2aWdhdG9yU2VydmljZTogTmF2aWdhdG9yU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5sZXZlbHMgPSBlbnVtVG9BcnJheShMZXZlbFN0YXR1cyk7XG4gICAgICAgIHRoaXMudXNlclN1YmNyaXB0aW9uID0gdGhpcy51c2VyU2VydmljZS5pc0NoYW5nZWQuc3Vic2NyaWJlKChpc0Nvbm5lY3RlZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubG9jYXRpb25JRFN1YnNjcmlwdGlvbiA9XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZS5zdWJzY3JpYmUoKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTZWxlY3RlZExvY2F0aW9uKGlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMudXNlclNlcnZpY2UuY3UpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJSaWdodHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XG4gICAgfVxuXG5cbiAgICBmaW5kU3BhY2VCeUlkKGlkOiBzdHJpbmcpOiBTcGFjZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9ucy5maW5kKChsb2MpID0+IGxvYy5pZCA9PT0gaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB3aGVuIHdlIGNoYW5nZSB0aGUgc2VsZWN0ZWQgbG9jYXRpb24gaW4gZmlsdGVyIChzZWFyY2ggYmFyKVxuICAgICAqIEBwYXJhbSBpZCBmb3IgYSBsb2NhdGlvbiwgaWYgbnVsbCBkaXNwbGF5IGFsbCBsYXN0IGZpbHRyZWQgbG9jYXRpb25cbiAgICAgKi9cbiAgICBjaGFuZ2VTZWxlY3RlZExvY2F0aW9uKGlkPzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gaWQgPyB0aGlzLmZpbmRTcGFjZUJ5SWQoaWQpIDogbnVsbDtcbiAgICAgICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IHNwYWNlID8gW3NwYWNlXSA6IHRoaXMubGFzdEZpbHRyZWRMb2NhdGlvbnM7IC8vIE5ldyBzZWxlY3RlZCBzcGFjZSBvciBsYXN0IGZpbHRlcmVkIGxvY2F0aW9uXG4gICAgfVxuXG4gICAgcmVmcmVzaCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVVc2VyUmlnaHRzKCk7XG4gICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XG4gICAgfVxuXG4gICBcbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy51c2VyU3ViY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5sb2NhdGlvbklEU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgc2V0dXBNZW51SXRlbXMoKSB7XG4gICAgICAgIHRoaXMubWVudUl0ZW1zID0gW3sgbGFiZWw6IFwiQWxsIExvY2F0aW9uc1wiLCB1cmw6IFwiL2xvY2FsaXNhdGlvblwiIH1dO1xuICAgICAgICBpZiAodGhpcy5pc0FkZGluZykge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMucHVzaCh7IGxhYmVsOiBcIk5ld1wiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkTG9jYXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRMb2MgPSB0aGlzLmZpbHRlcmVkTG9jYXRpb25zWzBdO1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMucHVzaCh7IGxhYmVsOiBzZWxlY3RlZExvYy5uYW1lIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlVXNlclJpZ2h0cygpIHtcbiAgICAgICAgdGhpcy5pc01hbmFnZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmhhc01hbmFnZXJSb2xlSW5BbnlNaXNzaW9uKCk7XG4gICAgICAgIHRoaXMuaXNNdXNldW1Vc2VyID0gdGhpcy51c2VyU2VydmljZS5oYXNPbmx5TXVzZXVtUm9sZSgpO1xuICAgIH1cblxuICAgIGlzTWFuYWdlckZvclNwYWNlKHNwYWNlSUQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy51c2VyU2VydmljZS5pc01hbmFnZXIoc3BhY2VJRCkgfHxcbiAgICAgICAgICAgIHRoaXMudXNlclNlcnZpY2UuaXNHdWlkZShzcGFjZUlEKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGFzeW5jIHJlc2V0TGlzdCgpIHtcbiAgICAgICAgdGhpcy5sb2NhdGlvbnMgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5nZXRMb2NhdGlvbnNGb3JDdXJyZW50VXNlcigpO1xuICAgICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnM7XG4gICAgICAgIHRoaXMubGFzdEZpbHRyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucztcbiAgICAgICAgdGhpcy5pc0FkZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYW5nZVNlbGVjdGVkTG9jYXRpb24oXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudE5hdkJhckxvY2F0aW9uSUQsXG4gICAgICAgICk7IC8vIFNldCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgbG9jYXRpb25cbiAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xuICAgIH1cblxuICAgIG9uQWRkTG9jYXRpb24oKSB7XG4gICAgICAgIHRoaXMuaXNBZGRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgaGFuZGxlSW1hZ2VJbnB1dChmaWxlczogRmlsZUxpc3QpIHtcbiAgICAgICAgdGhpcy5pbWFnZVRvVXBsb2FkID0gZmlsZXMuaXRlbSgwKTtcbiAgICB9XG5cbiAgICBvbkZvcm1DaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZS5uZXh0KFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgKTsgLyoqIFJlbW92ZSBzZWxlY3RlZCBsb2NhdGlvbiAqL1xuICAgICAgICB0aGlzLmlzQWRkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldExpc3QoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25WaXNpdENsaWNrKGxvYzogU3BhY2UsIHZpc2l0OiBWaXNpdCkge1xuICAgICAgICBpZiAoIXRoaXMudXNlclNlcnZpY2UudXNlckhhc0FjY2Vzc1RvQWxsWm9uZXNJblNwYWNlKGxvYy5pZCkpIHtcbiAgICAgICAgICAgIC8vIGdldCBhbGxvd2VkIHN3ZWVwIGZvciB0aGUgdXNlclxuICAgICAgICAgICAgY29uc3QgYWxsb3dlZFN3ZWVwcyA9XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXRBbGxvd2VkU3dlZXBzSURzRm9yVXNlckluU3BhY2UoXG4gICAgICAgICAgICAgICAgICAgIGxvYy5pZCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RTd2VlcCA9IGFsbG93ZWRTd2VlcHNbMF07XG4gICAgICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2Uuc2V0U3dlZXBUb01vdmUoZmlyc3RTd2VlcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXNlclNlcnZpY2UuaXNHdWlkZShsb2MuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJtdXNldW1cIiwgbG9jLmlkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJ2aXNpdFwiLCBsb2MuaWRdLCB7XG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgbW9kZWwzRDogdmlzaXQubW9kZWwzZCB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseVJlc3VsdHNTZWFyY2hCYXIocmVzdWx0czogU3BhY2VbXSkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gcmVzdWx0cyB8fCB0aGlzLmxvY2F0aW9ucztcbiAgICAgICAgdGhpcy5sYXN0RmlsdHJlZExvY2F0aW9ucyA9IHRoaXMuZmlsdGVyZWRMb2NhdGlvbnM7XG4gICAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5sb2NhdGlvbklEQ2hhbmdlLm5leHQobnVsbCk7IC8vIFdoZW4gd2Ugc2VhcmNoIHdpdGgga2V5d29yZCwgd2Ugd291bGQgbGlrZSB0byBzZWFyY2ggb24gYWxsIGxvY2F0aW9uc1xuICAgIH1cblxuICAgIGdldFNlYXJjaFR5cGUoKTogU2VhcmNoT2JqZWN0VHlwZSB7XG4gICAgICAgIHJldHVybiBTZWFyY2hPYmplY3RUeXBlLkxPQ0FUSU9OO1xuICAgIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cImRhc2hib2FyZC10YWJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWRhc2hib2FyZC10YWJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtLTNcIj5cbiAgICAgICAgPGxpYi10YWItbmF2aWdhdGlvbiAob25Hb0JhY2spPVwib25Gb3JtQ2hhbmdlKG51bGwpXCIgW21lbnVJdGVtc109J21lbnVJdGVtcyc+PC9saWItdGFiLW5hdmlnYXRpb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMyByZWZyZXNoSWNvblwiIChjbGljayk9XCJyZWZyZXNoKClcIiAqbmdJZj1cIiEoaXNBZGRpbmcpXCIgbmdiVG9vbHRpcD1cIlJlZnJlc2ggbGlzdFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbmlmeSByZWZyZXNoSWNvblwiIGRhdGEtaWNvbj1cImlvbjpyZWZyZXNoLWNpcmNsZVwiIGRhdGEtd2lkdGg9XCIzNVwiIGRhdGEtcm90YXRlPVwiOTBkZWdcIj48L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PiAgXG4gICAgICA8bGliLXNlYXJjaC1iYXIgKm5nSWY9XCIhaXNBZGRpbmcgJiYgIWlzTXVzZXVtVXNlclwiIFtzZWFyY2hhYmxlXT1cImxvY2F0aW9uc1wiIFtvYmplY3RUeXBlXT1cImdldFNlYXJjaFR5cGUoKVwiXG4gICAgICAgIChzZWFyY2hFdmVudCk9XCJhcHBseVJlc3VsdHNTZWFyY2hCYXIoJGV2ZW50KVwiPjwvbGliLXNlYXJjaC1iYXI+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Atcm93XCIgKm5nSWY9XCIhaXNBZGRpbmcgJiYgaXNNYW5hZ2VyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhZGQtbG9jYXRpb25cIiAoY2xpY2spPVwib25BZGRMb2NhdGlvbigpXCI+XG4gICAgICAgICAgICB7eydBZGQgbG9jYXRpb24nIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJvdXRlcl9jaXJjbGVcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9J2J0bi1pY29uJyAoY2xpY2spPVwib25BZGRMb2NhdGlvbigpXCI+PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxocj5cbiAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCJpc0FkZGluZ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgIDxoND57eydOZXcgbG9jYXRpb24nIHwgdHJhbnNsYXRlfX08L2g0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPHNlY3Rpb24gKm5nSWY9XCIhaXNBZGRpbmdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMiBjb2wtbWQtMTIgY29sLWxnLTZcIiAqbmdJZj1cImZpbHRlcmVkTG9jYXRpb25zXCI+XG4gICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbGlzdC1ncm91cC1pdGVtXCJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGxvYyBvZiBmaWx0ZXJlZExvY2F0aW9uczsgaW5kZXggYXMgaW5kZXhcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBpbWctbWFpbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJpbWdfY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJsb2NhdGlvbi1pbWdcIiAqbmdJZj1cImxvYy5hbm5leGVzOyBlbHNlIGVsc2VCbG9ja1wiIFtzcmNdPVwibG9jLmFubmV4ZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlQmxvY2s+PGltZyBjbGFzcz1cImxvY2F0aW9uLWltZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIuLy4uLy4uLy4uLy4uL2Fzc2V0cy9pbWFnZXMvdmlzdWVsLW9mZi1iaWcuanBnXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzTWFuYWdlckZvclNwYWNlKGxvYy5pZClcIiBjbGFzcz1cImJ0bi1kZXRhaWxzXCIgW3JvdXRlckxpbmtdPVwiW2xvYy5pZF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eydWaWV3IGRldGFpbHMnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTcgbG9jYXRpb24taW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPHA+e3tsb2MubmFtZX19PC9wPlxuICAgICAgICAgICAgICAgICAgPHA+e3tsb2MuYWRkcmVzc2VzfX08L3A+XG4gICAgICAgICAgICAgICAgICA8cCAqbmdGb3I9XCJsZXQgdmlzaXQgb2YgbG9jLnZpc2l0c1wiIChjbGljayk9XCJvblZpc2l0Q2xpY2sobG9jLCB2aXNpdClcIiBjbGFzcz1cInZpc2l0LW5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY3Vyc29yXT1cIidwb2ludGVyJ1wiIG5nYlRvb2x0aXA9XCJWaXNpdFwiPnt7IHZpc2l0Lm5hbWUgPyB2aXNpdC5uYW1lIDogbG9jLm5hbWV9fTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICBcbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMiBjb2wtbWQtMTIgY29sLWxnLTZcIj5cbiAgICAgICAgICA8bGliLW1hcCBbc3BhY2VzXT1cImZpbHRlcmVkTG9jYXRpb25zXCI+PC9saWItbWFwPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvc2VjdGlvbj5cbiAgICA8bGliLWZvcm0tbG9jYXRpb24gKm5nSWY9XCJpc0FkZGluZ1wiIChvbkNoYW5nZSk9XCJvbkZvcm1DaGFuZ2UoJGV2ZW50KVwiPjwvbGliLWZvcm0tbG9jYXRpb24+XG48L2Rpdj5cbiJdfQ==
|