@colijnit/homedecorator 255.1.4 → 255.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/app/core/enum/message-type.enum.d.ts +3 -1
  2. package/app/core/interface/message-with-payload.interface.d.ts +6 -0
  3. package/app/core/service/homedecorator-app-event.service.d.ts +1 -0
  4. package/app/core/service/homedecorator-connector-adapter.service.d.ts +2 -0
  5. package/app/core/service/homedecorator-connector.service.d.ts +5 -4
  6. package/app/core/service/presets.service.d.ts +3 -1
  7. package/app/homedecorator.component.d.ts +3 -1
  8. package/app/plugins/core3d/service/floor.service.d.ts +3 -1
  9. package/app/plugins/core3d/service/post-processing.service.d.ts +16 -4
  10. package/app/plugins/core3d/service/ssr.service.d.ts +0 -1
  11. package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +10 -2
  12. package/app/plugins/model-uploader/model-previewer/model-preview.component.scss +180 -15
  13. package/app/plugins/model-uploader/model-uploader.module.d.ts +5 -1
  14. package/app/plugins/render/render-dialog/render-dialog.component.d.ts +4 -1
  15. package/app/plugins/room-planner/components/floorplanner/floorplanner.component.d.ts +3 -1
  16. package/app/plugins/room-planner/components/floorplanner/service/room.service.d.ts +1 -0
  17. package/app/plugins/room-planner/components/texture-editor/texture-editor.component.d.ts +4 -1
  18. package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +0 -3
  19. package/app/plugins/toolbar/draw-dialog/draw-dialog.component.d.ts +2 -0
  20. package/app/plugins/toolbar/draw-dialog/draw-dialog.component.scss +1 -1
  21. package/app/plugins/toolbar/toolbar/toolbar.component.d.ts +2 -0
  22. package/assets/icons/dash-button.svg +7 -0
  23. package/assets/icons/pen-ruler.svg +1 -0
  24. package/assets/icons/retry-button.svg +7 -0
  25. package/bundles/colijnit-homedecorator.umd.js +514 -423
  26. package/bundles/colijnit-homedecorator.umd.js.map +1 -1
  27. package/esm2015/app/app.version.js +3 -3
  28. package/esm2015/app/core/enum/message-type.enum.js +3 -1
  29. package/esm2015/app/core/interface/message-with-payload.interface.js +1 -1
  30. package/esm2015/app/core/service/3dm-api.js +4 -4
  31. package/esm2015/app/core/service/homedecorator-app-event.service.js +2 -1
  32. package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +25 -2
  33. package/esm2015/app/core/service/homedecorator-connector.service.js +25 -22
  34. package/esm2015/app/core/service/presets.service.js +13 -5
  35. package/esm2015/app/core/utils/material.utils.js +3 -3
  36. package/esm2015/app/homedecorator.component.js +25 -19
  37. package/esm2015/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.js +2 -2
  38. package/esm2015/app/plugins/core3d/items/custom-cylinder-floor-item.js +2 -2
  39. package/esm2015/app/plugins/core3d/items/custom-cylinder-wall-item.js +2 -2
  40. package/esm2015/app/plugins/core3d/items/custom-shape-floor-item.js +2 -2
  41. package/esm2015/app/plugins/core3d/items/custom-shape-wall-item.js +2 -2
  42. package/esm2015/app/plugins/core3d/service/ar.service.js +2 -1
  43. package/esm2015/app/plugins/core3d/service/floor-tile-intersection.service.js +2 -2
  44. package/esm2015/app/plugins/core3d/service/floor.service.js +9 -4
  45. package/esm2015/app/plugins/core3d/service/post-processing.service.js +96 -35
  46. package/esm2015/app/plugins/core3d/service/scene.service.js +17 -11
  47. package/esm2015/app/plugins/core3d/service/ssr.service.js +1 -52
  48. package/esm2015/app/plugins/lite-selector/lite-selector/lite-selector.component.js +2 -2
  49. package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +264 -168
  50. package/esm2015/app/plugins/model-uploader/model-uploader.module.js +22 -3
  51. package/esm2015/app/plugins/render/render-dialog/render-dialog.component.js +19 -14
  52. package/esm2015/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.js +4 -2
  53. package/esm2015/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.js +2 -2
  54. package/esm2015/app/plugins/room-planner/components/floorplanner/floorplanner.component.js +24 -12
  55. package/esm2015/app/plugins/room-planner/components/floorplanner/service/room.service.js +5 -2
  56. package/esm2015/app/plugins/room-planner/components/texture-editor/texture-editor.component.js +31 -15
  57. package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +4 -15
  58. package/esm2015/app/plugins/toolbar/draw-dialog/draw-dialog.component.js +26 -20
  59. package/esm2015/app/plugins/toolbar/save-dialog/save-dialog.component.js +2 -2
  60. package/esm2015/app/plugins/toolbar/toolbar/toolbar.component.js +15 -8
  61. package/esm2015/app/shared/model-dialog/model-dialog-furniture-list.component.js +3 -3
  62. package/fesm2015/colijnit-homedecorator.js +682 -483
  63. package/fesm2015/colijnit-homedecorator.js.map +1 -1
  64. package/package.json +1 -1
@@ -23,6 +23,8 @@ import { ExternalSource } from '@colijnit/articleapi/build/model/external-source
23
23
  import { ArticleFullObject } from '@colijnit/articleapi/build/model/article-full-object';
24
24
  import { ArticleCategory } from '@colijnit/configuratorapi/build/model/article-category';
25
25
  import { ArticleFlat } from '@colijnit/articleapi/build/model/article-flat.bo';
26
+ import { CoDomainValue } from '@colijnit/mainapi/build/model/co-domain-value.bo';
27
+ import { DomainName } from '@colijnit/mainapi/build/enum/domain-name.enum';
26
28
  import { InternalParam } from '@colijnit/mainapi/build/enum/internal-param.enum';
27
29
  import { StringUtils } from '@colijnit/ioneconnector/build/utils/string-utils';
28
30
  import { ImageUtils as ImageUtils$2 } from '@colijnit/configuratorapi/build/utils/image-utils';
@@ -31,7 +33,7 @@ import { HttpHeaders } from '@angular/common/http';
31
33
  import axios from 'axios';
32
34
  import * as applyPatch from 'textdiff-patch';
33
35
  import * as THREE from 'three';
34
- import { Vector2, Material as Material$1, Object3D, Mesh, Vector3, Scene, EventDispatcher, PerspectiveCamera, Box3, PlaneGeometry, MeshBasicMaterial, DoubleSide, MeshStandardMaterial, CylinderGeometry, RingGeometry, Matrix4, Raycaster, PointLight, Euler, BoxGeometry, WebGLRenderTarget, NearestFilter, RGBAFormat, SRGBColorSpace, AxesHelper, Group, BufferGeometry, Line, DataTexture, LuminanceAlphaFormat, UnsignedByteType, LinearFilter, Shape, SphereGeometry, PCFSoftShadowMap, ShadowMaterial, LightProbe, Texture as Texture$1, DirectionalLight, MeshPhongMaterial, DepthTexture, UnsignedIntType, DepthFormat, Color, OrthographicCamera, WebGLRenderer, NoToneMapping, TextureLoader, EllipseCurve, ArcCurve, BufferAttribute, MeshPhysicalMaterial, Quaternion, Path, ShapeGeometry, BasicShadowMap, PCFShadowMap, VSMShadowMap, LinearSRGBColorSpace, Float32BufferAttribute, LineBasicMaterial, EquirectangularReflectionMapping, FrontSide, AdditiveBlending, LineSegments, EdgesGeometry, CircleGeometry, MathUtils, ObjectLoader, Light, Camera as Camera$1, RepeatWrapping, InstancedMesh, UVMapping, CubeReflectionMapping, CubeRefractionMapping, EquirectangularRefractionMapping, CubeUVReflectionMapping, NearestMipmapNearestFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipMapLinearFilter, LinearMipmapNearestFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipMapLinearFilter, AlphaFormat, LuminanceFormat, DepthStencilFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBAIntegerFormat, ByteType, ShortType, UnsignedShortType, IntType, FloatType, HalfFloatType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt248Type, ClampToEdgeWrapping, MirroredRepeatWrapping, ZeroFactor, OneFactor, SrcColorFactor, OneMinusSrcColorFactor, SrcAlphaFactor, OneMinusSrcAlphaFactor, DstAlphaFactor, OneMinusDstAlphaFactor, DstColorFactor, OneMinusDstColorFactor, AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation, NoBlending, NormalBlending, SubtractiveBlending, MultiplyBlending, CustomBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, BackSide, ZeroStencilOp, KeepStencilOp, ReplaceStencilOp, IncrementStencilOp, DecrementStencilOp, IncrementWrapStencilOp, DecrementWrapStencilOp, InvertStencilOp, NeverStencilFunc, LessStencilFunc, EqualStencilFunc, LessEqualStencilFunc, GreaterStencilFunc, NotEqualStencilFunc, GreaterEqualStencilFunc, AlwaysStencilFunc, Source, SpotLight, AmbientLight, HemisphereLight, SpotLightHelper, DirectionalLightHelper, HemisphereLightHelper, PointLightHelper, CanvasTexture, Clock, AnimationMixer, AnimationClip, NoColorSpace, ArrowHelper, GridHelper, PMREMGenerator, BoxHelper } from 'three';
36
+ import { Vector2, Material as Material$1, Object3D, Mesh, Vector3, Scene, EventDispatcher, PerspectiveCamera, Box3, PlaneGeometry, MeshBasicMaterial, DoubleSide, MeshStandardMaterial, CylinderGeometry, RingGeometry, Matrix4, Raycaster, PointLight, Euler, BoxGeometry, WebGLRenderTarget, NearestFilter, RGBAFormat, SRGBColorSpace, AxesHelper, Group, BufferGeometry, Line, DataTexture, LuminanceAlphaFormat, UnsignedByteType, LinearFilter, Shape, SphereGeometry, PCFSoftShadowMap, ShadowMaterial, LightProbe, Texture as Texture$1, DirectionalLight, MeshPhongMaterial, HalfFloatType, Color, OrthographicCamera, WebGLRenderer, NoToneMapping, TextureLoader, EllipseCurve, ArcCurve, BufferAttribute, MeshPhysicalMaterial, Quaternion, Path, ShapeGeometry, BasicShadowMap, PCFShadowMap, VSMShadowMap, LinearSRGBColorSpace, Float32BufferAttribute, LineBasicMaterial, EquirectangularReflectionMapping, FrontSide, AdditiveBlending, LineSegments, EdgesGeometry, CircleGeometry, MathUtils, ObjectLoader, Light, Camera as Camera$1, RepeatWrapping, InstancedMesh, UVMapping, CubeReflectionMapping, CubeRefractionMapping, EquirectangularRefractionMapping, CubeUVReflectionMapping, NearestMipmapNearestFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipMapLinearFilter, LinearMipmapNearestFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipMapLinearFilter, AlphaFormat, LuminanceFormat, DepthFormat, DepthStencilFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBAIntegerFormat, ByteType, ShortType, UnsignedShortType, IntType, UnsignedIntType, FloatType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt248Type, ClampToEdgeWrapping, MirroredRepeatWrapping, ZeroFactor, OneFactor, SrcColorFactor, OneMinusSrcColorFactor, SrcAlphaFactor, OneMinusSrcAlphaFactor, DstAlphaFactor, OneMinusDstAlphaFactor, DstColorFactor, OneMinusDstColorFactor, AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation, NoBlending, NormalBlending, SubtractiveBlending, MultiplyBlending, CustomBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, BackSide, ZeroStencilOp, KeepStencilOp, ReplaceStencilOp, IncrementStencilOp, DecrementStencilOp, IncrementWrapStencilOp, DecrementWrapStencilOp, InvertStencilOp, NeverStencilFunc, LessStencilFunc, EqualStencilFunc, LessEqualStencilFunc, GreaterStencilFunc, NotEqualStencilFunc, GreaterEqualStencilFunc, AlwaysStencilFunc, Source, SpotLight, AmbientLight, HemisphereLight, SpotLightHelper, DirectionalLightHelper, HemisphereLightHelper, PointLightHelper, CanvasTexture, Clock, AnimationMixer, AnimationClip, NoColorSpace, ArrowHelper, GridHelper, PMREMGenerator, BoxHelper } from 'three';
35
37
  import * as TWEEN from '@tweenjs/tween.js';
36
38
  import * as PolygonTools from 'polygon-tools';
37
39
  import { WebGLPathTracer } from 'three-gpu-pathtracer';
@@ -46,10 +48,9 @@ import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass';
46
48
  import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass';
47
49
  import { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader';
48
50
  import { OutputPass } from 'three/examples/jsm/postprocessing/OutputPass';
49
- import * as md5 from 'md5';
50
51
  import GUI from 'three/examples/jsm/libs/lil-gui.module.min';
51
52
  import { N8AOPass } from 'n8ao';
52
- import { TAARenderPass } from 'three/examples/jsm/postprocessing/TAARenderPass';
53
+ import { BlendShader } from 'three/examples/jsm/shaders/BlendShader';
53
54
  import * as i1 from '@angular/platform-browser';
54
55
  import * as i2$1 from 'ngx-device-detector';
55
56
  import * as i5$1 from '@angular/material/icon';
@@ -92,7 +93,7 @@ import * as i4 from '@colijnit/corecomponents';
92
93
  import { IconModule, CardModule, SlideoutModule, SummaryLineModule, PriceDisplayPipeModule, ButtonModule, HtmlHeaderModule, InputTextModule, InputTextChipsModule } from '@colijnit/corecomponents';
93
94
  import * as i7 from '@angular/material/form-field';
94
95
  import { MatFormFieldModule } from '@angular/material/form-field';
95
- import * as i9 from '@angular/material/select';
96
+ import * as i12 from '@angular/material/select';
96
97
  import { MatSelectModule } from '@angular/material/select';
97
98
  import * as i10 from '@angular/material/tooltip';
98
99
  import { MatTooltipModule } from '@angular/material/tooltip';
@@ -106,14 +107,14 @@ import * as dat from 'dat.gui';
106
107
  import { Service, Command } from '@migenius/realityserver-client';
107
108
  import * as i3$2 from '@angular/material/grid-list';
108
109
  import { MatGridListModule } from '@angular/material/grid-list';
109
- import * as i15 from '@angular/material/progress-spinner';
110
+ import * as i16 from '@angular/material/progress-spinner';
110
111
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
111
112
  import * as i3$3 from '@angular/flex-layout/flex';
112
113
  import * as i2$3 from '@angular/material/progress-bar';
113
114
  import { MatProgressBarModule } from '@angular/material/progress-bar';
114
115
  import { DecalGeometry } from 'three/examples/jsm/geometries/DecalGeometry';
115
116
  import { fabric } from 'fabric';
116
- import * as i7$2 from '@angular/material/button-toggle';
117
+ import * as i8$1 from '@angular/material/button-toggle';
117
118
  import { MatButtonToggleModule } from '@angular/material/button-toggle';
118
119
  import * as i2$4 from '@angular/material/snack-bar';
119
120
  import { MatSnackBarModule } from '@angular/material/snack-bar';
@@ -140,8 +141,6 @@ import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
140
141
  import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader';
141
142
  import { TDSLoader } from 'three/examples/jsm/loaders/TDSLoader';
142
143
  import { STLLoader } from 'three/examples/jsm/loaders/STLLoader';
143
- import * as i9$1 from '@angular/material/radio';
144
- import { MatRadioModule } from '@angular/material/radio';
145
144
  import * as i19$1 from '@angular/material/toolbar';
146
145
  import { MatToolbarModule } from '@angular/material/toolbar';
147
146
  import * as i22 from '@angular/material/menu';
@@ -153,7 +152,7 @@ import { MatSidenavModule } from '@angular/material/sidenav';
153
152
  import * as i30 from '@angular/material/badge';
154
153
  import { MatBadgeModule } from '@angular/material/badge';
155
154
  import { ExternalCatalogStartupInfoRequest } from '@colijnit/articleapi/build/model/external-catalog-startup-info-request';
156
- import * as i7$3 from '@colijnit/catalog';
155
+ import * as i7$2 from '@colijnit/catalog';
157
156
  import { CatalogSearchModule, CatalogExternalSourcesModule, CatalogExternalSourceModule } from '@colijnit/catalog';
158
157
  import * as i1$5 from 'ngx-lightbox';
159
158
  import { FlexLayoutModule } from '@angular/flex-layout';
@@ -161,6 +160,7 @@ import * as i10$2 from '@angular/cdk/drag-drop';
161
160
  import { DragDropModule } from '@angular/cdk/drag-drop';
162
161
  import { jsPDF } from 'jspdf';
163
162
  import autoTable from 'jspdf-autotable';
163
+ import { MatRadioModule } from '@angular/material/radio';
164
164
 
165
165
  var MessageType;
166
166
  (function (MessageType) {
@@ -231,6 +231,8 @@ var MessageType;
231
231
  MessageType["StartCroppingPDF"] = "StartCroppingPDF";
232
232
  MessageType["BlenderRenderFileReady"] = "BlenderRenderFileReady";
233
233
  MessageType["UserModelUploaded"] = "UserModelUploaded";
234
+ MessageType["ChangeTexture"] = "ChangeTexture";
235
+ MessageType["RenderError"] = "RenderError";
234
236
  })(MessageType || (MessageType = {}));
235
237
 
236
238
  class Preset {
@@ -333,6 +335,7 @@ class HomedecoratorAppEventService {
333
335
  this.objectMovingOrRotating = new Subject();
334
336
  this.addToCart = new Subject();
335
337
  this.addExternalSourceToCart = new Subject();
338
+ this.dirty = new Subject();
336
339
  }
337
340
  }
338
341
  HomedecoratorAppEventService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: HomedecoratorAppEventService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -344,7 +347,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
344
347
  }]
345
348
  }] });
346
349
 
347
- var __awaiter$1n = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
350
+ var __awaiter$1m = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
348
351
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
349
352
  return new (P || (P = Promise))(function (resolve, reject) {
350
353
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -395,7 +398,7 @@ class HomedecoratorConnectorAdapterService {
395
398
  }
396
399
  }
397
400
  initConnector(options, externalSource, forceReload, externalSourceId) {
398
- return __awaiter$1n(this, void 0, void 0, function* () {
401
+ return __awaiter$1m(this, void 0, void 0, function* () {
399
402
  if (externalSource === undefined || externalSource === null) {
400
403
  const renewConnector = (this._connector ? this._connector.url !== options.url : false) || forceReload;
401
404
  if (!this._connector || renewConnector) {
@@ -415,6 +418,8 @@ class HomedecoratorConnectorAdapterService {
415
418
  else {
416
419
  if (!this.connectors.hasOwnProperty(externalSource)) {
417
420
  if (externalSourceId !== null) {
421
+ // make sure to set this.externalSource = undefined to get the data of the HOST and not the previous external source
422
+ this.externalSource = undefined;
418
423
  const externalSourceData = yield this.getExternalSource(externalSourceId);
419
424
  if (externalSourceData !== null) {
420
425
  if (externalSourceData.password !== undefined && externalSourceData.username !== undefined) {
@@ -453,7 +458,7 @@ class HomedecoratorConnectorAdapterService {
453
458
  });
454
459
  }
455
460
  logOut() {
456
- return __awaiter$1n(this, void 0, void 0, function* () {
461
+ return __awaiter$1m(this, void 0, void 0, function* () {
457
462
  yield this.connector.logOut();
458
463
  });
459
464
  }
@@ -481,7 +486,7 @@ class HomedecoratorConnectorAdapterService {
481
486
  return 2;
482
487
  }
483
488
  getWebViewStartupInfo(request) {
484
- return __awaiter$1n(this, void 0, void 0, function* () {
489
+ return __awaiter$1m(this, void 0, void 0, function* () {
485
490
  // @ts-ignore
486
491
  const response = yield this.articleApi.getWebviewStartupInfo(request);
487
492
  if (response && response.validationResult && response.validationResult.success) {
@@ -493,7 +498,7 @@ class HomedecoratorConnectorAdapterService {
493
498
  });
494
499
  }
495
500
  getGoodIdFromArticleNr(sku) {
496
- return __awaiter$1n(this, void 0, void 0, function* () {
501
+ return __awaiter$1m(this, void 0, void 0, function* () {
497
502
  const response = yield this.articleApi.getGoodIdFromArticleNr(sku);
498
503
  if (response && response.validationResult && response.validationResult.success) {
499
504
  return response.resultObject;
@@ -513,7 +518,7 @@ class HomedecoratorConnectorAdapterService {
513
518
  return this.connector.copyInstance(instanceId, shouldSaveCurrentInstanceId);
514
519
  }
515
520
  saveConfigurations() {
516
- return __awaiter$1n(this, void 0, void 0, function* () {
521
+ return __awaiter$1m(this, void 0, void 0, function* () {
517
522
  yield this.connector.saveConfigurations().catch((e) => {
518
523
  return false;
519
524
  });
@@ -531,7 +536,7 @@ class HomedecoratorConnectorAdapterService {
531
536
  }
532
537
  // @returns The initial article
533
538
  getArticle(sku, branch) {
534
- return __awaiter$1n(this, void 0, void 0, function* () {
539
+ return __awaiter$1m(this, void 0, void 0, function* () {
535
540
  const goodId = yield this.getGoodIdFromArticleNr(sku);
536
541
  if (goodId) {
537
542
  return this.getArticleQuickSel(goodId, branch);
@@ -540,7 +545,7 @@ class HomedecoratorConnectorAdapterService {
540
545
  });
541
546
  }
542
547
  getArticleQuickSel(goodId, branch) {
543
- return __awaiter$1n(this, void 0, void 0, function* () {
548
+ return __awaiter$1m(this, void 0, void 0, function* () {
544
549
  const response = yield this.articleApi.getArticleQuickSel(goodId, branch);
545
550
  if (response && response.validationResult && response.validationResult.success) {
546
551
  return this._boFactory.makeWithRawBackendData(Article, response.resultObject.oArticle[0]);
@@ -558,7 +563,7 @@ class HomedecoratorConnectorAdapterService {
558
563
  return this.connector.getQuestionAndAnswers();
559
564
  }
560
565
  getSelectionsAsync() {
561
- return __awaiter$1n(this, void 0, void 0, function* () {
566
+ return __awaiter$1m(this, void 0, void 0, function* () {
562
567
  const response = yield this.connector.getSelections();
563
568
  if (response && response.validationResult && response.validationResult.success) {
564
569
  return this._boFactory.makeBOArrayFromRawBackendDataArray(Selection, response.resultObjects);
@@ -567,7 +572,7 @@ class HomedecoratorConnectorAdapterService {
567
572
  });
568
573
  }
569
574
  getDecosAsync() {
570
- return __awaiter$1n(this, void 0, void 0, function* () {
575
+ return __awaiter$1m(this, void 0, void 0, function* () {
571
576
  const response = yield this.connector.getDecos();
572
577
  if (response && response.validationResult && response.validationResult.success) {
573
578
  return this._boFactory.makeBOArrayFromRawBackendDataArray(DecoNode, response.resultObjects);
@@ -576,7 +581,7 @@ class HomedecoratorConnectorAdapterService {
576
581
  });
577
582
  }
578
583
  getAnswerPrices() {
579
- return __awaiter$1n(this, void 0, void 0, function* () {
584
+ return __awaiter$1m(this, void 0, void 0, function* () {
580
585
  const response = yield this.connector.getAnswersPrices();
581
586
  if (response && response.validationResult && response.validationResult.success) {
582
587
  return this._boFactory.makeBOArrayFromRawBackendDataArray(AnswerPrice, response.resultObjects);
@@ -585,13 +590,14 @@ class HomedecoratorConnectorAdapterService {
585
590
  });
586
591
  }
587
592
  getJsonConfiguredArticles(goodId, goodType, quantity, externalSource = false, showLoader = true, instanceId, configuratorStatistics) {
588
- return this.articleApi.getJsonArticleFlatTree(goodId, goodType, quantity, externalSource, showLoader, instanceId, configuratorStatistics);
593
+ // @ts-ignore
594
+ return this.articleApi.getJsonArticleFlatTree(goodId, goodType, quantity, externalSource, showLoader, instanceId.toString(), configuratorStatistics);
589
595
  }
590
596
  // public getJsonMatchTableArticles(): Promise<void> {
591
597
  // return this.connector.getJsonMatchTableArticles();
592
598
  // }
593
599
  setInstanceToConfigure(id) {
594
- return __awaiter$1n(this, void 0, void 0, function* () {
600
+ return __awaiter$1m(this, void 0, void 0, function* () {
595
601
  if (id !== null) {
596
602
  return this.connector.setInstanceToConfigure(id);
597
603
  }
@@ -601,7 +607,7 @@ class HomedecoratorConnectorAdapterService {
601
607
  });
602
608
  }
603
609
  selectAnswer(answer, userInput) {
604
- return __awaiter$1n(this, void 0, void 0, function* () {
610
+ return __awaiter$1m(this, void 0, void 0, function* () {
605
611
  return this.connector.selectAnswer(answer, false, userInput);
606
612
  });
607
613
  }
@@ -618,7 +624,7 @@ class HomedecoratorConnectorAdapterService {
618
624
  return this.connector.replaceSelection(selection);
619
625
  }
620
626
  getImageForAnswerOrSelection(answerOrSelection, publication, thumbNail = true, showLoader = true) {
621
- return __awaiter$1n(this, void 0, void 0, function* () {
627
+ return __awaiter$1m(this, void 0, void 0, function* () {
622
628
  const response = yield this.articleApi.getSingleImage(answerOrSelection.nodeId, publication, true, thumbNail);
623
629
  if (response && response.validationResult && response.validationResult.success && response.resultObject) {
624
630
  if (response.resultObject.filePath !== null && response.resultObject.filePath !== undefined && response.resultObject.filePath !== '') {
@@ -634,7 +640,7 @@ class HomedecoratorConnectorAdapterService {
634
640
  });
635
641
  }
636
642
  getSkipButtonImageAndText(goodId) {
637
- return __awaiter$1n(this, void 0, void 0, function* () {
643
+ return __awaiter$1m(this, void 0, void 0, function* () {
638
644
  const response = yield this.connector.getSkipButtonImageAndText(goodId, false);
639
645
  if (response && response.validationResult && response.validationResult.success) {
640
646
  return this._boFactory.makeWithRawBackendData(SkipButtonInfo, response.resultObject);
@@ -646,7 +652,7 @@ class HomedecoratorConnectorAdapterService {
646
652
  return this.getImageForAnswerOrSelection(answerOrSelection, 32);
647
653
  }
648
654
  getAnswerInfo(answer) {
649
- return __awaiter$1n(this, void 0, void 0, function* () {
655
+ return __awaiter$1m(this, void 0, void 0, function* () {
650
656
  const response = yield this.connector.getAnswerTexts(answer.nodeId, false);
651
657
  if (response && response.validationResult && response.validationResult.success) {
652
658
  return this._boFactory.makeBOArrayFromRawBackendDataArray(ArticleText, response.resultObject);
@@ -655,7 +661,7 @@ class HomedecoratorConnectorAdapterService {
655
661
  });
656
662
  }
657
663
  getInternalParameter(parameter) {
658
- return __awaiter$1n(this, void 0, void 0, function* () {
664
+ return __awaiter$1m(this, void 0, void 0, function* () {
659
665
  const response = yield this.mainApi.getInternalParameterValue(parameter);
660
666
  if (response && response.validationResult && response.validationResult.success) {
661
667
  return response.resultObject;
@@ -666,18 +672,24 @@ class HomedecoratorConnectorAdapterService {
666
672
  });
667
673
  }
668
674
  store3DModelCDN(filename, fileContents) {
669
- return __awaiter$1n(this, void 0, void 0, function* () {
675
+ return __awaiter$1m(this, void 0, void 0, function* () {
670
676
  const response = yield this.mainApi.uploadModelToCDN(filename, fileContents);
671
677
  if (response && response.validationResult && response.validationResult.success) {
672
678
  return response.resultObject;
673
679
  }
680
+ else if (!response.validationResult.success) {
681
+ return Promise.reject(response.validationResult.messages[0].message);
682
+ }
674
683
  else {
675
684
  return '';
676
685
  }
677
686
  });
678
687
  }
679
688
  getCatalogDefinitionsList() {
680
- return __awaiter$1n(this, void 0, void 0, function* () {
689
+ return __awaiter$1m(this, void 0, void 0, function* () {
690
+ if (!this.articleApi) {
691
+ return;
692
+ }
681
693
  const response = yield this.articleApi.getCatalogDefinitions().catch(e => {
682
694
  return new DataServiceResponseData();
683
695
  });
@@ -690,7 +702,7 @@ class HomedecoratorConnectorAdapterService {
690
702
  });
691
703
  }
692
704
  getExternalSource(externalSourceId) {
693
- return __awaiter$1n(this, void 0, void 0, function* () {
705
+ return __awaiter$1m(this, void 0, void 0, function* () {
694
706
  if (!externalSourceId) {
695
707
  return null;
696
708
  }
@@ -709,7 +721,7 @@ class HomedecoratorConnectorAdapterService {
709
721
  });
710
722
  }
711
723
  getArticleFullObject(goodId) {
712
- return __awaiter$1n(this, void 0, void 0, function* () {
724
+ return __awaiter$1m(this, void 0, void 0, function* () {
713
725
  const result = yield this.articleApi.getArticleFullObject(goodId);
714
726
  if (result.validationResult && result.validationResult.success) {
715
727
  return this._boFactory.makeWithRawBackendData(ArticleFullObject, result.resultObject);
@@ -720,7 +732,7 @@ class HomedecoratorConnectorAdapterService {
720
732
  });
721
733
  }
722
734
  getArticleCategories(publicationCode) {
723
- return __awaiter$1n(this, void 0, void 0, function* () {
735
+ return __awaiter$1m(this, void 0, void 0, function* () {
724
736
  const result = yield this.articleApi.getArticleCategories(publicationCode);
725
737
  if (result.validationResult && result.validationResult.success) {
726
738
  return this._boFactory.makeBOArrayFromRawBackendDataArray(ArticleCategory, result.resultObjects);
@@ -732,7 +744,7 @@ class HomedecoratorConnectorAdapterService {
732
744
  }
733
745
  //
734
746
  getArticleFlat(sku) {
735
- return __awaiter$1n(this, void 0, void 0, function* () {
747
+ return __awaiter$1m(this, void 0, void 0, function* () {
736
748
  const result = yield this.articleApi.getArticleFlat(sku);
737
749
  if (result.validationResult && result.validationResult.success) {
738
750
  return this._boFactory.makeWithRawBackendData(ArticleFlat, result.resultObject);
@@ -742,6 +754,18 @@ class HomedecoratorConnectorAdapterService {
742
754
  }
743
755
  });
744
756
  }
757
+ getModelPlacementOptions() {
758
+ return __awaiter$1m(this, void 0, void 0, function* () {
759
+ // DOM_3D_PLACEMENT
760
+ const result = yield this.mainApi.getDomainCollection('NL', DomainName.Dom3DPlacement);
761
+ if (result.validationResult && result.validationResult.success) {
762
+ return this._boFactory.makeBOArrayFromRawBackendDataArray(CoDomainValue, result.resultObjects);
763
+ }
764
+ else {
765
+ console.error(result.validationMessagesAsString);
766
+ }
767
+ });
768
+ }
745
769
  // public async addToCart(goodId: number, goodType: GoodType, instanceId: number, sessionId: string, quantity: number = 1): Promise<void> {
746
770
  // const json: string = await this._getJSONFromArticleObject(goodId, goodType, instanceId, sessionId, quantity);
747
771
  // this._appEventService.addToCart.next({article: json, quantity: 1});
@@ -773,7 +797,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
773
797
  }]
774
798
  }], ctorParameters: function () { return [{ type: HomedecoratorAppEventService }]; } });
775
799
 
776
- var __awaiter$1m = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
800
+ var __awaiter$1l = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
777
801
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
778
802
  return new (P || (P = Promise))(function (resolve, reject) {
779
803
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -784,8 +808,8 @@ var __awaiter$1m = (this && this.__awaiter) || function (thisArg, _arguments, P,
784
808
  };
785
809
  class JsonUtilsService {
786
810
  readJsonFile(filePath, includeBaseUrl = true) {
787
- return __awaiter$1m(this, void 0, void 0, function* () {
788
- return new Promise((resolve, reject) => __awaiter$1m(this, void 0, void 0, function* () {
811
+ return __awaiter$1l(this, void 0, void 0, function* () {
812
+ return new Promise((resolve, reject) => __awaiter$1l(this, void 0, void 0, function* () {
789
813
  try {
790
814
  filePath = includeBaseUrl ? this._includeBaseUrl(filePath) : filePath;
791
815
  const response = yield fetch(filePath);
@@ -951,7 +975,7 @@ function isEmpty(value) {
951
975
  return value === null || value === undefined || value === '';
952
976
  }
953
977
 
954
- var __awaiter$1l = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
978
+ var __awaiter$1k = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
955
979
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
956
980
  return new (P || (P = Promise))(function (resolve, reject) {
957
981
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -982,7 +1006,7 @@ class HomedecoratorDictionaryService {
982
1006
  return text ? text : key;
983
1007
  }
984
1008
  setDictionary(path, client, languageCode, additionalTranslationFile) {
985
- return __awaiter$1l(this, void 0, void 0, function* () {
1009
+ return __awaiter$1k(this, void 0, void 0, function* () {
986
1010
  this._language = languageCode ? languageCode : this._language;
987
1011
  let dictionaryData;
988
1012
  if (additionalTranslationFile) {
@@ -1003,7 +1027,7 @@ class HomedecoratorDictionaryService {
1003
1027
  });
1004
1028
  }
1005
1029
  _getDictionaryData(path) {
1006
- return __awaiter$1l(this, void 0, void 0, function* () {
1030
+ return __awaiter$1k(this, void 0, void 0, function* () {
1007
1031
  return yield this._jsonUtilsService.readJsonFile(path, false)
1008
1032
  .catch(() => {
1009
1033
  return null;
@@ -1020,7 +1044,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
1020
1044
  }]
1021
1045
  }], ctorParameters: function () { return [{ type: JsonUtilsService }]; } });
1022
1046
 
1023
- var __awaiter$1k = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
1047
+ var __awaiter$1j = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
1024
1048
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1025
1049
  return new (P || (P = Promise))(function (resolve, reject) {
1026
1050
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -1088,7 +1112,7 @@ class HomedecoratorSettingsService {
1088
1112
  }
1089
1113
  }
1090
1114
  initializeSettings() {
1091
- return __awaiter$1k(this, void 0, void 0, function* () {
1115
+ return __awaiter$1j(this, void 0, void 0, function* () {
1092
1116
  if (environment.useSettings) {
1093
1117
  // see if there's a json file for application settings
1094
1118
  const jsonSettings = yield this._jsonUtilsService.readJsonFile('./settings/ione-connector.json', true);
@@ -1101,7 +1125,7 @@ class HomedecoratorSettingsService {
1101
1125
  });
1102
1126
  }
1103
1127
  initialize(settings) {
1104
- return __awaiter$1k(this, void 0, void 0, function* () {
1128
+ return __awaiter$1j(this, void 0, void 0, function* () {
1105
1129
  if (settings) {
1106
1130
  yield this.createSettingsFromObject(settings);
1107
1131
  }
@@ -1134,7 +1158,7 @@ class HomedecoratorSettingsService {
1134
1158
  });
1135
1159
  }
1136
1160
  _checkUrlParameters() {
1137
- return __awaiter$1k(this, void 0, void 0, function* () {
1161
+ return __awaiter$1j(this, void 0, void 0, function* () {
1138
1162
  const urlParams = new URLSearchParams(window.location.search);
1139
1163
  const client = urlParams.get('client');
1140
1164
  if (client) {
@@ -1155,7 +1179,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
1155
1179
  }]
1156
1180
  }], ctorParameters: function () { return [{ type: JsonUtilsService }, { type: HomedecoratorDictionaryService }, { type: HomedecoratorConnectorAdapterService }]; } });
1157
1181
 
1158
- var __awaiter$1j = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
1182
+ var __awaiter$1i = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
1159
1183
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1160
1184
  return new (P || (P = Promise))(function (resolve, reject) {
1161
1185
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -1181,7 +1205,7 @@ class SkipButtonInfoService {
1181
1205
  this._imageBody = value;
1182
1206
  }
1183
1207
  getSkipButtonImageAndText(goodId) {
1184
- return __awaiter$1j(this, void 0, void 0, function* () {
1208
+ return __awaiter$1i(this, void 0, void 0, function* () {
1185
1209
  if (!this.text || !this.imageBody) {
1186
1210
  const skipButtonInfo = yield this._connector.getSkipButtonImageAndText(goodId);
1187
1211
  this.text = skipButtonInfo.oText;
@@ -1249,7 +1273,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
1249
1273
  }]
1250
1274
  }] });
1251
1275
 
1252
- var __awaiter$1i = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
1276
+ var __awaiter$1h = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
1253
1277
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1254
1278
  return new (P || (P = Promise))(function (resolve, reject) {
1255
1279
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -1334,7 +1358,7 @@ class PermanentStoreService {
1334
1358
  this._registerFormID = value;
1335
1359
  }
1336
1360
  updateRegisterForm(furniture) {
1337
- return __awaiter$1i(this, void 0, void 0, function* () {
1361
+ return __awaiter$1h(this, void 0, void 0, function* () {
1338
1362
  const collectiveSheetKey = '13V6FBPWbICfjonrtAEReucHkE61ijWRmau806u5EGZs';
1339
1363
  const collectiveSheetScriptURL = 'https://script.google.com/macros/s/AKfycbwtgNNj0PjBPdNiiYgKtYAAUVFu1GwKzMkwMFnEDm7Va-QiYdc/exec';
1340
1364
  const customSheetScriptURL = 'https://script.google.com/macros/s/AKfycby-iJ_RdsdeCZ3TJN_qEMiv_DGhetyFMFIeNJGqvi-jQmDA2NBuSWFI-wmF-NtNQDLL/exec';
@@ -1458,7 +1482,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
1458
1482
  }]
1459
1483
  }], ctorParameters: function () { return [{ type: HomedecoratorSettingsService }, { type: PermanentStoreService }]; } });
1460
1484
 
1461
- var __awaiter$1h = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
1485
+ var __awaiter$1g = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
1462
1486
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1463
1487
  return new (P || (P = Promise))(function (resolve, reject) {
1464
1488
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -1481,7 +1505,6 @@ class HomedecoratorConnectorService {
1481
1505
  this.articleReceived = new Subject();
1482
1506
  this.selectionsReceived = new Subject();
1483
1507
  // public readonly decoNodesReceived: Subject<DecoNode[]> = new Subject<DecoNode[]>();
1484
- this.answerCountReceived = new Subject();
1485
1508
  this.answersReceived = new Subject();
1486
1509
  this.extraAnswerDataLoaded = new Subject();
1487
1510
  // public readonly moodImagesReceived: Subject<{ answerOrSelection: Answer | Selection, imageData: string }> =
@@ -1489,12 +1512,11 @@ class HomedecoratorConnectorService {
1489
1512
  this.selectionsAndDecosLinked = new Subject();
1490
1513
  this.connectionReset = new Subject();
1491
1514
  this.selectionsToDisplay = [];
1515
+ this.activeAnswers = [];
1492
1516
  this._hideLoaderTimerTimeout = 500;
1493
1517
  this._selections = [];
1494
1518
  this._currentSelections = [];
1495
1519
  this._decoNodes = [];
1496
- // private _activeQuestion: Question;
1497
- this._activeAnswers = [];
1498
1520
  this._articlePrice = 0;
1499
1521
  this._connectorOptions = new Options();
1500
1522
  this._subs = [];
@@ -1524,12 +1546,6 @@ class HomedecoratorConnectorService {
1524
1546
  get currentSelections() {
1525
1547
  return this._currentSelections;
1526
1548
  }
1527
- // public get activeQuestion(): Question {
1528
- // return this._activeQuestion;
1529
- // }
1530
- get activeAnswers() {
1531
- return this._activeAnswers;
1532
- }
1533
1549
  get activeSelection() {
1534
1550
  return this._activeSelection;
1535
1551
  }
@@ -1555,19 +1571,19 @@ class HomedecoratorConnectorService {
1555
1571
  this._imageCache.clear();
1556
1572
  }
1557
1573
  getWebViewStartupInfo(request) {
1558
- return __awaiter$1h(this, void 0, void 0, function* () {
1574
+ return __awaiter$1g(this, void 0, void 0, function* () {
1559
1575
  return this._connector.getWebViewStartupInfo(request);
1560
1576
  });
1561
1577
  }
1562
1578
  initNodeInstance(sku) {
1563
- return __awaiter$1h(this, void 0, void 0, function* () {
1579
+ return __awaiter$1g(this, void 0, void 0, function* () {
1564
1580
  const goodId = yield this._connector.getGoodIdFromArticleNr(sku);
1565
1581
  const response = yield this._connector.initNodeInstance(goodId);
1566
1582
  return this._handleInstanceResponse(response);
1567
1583
  });
1568
1584
  }
1569
1585
  changeConnection(instanceId, oldConnection, newConnection) {
1570
- return __awaiter$1h(this, void 0, void 0, function* () {
1586
+ return __awaiter$1g(this, void 0, void 0, function* () {
1571
1587
  const response = yield this._connector.changeConnection(instanceId, oldConnection, newConnection);
1572
1588
  return response && response.validationResult && response.validationResult.success;
1573
1589
  });
@@ -1577,6 +1593,10 @@ class HomedecoratorConnectorService {
1577
1593
  this.selectionsToDisplay.length = 0;
1578
1594
  this.decoNodes.length = 0;
1579
1595
  }
1596
+ emptyAnswersAndQuestion() {
1597
+ this.activeAnswers.length = 0;
1598
+ this.activeQuestion = undefined;
1599
+ }
1580
1600
  /**
1581
1601
  * Used for obsolete furniture
1582
1602
  * @param selections
@@ -1594,7 +1614,7 @@ class HomedecoratorConnectorService {
1594
1614
  this._decoNodes = decoNodes;
1595
1615
  }
1596
1616
  initConnection(forceReload) {
1597
- return __awaiter$1h(this, void 0, void 0, function* () {
1617
+ return __awaiter$1g(this, void 0, void 0, function* () {
1598
1618
  if ((this._initialized || this._initializing) && !forceReload) {
1599
1619
  return;
1600
1620
  }
@@ -1627,7 +1647,7 @@ class HomedecoratorConnectorService {
1627
1647
  // return this._connector.getJsonMatchTableArticles();
1628
1648
  // }
1629
1649
  setInstance(id) {
1630
- return __awaiter$1h(this, void 0, void 0, function* () {
1650
+ return __awaiter$1g(this, void 0, void 0, function* () {
1631
1651
  const response = yield this._connector.setInstanceToConfigure(id).catch(error => {
1632
1652
  console.log(error);
1633
1653
  return new DataServiceResponseData();
@@ -1642,7 +1662,7 @@ class HomedecoratorConnectorService {
1642
1662
  return this._copyInstance(instanceId, false, result);
1643
1663
  }
1644
1664
  saveConfigurations() {
1645
- return __awaiter$1h(this, void 0, void 0, function* () {
1665
+ return __awaiter$1g(this, void 0, void 0, function* () {
1646
1666
  const success = yield this._connector.saveConfigurations();
1647
1667
  if (!success) {
1648
1668
  console.error('error saving configurations');
@@ -1650,9 +1670,9 @@ class HomedecoratorConnectorService {
1650
1670
  });
1651
1671
  }
1652
1672
  getArticle(sku, branch) {
1653
- return __awaiter$1h(this, void 0, void 0, function* () {
1654
- this.selections = [];
1655
- this._decoNodes = [];
1673
+ return __awaiter$1g(this, void 0, void 0, function* () {
1674
+ this.emptySelections();
1675
+ this.emptyAnswersAndQuestion();
1656
1676
  const article = yield this._connector.getArticle(sku, branch)
1657
1677
  .catch(e => {
1658
1678
  return Promise.reject(e);
@@ -1673,14 +1693,25 @@ class HomedecoratorConnectorService {
1673
1693
  // this._connector.getQuestionAndAnswers();
1674
1694
  // }
1675
1695
  getQuestionAndAnswersAsync() {
1676
- return __awaiter$1h(this, void 0, void 0, function* () {
1696
+ return __awaiter$1g(this, void 0, void 0, function* () {
1677
1697
  const questionAndAnswers = yield this._connector.getQuestionAndAnswersAsync();
1678
1698
  questionAndAnswers.answers = questionAndAnswers.answers.filter(a => this._isAnswerPublished(a));
1699
+ // if (questionAndAnswers.question && !questionAndAnswers.question.grouped) {
1700
+ this.handleAnswersReceived(questionAndAnswers.answers);
1701
+ // }
1702
+ this._appEventService.answerCountReceived.next(questionAndAnswers.answers.length);
1703
+ if (questionAndAnswers.answers.length === 0) {
1704
+ this.emptyAnswersAndQuestion();
1705
+ }
1706
+ else {
1707
+ this.activeQuestion = questionAndAnswers.question;
1708
+ this.activeAnswers = questionAndAnswers.answers;
1709
+ }
1679
1710
  return questionAndAnswers;
1680
1711
  });
1681
1712
  }
1682
1713
  getSelectionsAsync() {
1683
- return __awaiter$1h(this, void 0, void 0, function* () {
1714
+ return __awaiter$1g(this, void 0, void 0, function* () {
1684
1715
  // this.selectionsToDisplay.length = 0;
1685
1716
  this.selections.length = 0;
1686
1717
  const selections = yield this._connector.getSelectionsAsync()
@@ -1691,7 +1722,7 @@ class HomedecoratorConnectorService {
1691
1722
  });
1692
1723
  }
1693
1724
  getDecosAsync() {
1694
- return __awaiter$1h(this, void 0, void 0, function* () {
1725
+ return __awaiter$1g(this, void 0, void 0, function* () {
1695
1726
  this._decoNodes = yield this._connector.getDecosAsync()
1696
1727
  .catch(() => {
1697
1728
  return [];
@@ -1716,13 +1747,13 @@ class HomedecoratorConnectorService {
1716
1747
  return this._connector.replaceSelection(selection);
1717
1748
  }
1718
1749
  getAnswerInfo(answer) {
1719
- return __awaiter$1h(this, void 0, void 0, function* () {
1750
+ return __awaiter$1g(this, void 0, void 0, function* () {
1720
1751
  const articleTexts = yield this._connector.getAnswerInfo(answer);
1721
1752
  this._onAnswerInfoReceived({ answer: answer, info: articleTexts });
1722
1753
  });
1723
1754
  }
1724
1755
  extendWithAnswerTextAndImage(answer, showLoader = true) {
1725
- return __awaiter$1h(this, void 0, void 0, function* () {
1756
+ return __awaiter$1g(this, void 0, void 0, function* () {
1726
1757
  if (answer.nodeId) {
1727
1758
  if (!this._imageCache.has(answer.nodeId)) {
1728
1759
  this._connector.getImageForAnswerOrSelection(answer, 4, true, showLoader).then((imageData) => {
@@ -1743,7 +1774,7 @@ class HomedecoratorConnectorService {
1743
1774
  });
1744
1775
  }
1745
1776
  extendWithSelectionImage(selection, showLoader = true) {
1746
- return __awaiter$1h(this, void 0, void 0, function* () {
1777
+ return __awaiter$1g(this, void 0, void 0, function* () {
1747
1778
  if (selection.nodeId) {
1748
1779
  if (!this._imageCache.has(selection.nodeId)) {
1749
1780
  this._connector.getImageForAnswerOrSelection(selection, 4, true, showLoader).then((imageData) => {
@@ -1860,7 +1891,7 @@ class HomedecoratorConnectorService {
1860
1891
  });
1861
1892
  }
1862
1893
  addToCart(goodId, goodType, quantity, instanceId, externalSource) {
1863
- return __awaiter$1h(this, void 0, void 0, function* () {
1894
+ return __awaiter$1g(this, void 0, void 0, function* () {
1864
1895
  let json;
1865
1896
  const statistics = new ConfiguratorStatisticsEnvironment();
1866
1897
  statistics.userType = 'Homedecorator';
@@ -1881,15 +1912,11 @@ class HomedecoratorConnectorService {
1881
1912
  });
1882
1913
  }
1883
1914
  handleAnswersReceived(answers) {
1884
- return __awaiter$1h(this, void 0, void 0, function* () {
1885
- this._activeAnswers = answers;
1886
- this.answerCountReceived.next(this._activeAnswers.length);
1887
- this._preloadCachedImages(answers);
1888
- this.answersReceived.next(answers);
1889
- if (this._activeAnswers) {
1890
- this._loadPricesOfActiveAnswers();
1891
- }
1892
- });
1915
+ this._preloadCachedImages(answers);
1916
+ this.answersReceived.next(answers);
1917
+ if (this.activeAnswers && this.activeAnswers.length > 0) {
1918
+ this._loadPricesOfActiveAnswers();
1919
+ }
1893
1920
  }
1894
1921
  _prepareSelectionsToDisplayImages() {
1895
1922
  if (this.selectionsToDisplay && this.selectionsToDisplay.length > 0) {
@@ -1989,12 +2016,12 @@ class HomedecoratorConnectorService {
1989
2016
  }
1990
2017
  // POSTCONDITION: current activeAnswers have price values.
1991
2018
  _loadPricesOfActiveAnswers() {
1992
- return __awaiter$1h(this, void 0, void 0, function* () {
2019
+ return __awaiter$1g(this, void 0, void 0, function* () {
1993
2020
  const answerPrices = yield this._connector.getAnswerPrices();
1994
2021
  if (answerPrices) {
1995
2022
  // paste price data onto our current answer objects; AnswerPrice.selId corresponds to Answer.node
1996
2023
  answerPrices.forEach(answerPrice => {
1997
- const answerMatch = this._activeAnswers.find(ans => ans.node === answerPrice.selId);
2024
+ const answerMatch = this.activeAnswers.find(ans => ans.node === answerPrice.selId);
1998
2025
  if (answerMatch) {
1999
2026
  answerMatch.price = // temp fix for price until backend is ready
2000
2027
  answerMatch.nodeLevel === 0 && answerPrice.addRetailPrice && answerMatch.seqO === 1 ?
@@ -2007,7 +2034,7 @@ class HomedecoratorConnectorService {
2007
2034
  });
2008
2035
  }
2009
2036
  _copyInstance(originalInstanceId, shouldSaveCurrentInstanceId, result) {
2010
- return __awaiter$1h(this, void 0, void 0, function* () {
2037
+ return __awaiter$1g(this, void 0, void 0, function* () {
2011
2038
  const copyInstanceResponse = yield this._connector.copyInstance(originalInstanceId, shouldSaveCurrentInstanceId).catch((e) => {
2012
2039
  if (e === 'ECONNABORTED' || e === undefined) {
2013
2040
  result.resultType = ResultType.Timeout;
@@ -2044,7 +2071,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
2044
2071
  }]
2045
2072
  }], ctorParameters: function () { return [{ type: HomedecoratorConnectorAdapterService }, { type: JsonUtilsService }, { type: HomedecoratorSettingsService }, { type: SkipButtonInfoService }, { type: MessageBusService }, { type: HomedecoratorAppEventService }, { type: GoogleTagManagerService }]; } });
2046
2073
 
2047
- var __awaiter$1g = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2074
+ var __awaiter$1f = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2048
2075
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2049
2076
  return new (P || (P = Promise))(function (resolve, reject) {
2050
2077
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -2084,13 +2111,13 @@ class AppStateService {
2084
2111
  window.history.replaceState(data, title, url);
2085
2112
  }
2086
2113
  undo() {
2087
- return __awaiter$1g(this, void 0, void 0, function* () {
2114
+ return __awaiter$1f(this, void 0, void 0, function* () {
2088
2115
  this.currentStateIndex -= 1;
2089
2116
  yield this.applyStateFn(this.getValue(this.currentStateIndex));
2090
2117
  });
2091
2118
  }
2092
2119
  redo() {
2093
- return __awaiter$1g(this, void 0, void 0, function* () {
2120
+ return __awaiter$1f(this, void 0, void 0, function* () {
2094
2121
  this.currentStateIndex += 1;
2095
2122
  yield this.applyStateFn(this.getValue(this.currentStateIndex));
2096
2123
  });
@@ -2353,7 +2380,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
2353
2380
  }]
2354
2381
  }], ctorParameters: function () { return []; } });
2355
2382
 
2356
- var __awaiter$1f = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2383
+ var __awaiter$1e = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2357
2384
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2358
2385
  return new (P || (P = Promise))(function (resolve, reject) {
2359
2386
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -2388,7 +2415,7 @@ class LocalStorageService {
2388
2415
  }
2389
2416
  }
2390
2417
  getRecoverySaveState() {
2391
- return __awaiter$1f(this, void 0, void 0, function* () {
2418
+ return __awaiter$1e(this, void 0, void 0, function* () {
2392
2419
  const indexedDBSave = yield this.getIndexedDBSaveState();
2393
2420
  const localStorageSave = this._getSaveStateInLocalStorage();
2394
2421
  if (indexedDBSave) {
@@ -2403,13 +2430,13 @@ class LocalStorageService {
2403
2430
  });
2404
2431
  }
2405
2432
  getIndexedDBSaveState() {
2406
- return __awaiter$1f(this, void 0, void 0, function* () {
2433
+ return __awaiter$1e(this, void 0, void 0, function* () {
2407
2434
  const getMessage = yield this._webWorkerService.postMessage(WebWorkerType.IndexedDB, { messageType: WebWorkerMessage.GetRecoverySaveDataFromIndexedDB });
2408
2435
  return getMessage.data;
2409
2436
  });
2410
2437
  }
2411
2438
  writeIndexedDBSaveState(saveState) {
2412
- return __awaiter$1f(this, void 0, void 0, function* () {
2439
+ return __awaiter$1e(this, void 0, void 0, function* () {
2413
2440
  const saveMessage = yield this._webWorkerService.postMessage(WebWorkerType.IndexedDB, { messageType: WebWorkerMessage.WriteCurrentSaveDataToIndexedDB, messageData: saveState });
2414
2441
  if (!this.saveStateExists && saveMessage.data) {
2415
2442
  this.saveStateExists = true;
@@ -2419,7 +2446,7 @@ class LocalStorageService {
2419
2446
  });
2420
2447
  }
2421
2448
  checkForLocalSave() {
2422
- return __awaiter$1f(this, void 0, void 0, function* () {
2449
+ return __awaiter$1e(this, void 0, void 0, function* () {
2423
2450
  if (!this.saveStateExists) {
2424
2451
  const indexedDBSave = yield this.getIndexedDBSaveState();
2425
2452
  if (indexedDBSave || this._getSaveStateInLocalStorage() !== null) {
@@ -2441,7 +2468,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
2441
2468
  }]
2442
2469
  }], ctorParameters: function () { return [{ type: WebWorkerService }]; } });
2443
2470
 
2444
- var __awaiter$1e = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2471
+ var __awaiter$1d = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2445
2472
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2446
2473
  return new (P || (P = Promise))(function (resolve, reject) {
2447
2474
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -2520,7 +2547,7 @@ class FileUtils {
2520
2547
  }
2521
2548
  }
2522
2549
  static SaveGLBFile(data, assetPath) {
2523
- return __awaiter$1e(this, void 0, void 0, function* () {
2550
+ return __awaiter$1d(this, void 0, void 0, function* () {
2524
2551
  return new Promise((resolve, reject) => {
2525
2552
  const xhr = new XMLHttpRequest();
2526
2553
  xhr.open('POST', `${assetPath}saveGLBFile.php`, true);
@@ -2675,7 +2702,7 @@ class FileUtils {
2675
2702
  }
2676
2703
  FileUtils._cachedTextureUploads = new Map();
2677
2704
 
2678
- var __awaiter$1d = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2705
+ var __awaiter$1c = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2679
2706
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2680
2707
  return new (P || (P = Promise))(function (resolve, reject) {
2681
2708
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -2689,7 +2716,7 @@ class FileService {
2689
2716
  this._settingsService = _settingsService;
2690
2717
  }
2691
2718
  getTotalDownloadSize(files) {
2692
- return __awaiter$1d(this, void 0, void 0, function* () {
2719
+ return __awaiter$1c(this, void 0, void 0, function* () {
2693
2720
  const url = `${this._settingsService.settings.assetPath}/fileSize.php`;
2694
2721
  const data = {
2695
2722
  files: files
@@ -2716,7 +2743,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
2716
2743
  }]
2717
2744
  }], ctorParameters: function () { return [{ type: HomedecoratorSettingsService }]; } });
2718
2745
 
2719
- var __awaiter$1c = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2746
+ var __awaiter$1b = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2720
2747
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2721
2748
  return new (P || (P = Promise))(function (resolve, reject) {
2722
2749
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -2739,7 +2766,7 @@ class ProgressService {
2739
2766
  return (current / this.total) * 100;
2740
2767
  }
2741
2768
  prepareDownloads(furniture) {
2742
- return __awaiter$1c(this, void 0, void 0, function* () {
2769
+ return __awaiter$1b(this, void 0, void 0, function* () {
2743
2770
  this._reset();
2744
2771
  const files = [];
2745
2772
  if (furniture && furniture.length > 0) {
@@ -3628,7 +3655,7 @@ class RelativePositionUtils {
3628
3655
  RelativePositionUtils.appOffsetTop = 0;
3629
3656
  RelativePositionUtils.appOffsetLeft = 0;
3630
3657
 
3631
- var __awaiter$1b = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3658
+ var __awaiter$1a = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3632
3659
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3633
3660
  return new (P || (P = Promise))(function (resolve, reject) {
3634
3661
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -3827,7 +3854,7 @@ Controls = function (camera, domElement) {
3827
3854
  scope.pan(new THREE.Vector2(x, y));
3828
3855
  };
3829
3856
  this.animateCamera = function (type, change) {
3830
- return __awaiter$1b(this, void 0, void 0, function* () {
3857
+ return __awaiter$1a(this, void 0, void 0, function* () {
3831
3858
  const changing = new THREE.Vector2();
3832
3859
  const tween = new TWEEN.Tween(changing).to(new THREE.Vector2(change, 0), 200);
3833
3860
  tween.easing(TWEEN.Easing.Quadratic.In);
@@ -3838,7 +3865,7 @@ Controls = function (camera, domElement) {
3838
3865
  });
3839
3866
  };
3840
3867
  this.animateCameraMovement = function (endPosition, endTarget, endDuration) {
3841
- return __awaiter$1b(this, void 0, void 0, function* () {
3868
+ return __awaiter$1a(this, void 0, void 0, function* () {
3842
3869
  if (!isFinite(endPosition.x) || !isFinite(endPosition.y) || !isFinite(endPosition.z)) {
3843
3870
  return;
3844
3871
  }
@@ -3910,7 +3937,7 @@ Controls = function (camera, domElement) {
3910
3937
  this.updatePositionTarget(this.camera.position, this.target);
3911
3938
  };
3912
3939
  this.animateMoveTo = function (target) {
3913
- return __awaiter$1b(this, void 0, void 0, function* () {
3940
+ return __awaiter$1a(this, void 0, void 0, function* () {
3914
3941
  const position = scope.target.clone();
3915
3942
  const distance = target.distanceTo(position);
3916
3943
  const tween = new TWEEN.Tween(position).to(target, distance);
@@ -4094,7 +4121,7 @@ Controls = function (camera, domElement) {
4094
4121
  return event && event.target && event.target === document.body;
4095
4122
  }
4096
4123
  function onMouseMove(event) {
4097
- return __awaiter$1b(this, void 0, void 0, function* () {
4124
+ return __awaiter$1a(this, void 0, void 0, function* () {
4098
4125
  if (!isMouseEventAllowed(event)) {
4099
4126
  return;
4100
4127
  }
@@ -4443,7 +4470,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
4443
4470
  }]
4444
4471
  }] });
4445
4472
 
4446
- var __awaiter$1a = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4473
+ var __awaiter$19 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4447
4474
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4448
4475
  return new (P || (P = Promise))(function (resolve, reject) {
4449
4476
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -4628,7 +4655,7 @@ class CameraService {
4628
4655
  this.cameraMovementChanged.next();
4629
4656
  }
4630
4657
  moveCameraToFitObject(object, offset) {
4631
- return __awaiter$1a(this, void 0, void 0, function* () {
4658
+ return __awaiter$19(this, void 0, void 0, function* () {
4632
4659
  if (!object) {
4633
4660
  return;
4634
4661
  }
@@ -4699,7 +4726,7 @@ class CameraService {
4699
4726
  return target.clone().add(new Vector3(0, targetDistance, targetDistance));
4700
4727
  }
4701
4728
  _placeWalkThroughCameraInCorner(viewCorner) {
4702
- return __awaiter$1a(this, void 0, void 0, function* () {
4729
+ return __awaiter$19(this, void 0, void 0, function* () {
4703
4730
  const center2d = this._viewCenter;
4704
4731
  const center = new Vector3(center2d.x, this.cameraDefaultHeight, center2d.y);
4705
4732
  // place in a corner to have a better view
@@ -4874,7 +4901,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
4874
4901
  }]
4875
4902
  }], ctorParameters: function () { return []; } });
4876
4903
 
4877
- var __awaiter$19 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4904
+ var __awaiter$18 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4878
4905
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4879
4906
  return new (P || (P = Promise))(function (resolve, reject) {
4880
4907
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -4890,7 +4917,7 @@ class MessageBoardService {
4890
4917
  this.messages = [];
4891
4918
  }
4892
4919
  init(scene) {
4893
- return __awaiter$19(this, void 0, void 0, function* () {
4920
+ return __awaiter$18(this, void 0, void 0, function* () {
4894
4921
  this.scene = scene;
4895
4922
  if (this._settingsService.settings.options.xrDebug) {
4896
4923
  this._createMessageBoard();
@@ -4928,7 +4955,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
4928
4955
  }]
4929
4956
  }], ctorParameters: function () { return [{ type: HomedecoratorSettingsService }, { type: FontService }]; } });
4930
4957
 
4931
- var __awaiter$18 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4958
+ var __awaiter$17 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4932
4959
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4933
4960
  return new (P || (P = Promise))(function (resolve, reject) {
4934
4961
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -4958,7 +4985,7 @@ class XrService {
4958
4985
  this._subs.forEach(s => s.unsubscribe());
4959
4986
  }
4960
4987
  init(renderer, scene, camera) {
4961
- return __awaiter$18(this, void 0, void 0, function* () {
4988
+ return __awaiter$17(this, void 0, void 0, function* () {
4962
4989
  if (!this._settingsService.settings.options.vrEnabled && !this._settingsService.settings.options.arEnabled) {
4963
4990
  return;
4964
4991
  }
@@ -5314,7 +5341,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
5314
5341
  }]
5315
5342
  }], ctorParameters: function () { return [{ type: HomedecoratorSettingsService }, { type: DebugService }, { type: MessageBoardService }]; } });
5316
5343
 
5317
- var __awaiter$17 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
5344
+ var __awaiter$16 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
5318
5345
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5319
5346
  return new (P || (P = Promise))(function (resolve, reject) {
5320
5347
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -5368,7 +5395,7 @@ class Reticle extends Object3D {
5368
5395
  * @param {XRCoordinateSystem} frameOfRef
5369
5396
  */
5370
5397
  update(session, camera, frameOfRef) {
5371
- return __awaiter$17(this, void 0, void 0, function* () {
5398
+ return __awaiter$16(this, void 0, void 0, function* () {
5372
5399
  this._rayCaster = this._rayCaster || new Raycaster();
5373
5400
  this._rayCaster.setFromCamera(new THREE.Vector2(0, 0), camera);
5374
5401
  const ray = this._rayCaster.ray;
@@ -5963,7 +5990,7 @@ class BaseItem extends Object3D {
5963
5990
  class ServiceLocator {
5964
5991
  }
5965
5992
 
5966
- var __awaiter$16 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
5993
+ var __awaiter$15 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
5967
5994
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5968
5995
  return new (P || (P = Promise))(function (resolve, reject) {
5969
5996
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -6034,7 +6061,7 @@ class OutlineService {
6034
6061
  this._outlinePass.selectedObjects = [item];
6035
6062
  }
6036
6063
  showOutline(item) {
6037
- return __awaiter$16(this, void 0, void 0, function* () {
6064
+ return __awaiter$15(this, void 0, void 0, function* () {
6038
6065
  // if (item && (item instanceof FloorPin || item instanceof WallPin)) {
6039
6066
  // return;
6040
6067
  // }
@@ -6053,7 +6080,7 @@ class OutlineService {
6053
6080
  });
6054
6081
  }
6055
6082
  hideOutline() {
6056
- return __awaiter$16(this, void 0, void 0, function* () {
6083
+ return __awaiter$15(this, void 0, void 0, function* () {
6057
6084
  if (this._outlinePass.selectedObjects.length > 0) {
6058
6085
  // await this._animatedOutlineStrength(300, 0);
6059
6086
  this._outlinePass.selectedObjects = [];
@@ -6886,7 +6913,7 @@ var TextureType;
6886
6913
  TextureType[TextureType["PBR"] = 3] = "PBR";
6887
6914
  })(TextureType || (TextureType = {}));
6888
6915
 
6889
- var __awaiter$15 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
6916
+ var __awaiter$14 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
6890
6917
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
6891
6918
  return new (P || (P = Promise))(function (resolve, reject) {
6892
6919
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -6943,13 +6970,13 @@ class MaterialUtils {
6943
6970
  }
6944
6971
  // use canvas to create rotated textures
6945
6972
  static RotatedCanvasTexture(texture, textureURL, dimensions, adjustScale, repeatX, repeatY) {
6946
- return __awaiter$15(this, void 0, void 0, function* () {
6973
+ return __awaiter$14(this, void 0, void 0, function* () {
6947
6974
  const img = yield MaterialUtils.LoadImageCached(textureURL);
6948
6975
  return MaterialUtils.CreateTileMap(img, texture, dimensions, adjustScale, repeatX, repeatY);
6949
6976
  });
6950
6977
  }
6951
6978
  static CustomTileMapTexture(texture, dimensions) {
6952
- return __awaiter$15(this, void 0, void 0, function* () {
6979
+ return __awaiter$14(this, void 0, void 0, function* () {
6953
6980
  let img = yield MaterialUtils.LoadImageCached(texture.data);
6954
6981
  if (MaterialUtils.TextureSourceModified(texture)) {
6955
6982
  img = yield MaterialUtils.CreateShiftedDataUrl(img, texture);
@@ -6982,7 +7009,7 @@ class MaterialUtils {
6982
7009
  }
6983
7010
  // use canvas to create texture from photo
6984
7011
  static FromImage(texture /*, dimensions: THREE.Vector2*/) {
6985
- return __awaiter$15(this, void 0, void 0, function* () {
7012
+ return __awaiter$14(this, void 0, void 0, function* () {
6986
7013
  const img = yield MaterialUtils.LoadImageCached(texture.data);
6987
7014
  const canvas = yield MaterialUtils.GetCanvasFromImageTexture(img, texture, true);
6988
7015
  const threeTexture = new THREE.Texture(canvas);
@@ -6992,7 +7019,7 @@ class MaterialUtils {
6992
7019
  });
6993
7020
  }
6994
7021
  static ReadAndResizePhotoAsDataURL(file) {
6995
- return __awaiter$15(this, void 0, void 0, function* () {
7022
+ return __awaiter$14(this, void 0, void 0, function* () {
6996
7023
  const imageSrc = yield MaterialUtils.ReadFileAsDataURL(file);
6997
7024
  return MaterialUtils.LoadImageCached(imageSrc, false);
6998
7025
  // const image = new Image();
@@ -7015,7 +7042,8 @@ class MaterialUtils {
7015
7042
  let srcKey = src;
7016
7043
  let type = 'image/jpeg';
7017
7044
  if (isDataUri) {
7018
- srcKey = md5(src);
7045
+ // srcKey = md5(src);
7046
+ srcKey = src;
7019
7047
  if (src.indexOf('image/png') > -1) {
7020
7048
  type = 'image/png';
7021
7049
  }
@@ -7062,7 +7090,7 @@ class MaterialUtils {
7062
7090
  });
7063
7091
  }
7064
7092
  static GetMaterialMaps(material, texture, dimensions) {
7065
- return __awaiter$15(this, void 0, void 0, function* () {
7093
+ return __awaiter$14(this, void 0, void 0, function* () {
7066
7094
  if (!texture) {
7067
7095
  return;
7068
7096
  }
@@ -7094,7 +7122,7 @@ class MaterialUtils {
7094
7122
  });
7095
7123
  }
7096
7124
  static loadMaterializeMaps(material, texture) {
7097
- return __awaiter$15(this, void 0, void 0, function* () {
7125
+ return __awaiter$14(this, void 0, void 0, function* () {
7098
7126
  material.map = yield MaterialUtils.FromUrl(texture.materializeUrl + '_diffuseOriginal.jpg', texture.stretch, texture.tileSize, texture.repeatX, texture.repeatY, texture.dimensions, texture.tileRotation);
7099
7127
  material.normalMap = yield MaterialUtils.FromUrl(texture.materializeUrl + '_normal.jpg', texture.stretch, texture.tileSize, texture.repeatX, texture.repeatY, texture.dimensions, texture.tileRotation);
7100
7128
  material.roughnessMap = yield MaterialUtils.FromUrl(texture.materializeUrl + '_smoothness.jpg', texture.stretch, texture.tileSize, texture.repeatX, texture.repeatY, texture.dimensions, texture.tileRotation);
@@ -7153,7 +7181,7 @@ class MaterialUtils {
7153
7181
  }
7154
7182
  // use canvas to create texture from flipped photo
7155
7183
  static FromFlippedImage(texture, dimensions) {
7156
- return __awaiter$15(this, void 0, void 0, function* () {
7184
+ return __awaiter$14(this, void 0, void 0, function* () {
7157
7185
  const origImg = yield MaterialUtils.LoadImageCached(texture.data);
7158
7186
  const canvas = yield MaterialUtils.GetCanvasFromImageTexture(origImg, texture, false, true);
7159
7187
  const threeTexture = new THREE.Texture(canvas);
@@ -7182,21 +7210,21 @@ class MaterialUtils {
7182
7210
  }
7183
7211
  // use canvas to create custom textures
7184
7212
  static CustomTileTexture(texture) {
7185
- return __awaiter$15(this, void 0, void 0, function* () {
7213
+ return __awaiter$14(this, void 0, void 0, function* () {
7186
7214
  const img = yield MaterialUtils.LoadImageCached(texture.data);
7187
7215
  const canvas = yield MaterialUtils.GetCanvasFromImageTexture(img, texture, true, true);
7188
7216
  return MaterialUtils.CreateTileFromTexture(canvas, texture);
7189
7217
  });
7190
7218
  }
7191
7219
  static RotatedImageTexture(texture, textureURL) {
7192
- return __awaiter$15(this, void 0, void 0, function* () {
7220
+ return __awaiter$14(this, void 0, void 0, function* () {
7193
7221
  const img = yield MaterialUtils.LoadImageCached(textureURL);
7194
7222
  const canvas = yield MaterialUtils.GetCanvasFromImageTexture(img, texture, false, true);
7195
7223
  return MaterialUtils.CreateTileFromTexture(canvas, texture);
7196
7224
  });
7197
7225
  }
7198
7226
  static CreateTileDataUrl(img, texture) {
7199
- return __awaiter$15(this, void 0, void 0, function* () {
7227
+ return __awaiter$14(this, void 0, void 0, function* () {
7200
7228
  if (typeof img === 'string') {
7201
7229
  img = yield this.CreateImageElementFromSource(img);
7202
7230
  }
@@ -7210,7 +7238,7 @@ class MaterialUtils {
7210
7238
  });
7211
7239
  }
7212
7240
  static CreateTileMap(img, texture, oDimensions, adjustScale, repeatX, repeatY) {
7213
- return __awaiter$15(this, void 0, void 0, function* () {
7241
+ return __awaiter$14(this, void 0, void 0, function* () {
7214
7242
  if (typeof img === 'string') {
7215
7243
  img = yield this.CreateImageElementFromSource(img);
7216
7244
  }
@@ -7289,7 +7317,7 @@ MaterialUtils.imgElement = undefined;
7289
7317
  MaterialUtils.imageCache = new Map();
7290
7318
  MaterialUtils.textureCache = new Map();
7291
7319
 
7292
- var __awaiter$14 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7320
+ var __awaiter$13 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7293
7321
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
7294
7322
  return new (P || (P = Promise))(function (resolve, reject) {
7295
7323
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
@@ -7333,7 +7361,7 @@ class ArService {
7333
7361
  Utils$1.DisposeObject(this._pointRepresentation);
7334
7362
  }
7335
7363
  resetPlaneDetection() {
7336
- return __awaiter$14(this, void 0, void 0, function* () {
7364
+ return __awaiter$13(this, void 0, void 0, function* () {
7337
7365
  this._reticle.visible = false;
7338
7366
  this._activeARModel.visible = false;
7339
7367
  this._vertexList = [];
@@ -7352,7 +7380,7 @@ class ArService {
7352
7380
  this._session.end();
7353
7381
  }
7354
7382
  arIOSSupported() {
7355
- return __awaiter$14(this, void 0, void 0, function* () {
7383
+ return __awaiter$13(this, void 0, void 0, function* () {
7356
7384
  const isIOS = /iPad|iPhone|iPod/.test(navigator.platform) ||
7357
7385
  (navigator.userAgent.includes('Mac') && 'ontouchend' in document);
7358
7386
  if (isIOS) {
@@ -7365,7 +7393,7 @@ class ArService {
7365
7393
  });
7366
7394
  }
7367
7395
  arSupported() {
7368
- return __awaiter$14(this, void 0, void 0, function* () {
7396
+ return __awaiter$13(this, void 0, void 0, function* () {
7369
7397
  if (navigator.xr) {
7370
7398
  return yield navigator.xr.isSessionSupported('immersive-ar');
7371
7399
  }
@@ -7531,6 +7559,7 @@ class ArService {
7531
7559
  this._lightProbe.addEventListener('reflectionchange', () => {
7532
7560
  const rawData = this._glBinding.getReflectionCubeMap(this._lightProbe);
7533
7561
  const texProps = this._renderer.properties.get(this._cubeMapTexture);
7562
+ // @ts-ignore
7534
7563
  texProps.__webglTexture = rawData;
7535
7564
  });
7536
7565
  }
@@ -7687,7 +7716,7 @@ class ArService {
7687
7716
  }
7688
7717
  }
7689
7718
  _createPlaneMaterial() {
7690
- return __awaiter$14(this, void 0, void 0, function* () {
7719
+ return __awaiter$13(this, void 0, void 0, function* () {
7691
7720
  const pm = new MeshPhongMaterial({ transparent: true, side: DoubleSide });
7692
7721
  pm.map = yield MaterialUtils.FromUrl('assets/textures/Floor/Tiles/ar_floor_texture.png', false, 1, 2, 2);
7693
7722
  pm.map.flipY = false;
@@ -7696,7 +7725,7 @@ class ArService {
7696
7725
  });
7697
7726
  }
7698
7727
  _onSessionStarted(session) {
7699
- return __awaiter$14(this, void 0, void 0, function* () {
7728
+ return __awaiter$13(this, void 0, void 0, function* () {
7700
7729
  const domOverlay = document.getElementById('ar-root');
7701
7730
  session.addEventListener('end', this._onSessionEnded.bind(this));
7702
7731
  session.addEventListener('select', () => this._handleTouchEvent());
@@ -7818,7 +7847,7 @@ class ArService {
7818
7847
  }
7819
7848
  }
7820
7849
  _checkIfHoldTouchEvent($event) {
7821
- return __awaiter$14(this, void 0, void 0, function* () {
7850
+ return __awaiter$13(this, void 0, void 0, function* () {
7822
7851
  setTimeout(() => {
7823
7852
  if (!this.userInSelectionMenu && this._lastEventTimestamp === $event.timeStamp && this._session.inputSources.length === 1) {
7824
7853
  this._holdingTouch = true;
@@ -8163,37 +8192,87 @@ class PostProcessingService {
8163
8192
  this._renderer = renderer;
8164
8193
  this._scene = scene;
8165
8194
  this._camera = camera;
8166
- this._renderTarget = new WebGLRenderTarget(width, height, {
8195
+ this._width = width;
8196
+ this._height = height;
8197
+ this._postProcessingGui = new GUI();
8198
+ this._postProcessingGui.hide();
8199
+ this._renderPass = new RenderPass(this._scene, this._camera);
8200
+ this._outputPass = new OutputPass();
8201
+ this._initAoComposer();
8202
+ this._initAaComposer();
8203
+ this._initBlendComposer();
8204
+ }
8205
+ _initAaComposer() {
8206
+ this._aaRenderTarget = new WebGLRenderTarget(this._width, this._height, {
8207
+ samples: 4,
8208
+ type: HalfFloatType /*,
8167
8209
  minFilter: NearestFilter,
8168
8210
  magFilter: NearestFilter,
8169
8211
  format: RGBAFormat,
8170
- colorSpace: SRGBColorSpace
8171
- });
8172
- this._renderTarget.samples = 4;
8173
- this._renderTarget.depthTexture = new DepthTexture(width, height, UnsignedIntType);
8174
- this._renderTarget.depthTexture.format = DepthFormat;
8175
- this._composer = new EffectComposer(this._renderer, this._renderTarget);
8176
- this._n8aoPass = new N8AOPass(scene, camera, width, height);
8177
- this._n8aoPass.configuration.gammaCorrection = false;
8178
- this._n8aoPass.debugMode = true;
8212
+ colorSpace: SRGBColorSpace*/
8213
+ });
8214
+ this._aaComposer = new EffectComposer(this._renderer, this._aaRenderTarget);
8215
+ this._aaComposer.renderToScreen = false;
8216
+ const fxaaPass = new ShaderPass(FXAAShader);
8217
+ const pixelRatio = this._renderer.getPixelRatio();
8218
+ // fxaaPass.material.uniforms[ 'resolution' ].value.x = 1 / (this._width * pixelRatio);
8219
+ // fxaaPass.material.uniforms[ 'resolution' ].value.y = 1 / (this._height * pixelRatio);
8220
+ fxaaPass.uniforms['resolution'].value.x = 1 / (this._width * pixelRatio);
8221
+ fxaaPass.uniforms['resolution'].value.y = 1 / (this._height * pixelRatio);
8222
+ // this._taaRenderPass = new TAARenderPass(this._scene, this._camera, 0x000000, 0);
8223
+ // this._taaRenderPass.unbiased = true;
8224
+ // this._taaRenderPass.sampleLevel = 4;
8225
+ // this._renderPass.enabled = false;
8226
+ // sao
8227
+ // this._saoPass = new SAOPass( this._scene, this._camera, new Vector2(2048, 2048));
8228
+ // this._saoPass.resolution.set(2048, 2048);
8229
+ // this._saoPass.renderToScreen = true;
8230
+ // this._saoPass.enabled = true;
8231
+ this._aaComposer.addPass(this._renderPass);
8232
+ // this._aaComposer.addPass(this._taaRenderPass);
8233
+ this._aaComposer.addPass(fxaaPass);
8234
+ this._aaComposer.addPass(this._outputPass);
8235
+ this._createGuiTaaPass();
8236
+ }
8237
+ _initAoComposer() {
8238
+ this._aoRenderTarget = new WebGLRenderTarget(this._width, this._height, {
8239
+ samples: 4,
8240
+ type: HalfFloatType /*,
8241
+ minFilter: NearestFilter,
8242
+ magFilter: NearestFilter,
8243
+ format: RGBAFormat,
8244
+ colorSpace: SRGBColorSpace*/
8245
+ });
8246
+ this._aoComposer = new EffectComposer(this._renderer, this._aoRenderTarget);
8247
+ this._aoComposer.renderToScreen = false;
8248
+ this._n8aoPass = new N8AOPass(this._scene, this._camera, this._width, this._height);
8249
+ // this._n8aoPass.configuration.gammaCorrection = false;
8250
+ // this._n8aoPass.renderToScreen = false;
8251
+ // this._n8aoPass.debugMode = true;
8179
8252
  // const smaaPass = new SMAAPass(width, height);
8180
8253
  // this._composer.addPass(smaaPass);
8181
- // const fxaaPass = new ShaderPass(FXAAShader);
8182
- // const pixelRatio = this._renderer.getPixelRatio();
8183
- // fxaaPass.material.uniforms[ 'resolution' ].value.x = 1 / (width * pixelRatio);
8184
- // fxaaPass.material.uniforms[ 'resolution' ].value.y = 1 / (height * pixelRatio);
8185
- this._outputPass = new OutputPass();
8186
- this._taaRenderPass = new TAARenderPass(this._scene, this._camera, 0x000000, 0);
8187
- this._taaRenderPass.unbiased = false;
8188
- this._taaRenderPass.sampleLevel = 4;
8189
- this._renderPass = new RenderPass(this._scene, this._camera);
8190
8254
  // this._renderPass.enabled = false;
8191
- this._composer.addPass(this._renderPass);
8192
- this._composer.addPass(this._taaRenderPass);
8193
- this._composer.addPass(this._n8aoPass);
8194
- this._composer.addPass(this._outputPass);
8255
+ // sao
8256
+ // this._saoPass = new SAOPass( this._scene, this._camera, new Vector2(2048, 2048));
8257
+ // this._saoPass.resolution.set(2048, 2048);
8258
+ // this._saoPass.renderToScreen = true;
8259
+ // this._saoPass.enabled = true;
8260
+ this._aoComposer.addPass(this._renderPass);
8261
+ this._aoComposer.addPass(this._n8aoPass);
8262
+ this._aoComposer.addPass(this._outputPass);
8263
+ // this._composer.addPass(this._saoPass);
8264
+ // this._aoComposer.addPass(this._aoOutputPass);
8195
8265
  this._createGui();
8196
- this._createGuiTaaPass();
8266
+ }
8267
+ _initBlendComposer() {
8268
+ this._blendShader = new ShaderPass(BlendShader);
8269
+ this._blendShader.uniforms.tDiffuse1.value = this._aaRenderTarget.texture;
8270
+ this._blendShader.uniforms.tDiffuse2.value = this._aoRenderTarget.texture;
8271
+ // blendShader.uniforms['mixRatio'].value = 0.9;
8272
+ this._blendComposer = new EffectComposer(this._renderer);
8273
+ this._blendComposer.renderToScreen = true;
8274
+ this._blendComposer.addPass(this._renderPass);
8275
+ this._blendComposer.addPass(this._blendShader);
8197
8276
  }
8198
8277
  _updatePass() {
8199
8278
  this._n8aoPass.configuration.aoRadius = this._effectController.aoRadius;
@@ -8214,10 +8293,8 @@ class PostProcessingService {
8214
8293
  this.render();
8215
8294
  }
8216
8295
  _createGuiTaaPass() {
8217
- this._taaPassGui = new GUI();
8218
- this._taaPassGui.hide();
8219
8296
  const param = { TAAEnabled: '1', TAASampleLevel: 0 };
8220
- this._taaPassGui.add(param, 'TAAEnabled', {
8297
+ this._postProcessingGui.add(param, 'TAAEnabled', {
8221
8298
  'Disabled': '0',
8222
8299
  'Enabled': '1'
8223
8300
  }).onFinishChange(() => {
@@ -8226,7 +8303,7 @@ class PostProcessingService {
8226
8303
  }
8227
8304
  this.render();
8228
8305
  });
8229
- this._taaPassGui.add(param, 'TAASampleLevel', {
8306
+ this._postProcessingGui.add(param, 'TAASampleLevel', {
8230
8307
  'Level 0: 1 Sample': 0,
8231
8308
  'Level 1: 2 Samples': 1,
8232
8309
  'Level 2: 4 Samples': 2,
@@ -8239,13 +8316,16 @@ class PostProcessingService {
8239
8316
  }
8240
8317
  this.render();
8241
8318
  });
8242
- this._taaPassGui.open();
8243
8319
  }
8244
8320
  setSize(width, height) {
8245
- this._composer.setSize(width, height);
8321
+ this._aoComposer.setSize(width, height);
8322
+ this._aaComposer.setSize(width, height);
8323
+ this._blendComposer.setSize(width, height);
8246
8324
  }
8247
8325
  render() {
8248
- this._composer.render();
8326
+ this._aaComposer.render();
8327
+ this._aoComposer.render();
8328
+ this._blendComposer.render();
8249
8329
  }
8250
8330
  showGui() {
8251
8331
  this._postProcessingGui.show(true);
@@ -8257,8 +8337,16 @@ class PostProcessingService {
8257
8337
  show ? this.showGui() : this.hideGui();
8258
8338
  }
8259
8339
  _createGui() {
8260
- this._postProcessingGui = new GUI();
8261
- this._postProcessingGui.hide();
8340
+ const param = { Enabled: '1' };
8341
+ this._postProcessingGui.add(param, 'Enabled', {
8342
+ 'Disabled': '0',
8343
+ 'Enabled': '1'
8344
+ }).onFinishChange(() => {
8345
+ if (this._aoComposer) {
8346
+ this._aoComposer.renderToScreen = (param.Enabled === '1');
8347
+ }
8348
+ this.render();
8349
+ });
8262
8350
  this._postProcessingGui.add(this._effectController, 'aoSamples', 1.0, 64.0, 1.0).onChange(() => this._updatePass());
8263
8351
  this._postProcessingGui.add(this._effectController, 'denoiseSamples', 1.0, 64.0, 1.0).onChange(() => this._updatePass());
8264
8352
  this._postProcessingGui.add(this._effectController, 'denoiseRadius', 0.0, 24.0, 0.01).onChange(() => this._updatePass());
@@ -8305,15 +8393,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
8305
8393
  }]
8306
8394
  }], ctorParameters: function () { return [{ type: ConfigurationService }]; } });
8307
8395
 
8308
- var __awaiter$13 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8309
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8310
- return new (P || (P = Promise))(function (resolve, reject) {
8311
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
8312
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8313
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8314
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8315
- });
8316
- };
8317
8396
  class SsrService {
8318
8397
  constructor(_settingsService) {
8319
8398
  this._settingsService = _settingsService;
@@ -8332,48 +8411,6 @@ class SsrService {
8332
8411
  ngOnDestroy() {
8333
8412
  this._subs.forEach(s => s.unsubscribe());
8334
8413
  }
8335
- init() {
8336
- const socket = new WebSocket('ws://localhost:7005');
8337
- const peerConnection = new RTCPeerConnection({
8338
- iceServers: [{ urls: 'stun:stun.1.google.com:19302' }]
8339
- });
8340
- peerConnection.onicecandidate = (event) => {
8341
- if (event.candidate) {
8342
- socket.send(JSON.stringify({ candidate: event.candidate }));
8343
- }
8344
- };
8345
- peerConnection.ontrack = (event) => {
8346
- const remoteVideo = document.getElementById('remoteVideo');
8347
- // @ts-ignore
8348
- if (remoteVideo.srcObject !== event.streams[0]) {
8349
- // @ts-ignore
8350
- remoteVideo.srcObject = event.streams[0];
8351
- }
8352
- };
8353
- socket.onmessage = (message) => __awaiter$13(this, void 0, void 0, function* () {
8354
- try {
8355
- const text = yield message.data.text();
8356
- const data = JSON.parse(text);
8357
- if (data.offer) {
8358
- yield peerConnection.setRemoteDescription(new RTCSessionDescription(data.offer));
8359
- const answer = yield peerConnection.createAnswer();
8360
- yield peerConnection.setLocalDescription(answer);
8361
- socket.send(JSON.stringify({ answer: peerConnection.localDescription }));
8362
- }
8363
- else if (data.candidate) {
8364
- try {
8365
- yield peerConnection.addIceCandidate(new RTCIceCandidate(data.candidate));
8366
- }
8367
- catch (e) {
8368
- console.error('Error adding ICE-Candidate', e);
8369
- }
8370
- }
8371
- }
8372
- catch (e) {
8373
- console.error(e);
8374
- }
8375
- });
8376
- }
8377
8414
  sceneChanged(scene) {
8378
8415
  if (this._websocket.readyState === WebSocket.OPEN) {
8379
8416
  const sceneClone = scene.clone(true);
@@ -8622,7 +8659,7 @@ class SceneService {
8622
8659
  // throw new Error('No WebGPU or WebGL2 support');
8623
8660
  // }
8624
8661
  const canvasElement = document.createElement('canvas');
8625
- const context = canvasElement.getContext('webgl2', { antialias: true });
8662
+ const context = canvasElement.getContext('webgl2');
8626
8663
  this.webGL2Available = context !== undefined;
8627
8664
  // this.renderer = new WebGPURenderer({ alpha: true, antialias: true });
8628
8665
  // this.renderer =
@@ -8636,15 +8673,21 @@ class SceneService {
8636
8673
  // logarithmicDepthBuffer: true*/
8637
8674
  // });
8638
8675
  // this.renderer = new WebGLRenderer({alpha: true, antialias: false, preserveDrawingBuffer: true, premultipliedAlpha: true});
8639
- this.renderer = new WebGLRenderer( /*{
8640
- precision: 'highp',
8641
- powerPreference: 'high-performance',
8642
- antialias: true,
8643
- stencil: false,
8644
- depth: false
8645
- }*/);
8676
+ this.renderer = new WebGLRenderer({
8677
+ /*
8678
+ precision: 'highp',
8679
+ powerPreference: 'high-performance',
8680
+ */
8681
+ /*
8682
+ antialias: true,
8683
+ */
8684
+ /*
8685
+ stencil: false,
8686
+ depth: false
8687
+ */
8688
+ });
8646
8689
  this.renderer.outputColorSpace = SRGBColorSpace;
8647
- this.renderer.autoClear = false;
8690
+ this.renderer.autoClear = true;
8648
8691
  this.renderer.setPixelRatio(window.devicePixelRatio);
8649
8692
  this.renderer.toneMapping = NoToneMapping; // ACESFilmicToneMapping; // LinearToneMapping;
8650
8693
  this.renderer.shadowMap.enabled = true;
@@ -8707,7 +8750,7 @@ class SceneService {
8707
8750
  }
8708
8751
  else {
8709
8752
  this._postProcessing.render();
8710
- this._outlineService.render();
8753
+ // this._outlineService.render();
8711
8754
  }
8712
8755
  // this.renderer.render(this.scene, this._cameraService.camera);
8713
8756
  }
@@ -8788,7 +8831,7 @@ const modelEmpty = JSON.stringify(presetEmpty);
8788
8831
  // }
8789
8832
  //
8790
8833
  class PresetsService {
8791
- constructor(_appStateService, _permanentStoreService, _jsonUtils, _messageService, _settingsService, _configurationService, _storageService, _progressService, _sceneService) {
8834
+ constructor(_appStateService, _permanentStoreService, _jsonUtils, _messageService, _settingsService, _configurationService, _storageService, _progressService, _sceneService, _eventService) {
8792
8835
  this._appStateService = _appStateService;
8793
8836
  this._permanentStoreService = _permanentStoreService;
8794
8837
  this._jsonUtils = _jsonUtils;
@@ -8798,6 +8841,7 @@ class PresetsService {
8798
8841
  this._storageService = _storageService;
8799
8842
  this._progressService = _progressService;
8800
8843
  this._sceneService = _sceneService;
8844
+ this._eventService = _eventService;
8801
8845
  // public static presetsPath = '/assets/presets';
8802
8846
  this.isLoading = false;
8803
8847
  this.beforeLoad = new Subject();
@@ -8854,11 +8898,17 @@ class PresetsService {
8854
8898
  preset.model = JSON.stringify(json);
8855
8899
  }
8856
8900
  const modelObj = JSON.parse(preset.model);
8901
+ if (modelObj.floorplan && modelObj.floorplan.corners && Object.keys(modelObj.floorplan.corners).length > 0) {
8902
+ this._eventService.dirty.next(true);
8903
+ }
8857
8904
  return JSON.stringify(!modelObj.hasOwnProperty('needRescale') ? this._reScaleModel(modelObj) : modelObj);
8858
8905
  }));
8859
8906
  }
8860
8907
  _loadSavedRoomFromCloud(code) {
8861
- this._loadRoomPlan(() => new Promise(resolve => this._permanentStoreService.load(code).subscribe((json) => resolve(JSON.stringify(json)))));
8908
+ this._loadRoomPlan(() => new Promise(resolve => {
8909
+ this._eventService.dirty.next(true);
8910
+ this._permanentStoreService.load(code).subscribe((json) => resolve(JSON.stringify(json)));
8911
+ }));
8862
8912
  }
8863
8913
  _clear() {
8864
8914
  return __awaiter$11(this, void 0, void 0, function* () {
@@ -9036,14 +9086,14 @@ class PresetsService {
9036
9086
  }
9037
9087
  }
9038
9088
  }
9039
- PresetsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PresetsService, deps: [{ token: AppStateService }, { token: PermanentStoreService }, { token: JsonUtilsService }, { token: MessageBusService }, { token: HomedecoratorSettingsService }, { token: ConfigurationService }, { token: LocalStorageService }, { token: ProgressService }, { token: SceneService }], target: i0.ɵɵFactoryTarget.Injectable });
9089
+ PresetsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PresetsService, deps: [{ token: AppStateService }, { token: PermanentStoreService }, { token: JsonUtilsService }, { token: MessageBusService }, { token: HomedecoratorSettingsService }, { token: ConfigurationService }, { token: LocalStorageService }, { token: ProgressService }, { token: SceneService }, { token: HomedecoratorAppEventService }], target: i0.ɵɵFactoryTarget.Injectable });
9040
9090
  PresetsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PresetsService, providedIn: 'root' });
9041
9091
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PresetsService, decorators: [{
9042
9092
  type: Injectable,
9043
9093
  args: [{
9044
9094
  providedIn: 'root'
9045
9095
  }]
9046
- }], ctorParameters: function () { return [{ type: AppStateService }, { type: PermanentStoreService }, { type: JsonUtilsService }, { type: MessageBusService }, { type: HomedecoratorSettingsService }, { type: ConfigurationService }, { type: LocalStorageService }, { type: ProgressService }, { type: SceneService }]; } });
9096
+ }], ctorParameters: function () { return [{ type: AppStateService }, { type: PermanentStoreService }, { type: JsonUtilsService }, { type: MessageBusService }, { type: HomedecoratorSettingsService }, { type: ConfigurationService }, { type: LocalStorageService }, { type: ProgressService }, { type: SceneService }, { type: HomedecoratorAppEventService }]; } });
9047
9097
 
9048
9098
  var DeviceSizeType;
9049
9099
  (function (DeviceSizeType) {
@@ -12167,8 +12217,8 @@ class MediaResource {
12167
12217
  /* tslint:disable */
12168
12218
  const VersionInfo = {
12169
12219
  application: "Homedecorator",
12170
- appVersion: "255.1.2",
12171
- revision: "111849"
12220
+ appVersion: "255.1.4",
12221
+ revision: "112028"
12172
12222
  };
12173
12223
  /* tslint:enable */
12174
12224
 
@@ -12780,7 +12830,7 @@ class CustomShapeFloorItem extends FloorItem {
12780
12830
  });
12781
12831
  const origScale = this.metadata.scale ? new Vector3(1, 1, 1).divide(this.metadata.scale) : new Vector3(1, 1, 1);
12782
12832
  const metadata = Object.assign({}, this.metadata);
12783
- metadata.skin = this.skin;
12833
+ metadata.skin = Object.assign({}, this.skin);
12784
12834
  const copy = new CustomShapeFloorItem(metadata, new Mesh(this.customMesh.geometry.clone().scale(origScale.x, origScale.y, origScale.z), materialsCloned));
12785
12835
  copy.scaleGeometry(this.scale.x, this.scale.y, this.scale.z);
12786
12836
  copy.calculateHalfSize();
@@ -12826,7 +12876,7 @@ class CustomCylinderFloorItem extends FloorItem {
12826
12876
  });
12827
12877
  const origScale = this.metadata.scale ? new Vector3(1, 1, 1).divide(this.metadata.scale) : new Vector3(1, 1, 1);
12828
12878
  const metadata = Object.assign({}, this.metadata);
12829
- metadata.skin = this.skin;
12879
+ metadata.skin = Object.assign({}, this.skin);
12830
12880
  const copy = new CustomCylinderFloorItem(metadata, new Mesh(this.customMesh.geometry.clone().scale(origScale.x, origScale.y, origScale.z), materialsCloned));
12831
12881
  copy.scaleGeometry(this.scale.x, this.scale.y, this.scale.z);
12832
12882
  copy.calculateHalfSize();
@@ -13261,11 +13311,12 @@ var __awaiter$X = (this && this.__awaiter) || function (thisArg, _arguments, P,
13261
13311
  });
13262
13312
  };
13263
13313
  class FloorService {
13264
- constructor(_sceneService, _outlineService, _itemService, _settingsService) {
13314
+ constructor(_sceneService, _outlineService, _itemService, _settingsService, _messageService) {
13265
13315
  this._sceneService = _sceneService;
13266
13316
  this._outlineService = _outlineService;
13267
13317
  this._itemService = _itemService;
13268
13318
  this._settingsService = _settingsService;
13319
+ this._messageService = _messageService;
13269
13320
  this._floors = [];
13270
13321
  this._subs = [];
13271
13322
  this._subs.push(this._sceneService.sceneInitialized.subscribe((initialized) => {
@@ -13310,6 +13361,8 @@ class FloorService {
13310
13361
  else {
13311
13362
  this._updateFloorMaterial(this._floors[0], floorMaterial, texture);
13312
13363
  }
13364
+ // emit new texture for appearance-section
13365
+ this._messageService.emit(MessageType.ChangeTexture, texture);
13313
13366
  // room.floorColor = null;
13314
13367
  });
13315
13368
  }
@@ -13461,14 +13514,14 @@ class FloorService {
13461
13514
  return floorCenter;
13462
13515
  }
13463
13516
  }
13464
- FloorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FloorService, deps: [{ token: SceneService }, { token: OutlineService }, { token: ItemService }, { token: HomedecoratorSettingsService }], target: i0.ɵɵFactoryTarget.Injectable });
13517
+ FloorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FloorService, deps: [{ token: SceneService }, { token: OutlineService }, { token: ItemService }, { token: HomedecoratorSettingsService }, { token: MessageBusService }], target: i0.ɵɵFactoryTarget.Injectable });
13465
13518
  FloorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FloorService, providedIn: 'root' });
13466
13519
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FloorService, decorators: [{
13467
13520
  type: Injectable,
13468
13521
  args: [{
13469
13522
  providedIn: 'root'
13470
13523
  }]
13471
- }], ctorParameters: function () { return [{ type: SceneService }, { type: OutlineService }, { type: ItemService }, { type: HomedecoratorSettingsService }]; } });
13524
+ }], ctorParameters: function () { return [{ type: SceneService }, { type: OutlineService }, { type: ItemService }, { type: HomedecoratorSettingsService }, { type: MessageBusService }]; } });
13472
13525
 
13473
13526
  class CeilingService {
13474
13527
  constructor(_sceneService, _configurationService) {
@@ -13595,7 +13648,7 @@ class RoomService {
13595
13648
  this._subs = [];
13596
13649
  this._subs.push(this._appService.floorTexturesLoaded.subscribe((floors) => {
13597
13650
  if (floors) {
13598
- this._defaultFloorTexture = floors.find(f => f.default === true);
13651
+ this._defaultFloorTexture = floors.find(f => f.default === true && !f.useStandalone);
13599
13652
  }
13600
13653
  }), this._cameraService.cameraMovementChanged.subscribe(() => this._updateEdgeVisibility(this._cameraService.camera.position)), this._presetService.afterLoad.subscribe(() => this._updateEdgeVisibility(this._cameraService.camera.position)), this._viewModeService.viewModeChanged.subscribe((mode) => __awaiter$W(this, void 0, void 0, function* () {
13601
13654
  if ((mode === ViewMode.RoomPlan3D || mode === ViewMode.TopView) && !_arService.arModeHasBeenActive()) {
@@ -13814,6 +13867,9 @@ class RoomService {
13814
13867
  }
13815
13868
  });
13816
13869
  }
13870
+ resetAllRooms() {
13871
+ this.rooms = [];
13872
+ }
13817
13873
  _showHideWalls(show) {
13818
13874
  this.walls.forEach(w => w.showHideWall(show));
13819
13875
  this._sceneService.needsRender = true;
@@ -14954,7 +15010,7 @@ class CustomShapeWallItem extends WallItem {
14954
15010
  });
14955
15011
  const origScale = this.metadata.scale ? new Vector3(1, 1, 1).divide(this.metadata.scale) : new Vector3(1, 1, 1);
14956
15012
  const metadata = Object.assign({}, this.metadata);
14957
- metadata.skin = this.skin;
15013
+ metadata.skin = Object.assign({}, this.skin);
14958
15014
  const copy = new CustomShapeWallItem(metadata, new Mesh(this.customMesh.geometry.clone().scale(origScale.x, origScale.y, origScale.z), materialsCloned));
14959
15015
  copy.scaleGeometry(this.scale.x, this.scale.y, this.scale.z);
14960
15016
  copy.calculateHalfSize();
@@ -14998,7 +15054,7 @@ class CustomCylinderWallItem extends WallItem {
14998
15054
  });
14999
15055
  const origScale = this.metadata.scale ? new Vector3(1, 1, 1).divide(this.metadata.scale) : new Vector3(1, 1, 1);
15000
15056
  const metadata = Object.assign({}, this.metadata);
15001
- metadata.skin = this.skin;
15057
+ metadata.skin = Object.assign({}, this.skin);
15002
15058
  const copy = new CustomCylinderWallItem(metadata, new Mesh(this.customMesh.geometry.clone().scale(origScale.x, origScale.y, origScale.z), materialsCloned));
15003
15059
  copy.scaleGeometry(this.scale.x, this.scale.y, this.scale.z);
15004
15060
  copy.calculateHalfSize();
@@ -16908,7 +16964,7 @@ class ApiServiceModule {
16908
16964
  this.messageService.emit(MessageType.ShowLoadingIndicator, { title: 'Rendering...' });
16909
16965
  this.requestRender(filename, camera, standalone, renderParameters);
16910
16966
  }).catch(error => {
16911
- console.log(error);
16967
+ this.messageService.emit(MessageType.RenderError, { title: 'Upload error', message: error.message });
16912
16968
  });
16913
16969
  });
16914
16970
  }
@@ -16946,8 +17002,8 @@ class ApiServiceModule {
16946
17002
  return dataURL;
16947
17003
  };
16948
17004
  }
16949
- }).catch(err => {
16950
- console.log(err);
17005
+ }).catch(error => {
17006
+ this.messageService.emit(MessageType.RenderError, { title: 'Render error', message: error.message });
16951
17007
  });
16952
17008
  });
16953
17009
  }
@@ -21461,7 +21517,7 @@ class FloorTileIntersectionService {
21461
21517
  edge: 0,
21462
21518
  total: 0,
21463
21519
  };
21464
- console.log(floorMesh.position);
21520
+ // console.log(floorMesh.position);
21465
21521
  const { floorHits, edgeHits } = this._checkIntersection2(floorMesh, floorPattern, geometry);
21466
21522
  for (const floorHit of floorHits) {
21467
21523
  if (floorHit.isLeft) {
@@ -21610,7 +21666,6 @@ class BuildFurnitureService {
21610
21666
  this.arPlacementUpdate = new Subject();
21611
21667
  this.showElementToolbar = false;
21612
21668
  this.isMouseOverObject = false;
21613
- this.activeAnswers = [];
21614
21669
  this.standAloneFirstBuildReady = false;
21615
21670
  this._useNodeIdToLink = true;
21616
21671
  this._standAlone = false;
@@ -21826,21 +21881,13 @@ class BuildFurnitureService {
21826
21881
  }
21827
21882
  result.instanceId = result.metaData.itemId;
21828
21883
  this.startPosition = result.metaData.position ? result.metaData.position.clone() : new Vector3();
21829
- const questionAndAnswers = yield this._iOne.getQuestionAndAnswersAsync(); // see if there is user input needed
21830
- if (questionAndAnswers.question && !questionAndAnswers.question.grouped) {
21831
- this._iOne.handleAnswersReceived(questionAndAnswers.answers);
21832
- }
21833
- this._appEventService.answerCountReceived.next(questionAndAnswers.answers.length);
21834
- if (questionAndAnswers.answers.length === 0) {
21835
- this.activeAnswers = [];
21836
- this.activeQuestion = undefined;
21884
+ yield this._iOne.getQuestionAndAnswersAsync(); // see if there is user input needed
21885
+ if (this._iOne.activeAnswers.length === 0) {
21837
21886
  yield this._prepareSelectionsAndDecos(result)
21838
21887
  .catch((e) => Promise.reject(e));
21839
21888
  return this.build(result);
21840
21889
  }
21841
21890
  else {
21842
- this.activeQuestion = questionAndAnswers.question;
21843
- this.activeAnswers = questionAndAnswers.answers;
21844
21891
  if (firstBuild) {
21845
21892
  yield this._prepareSelectionsAndDecos(result)
21846
21893
  .catch((e) => Promise.reject(e));
@@ -22422,9 +22469,7 @@ class BuildFurnitureService {
22422
22469
  this._startToBuildFromConfigurator(metadata);
22423
22470
  }
22424
22471
  else if (getAnswers) { // if not rebuild then check if we need to get answers
22425
- const questionAndAnswers = yield this._iOne.getQuestionAndAnswersAsync(); // see if there is user input needed
22426
- this._iOne.handleAnswersReceived(questionAndAnswers.answers);
22427
- this._appEventService.answerCountReceived.next(questionAndAnswers.answers.length);
22472
+ yield this._iOne.getQuestionAndAnswersAsync(); // see if there is user input needed
22428
22473
  }
22429
22474
  });
22430
22475
  }
@@ -23640,7 +23685,7 @@ SelectedChildMaterialTextureComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVer
23640
23685
  </div>
23641
23686
  </div>
23642
23687
  <input #inputFile [accept]="'image/*'" (change)="handleFileChange($event)" type="file" hidden/>
23643
- `, isInline: true, styles: [".map-title-wrapper{display:flex;flex-direction:row;justify-content:space-between;height:30px}.map-title-wrapper .map-title{display:flex;align-items:center;font-size:12px}.map-title-wrapper .map-title img{height:30px;width:30px}.map-title-wrapper .collapse-wrapper{display:flex;flex-direction:row;grid-column-gap:10px;column-gap:10px}.map-title-wrapper .collapse-wrapper .collapse-handle.expanded{transition:all .2s}.map-title-wrapper .collapse-wrapper .collapse-handle.expanded .collapse-handle-icon{transform:rotate(180deg)}.map-title-wrapper img{height:30px;width:30px}.map-title-wrapper .no-image,.map-title-wrapper img{cursor:pointer;display:flex;height:30px;width:30px;border:1px solid;position:relative}.map-title-wrapper .no-image:before,.map-title-wrapper .no-image:after,.map-title-wrapper img:before,.map-title-wrapper img:after{content:\"\";position:absolute;width:42px;height:42px}.map-title-wrapper .no-image:after,.map-title-wrapper img:after{border-bottom:1px solid;transform:rotate(135deg);top:8px;left:9px}.map-title-wrapper .no-image:before,.map-title-wrapper img:before{border-top:1px solid;transform:rotate(45deg);top:8px;left:-21px}.map-content{display:grid;grid-template-areas:\"label value\";grid-template-columns:175px 1fr;margin-left:10px}.map-content .label{grid-area:label;grid-row:auto;display:flex;align-items:center;border-bottom:1px solid #d3d3d3}.map-content .value{grid-area:value;grid-row:auto;display:flex;height:35px;align-items:center;border-bottom:1px solid #d3d3d3}.map-content .value>*{display:flex;flex-basis:auto;flex-grow:1;flex-shrink:1;width:100%}.map-content .no-image,.map-content img{height:50px;width:50px;border:1px solid}.large-image-viewer{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);z-index:999}.large-image-viewer .large-image-viewer-content{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-height:100vh;max-width:100vw}.large-image-viewer .large-image-viewer-content img{border:1px solid white}.large-image-viewer .large-image-viewer-content .large-image-viewer-close{cursor:pointer;position:absolute;top:0;right:0;background:rgba(255,255,255,.5)}\n"], components: [{ type: i4.ɵb, selector: "co-icon", inputs: ["icon", "iconData"] }, { type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i9.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i8.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: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i8.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }], animations: [
23688
+ `, isInline: true, styles: [".map-title-wrapper{display:flex;flex-direction:row;justify-content:space-between;height:30px}.map-title-wrapper .map-title{display:flex;align-items:center;font-size:12px}.map-title-wrapper .map-title img{height:30px;width:30px}.map-title-wrapper .collapse-wrapper{display:flex;flex-direction:row;grid-column-gap:10px;column-gap:10px}.map-title-wrapper .collapse-wrapper .collapse-handle.expanded{transition:all .2s}.map-title-wrapper .collapse-wrapper .collapse-handle.expanded .collapse-handle-icon{transform:rotate(180deg)}.map-title-wrapper img{height:30px;width:30px}.map-title-wrapper .no-image,.map-title-wrapper img{cursor:pointer;display:flex;height:30px;width:30px;border:1px solid;position:relative}.map-title-wrapper .no-image:before,.map-title-wrapper .no-image:after,.map-title-wrapper img:before,.map-title-wrapper img:after{content:\"\";position:absolute;width:42px;height:42px}.map-title-wrapper .no-image:after,.map-title-wrapper img:after{border-bottom:1px solid;transform:rotate(135deg);top:8px;left:9px}.map-title-wrapper .no-image:before,.map-title-wrapper img:before{border-top:1px solid;transform:rotate(45deg);top:8px;left:-21px}.map-content{display:grid;grid-template-areas:\"label value\";grid-template-columns:175px 1fr;margin-left:10px}.map-content .label{grid-area:label;grid-row:auto;display:flex;align-items:center;border-bottom:1px solid #d3d3d3}.map-content .value{grid-area:value;grid-row:auto;display:flex;height:35px;align-items:center;border-bottom:1px solid #d3d3d3}.map-content .value>*{display:flex;flex-basis:auto;flex-grow:1;flex-shrink:1;width:100%}.map-content .no-image,.map-content img{height:50px;width:50px;border:1px solid}.large-image-viewer{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);z-index:999}.large-image-viewer .large-image-viewer-content{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-height:100vh;max-width:100vw}.large-image-viewer .large-image-viewer-content img{border:1px solid white}.large-image-viewer .large-image-viewer-content .large-image-viewer-close{cursor:pointer;position:absolute;top:0;right:0;background:rgba(255,255,255,.5)}\n"], components: [{ type: i4.ɵb, selector: "co-icon", inputs: ["icon", "iconData"] }, { type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i8.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: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i8.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }], animations: [
23644
23689
  trigger('showHideMapContent', [
23645
23690
  state('void', style({ 'height': '0', opacity: 0 })),
23646
23691
  state('*', style({ 'height': '*', opacity: 1 })),
@@ -24311,7 +24356,7 @@ SelectedChildMaterialComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
24311
24356
  </div>
24312
24357
  </div>
24313
24358
  </ng-container>
24314
- `, isInline: true, styles: [".development-selected-child-material-wrapper{font-size:12px;position:fixed;right:0;top:65px;width:400px;height:100%;background:white;box-shadow:0 0 4px #01010180;z-index:10}.development-selected-child-material-wrapper .material-map-wrapper{padding:10px;height:calc(100% - 85px);overflow-y:auto;overflow-x:hidden}.development-selected-child-material-wrapper .selected-child-material-content{display:grid;grid-template-areas:\"label value\";grid-template-columns:175px 1fr}.development-selected-child-material-wrapper .title{font-size:14px;font-weight:bold;margin-bottom:10px}.development-selected-child-material-wrapper .label{grid-area:label;grid-row:auto;display:flex;align-items:center;height:30px;border-bottom:1px solid #9bb0d0;background-color:#e4edf4}.development-selected-child-material-wrapper .value{grid-area:value;grid-row:auto;display:flex;align-items:center;height:30px;border-bottom:1px solid #9bb0d0;background-color:#e4edf4}\n"], components: [{ type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4.ɵb, selector: "co-icon", inputs: ["icon", "iconData"] }, { type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i9.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: SelectedChildMaterialTextureComponent, selector: "development-selected-child-material-texture", inputs: ["map", "title"], outputs: ["mapChange"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i8.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: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i8.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }], pipes: { "localize": LocalizePipe } });
24359
+ `, isInline: true, styles: [".development-selected-child-material-wrapper{font-size:12px;position:fixed;right:0;top:65px;width:400px;height:100%;background:white;box-shadow:0 0 4px #01010180;z-index:10}.development-selected-child-material-wrapper .material-map-wrapper{padding:10px;height:calc(100% - 85px);overflow-y:auto;overflow-x:hidden}.development-selected-child-material-wrapper .selected-child-material-content{display:grid;grid-template-areas:\"label value\";grid-template-columns:175px 1fr}.development-selected-child-material-wrapper .title{font-size:14px;font-weight:bold;margin-bottom:10px}.development-selected-child-material-wrapper .label{grid-area:label;grid-row:auto;display:flex;align-items:center;height:30px;border-bottom:1px solid #9bb0d0;background-color:#e4edf4}.development-selected-child-material-wrapper .value{grid-area:value;grid-row:auto;display:flex;align-items:center;height:30px;border-bottom:1px solid #9bb0d0;background-color:#e4edf4}\n"], components: [{ type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4.ɵb, selector: "co-icon", inputs: ["icon", "iconData"] }, { type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: SelectedChildMaterialTextureComponent, selector: "development-selected-child-material-texture", inputs: ["map", "title"], outputs: ["mapChange"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i8.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: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i8.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }], pipes: { "localize": LocalizePipe } });
24315
24360
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SelectedChildMaterialComponent, decorators: [{
24316
24361
  type: Component,
24317
24362
  args: [{
@@ -25558,7 +25603,7 @@ class EditLightComponent {
25558
25603
  }
25559
25604
  }
25560
25605
  EditLightComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: EditLightComponent, deps: [{ token: SceneService }, { token: LightsService }], target: i0.ɵɵFactoryTarget.Component });
25561
- EditLightComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: EditLightComponent, selector: "edit-light", inputs: { light: "light" }, outputs: { okClick: "okClick", cancelClick: "cancelClick" }, host: { listeners: { "document:mousemove": "moveDialog($event)", "document:mouseup": "cancelMoveDialog($event)" } }, viewQueries: [{ propertyName: "dialogElement", first: true, predicate: ["dialog"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<div class=\"edit-popup\" #dialog @showHideDialog [style.top.px]=\"top\" [style.left.px]=\"left\">\r\n <div class=\"title-bar\">\r\n <div class=\"title-bar-move\" (mousedown)=\"handleTitleMouseMove($event)\">\r\n <div class=\"title-description\" [textContent]=\"'EDIT' | localize\"></div>\r\n </div>\r\n <button mat-icon-button class=\"hide-dialog\" (click)=\"hidePopup()\">\r\n <mat-icon class=\"homedecorator-material-icons\" aria-hidden=\"true\">close</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"edit-popup-wrapper\">\r\n <mat-form-field class=\"full-width\">\r\n <mat-label [textContent]=\"'NAME' | localize\"></mat-label>\r\n <input matInput [(ngModel)]=\"light.name\">\r\n </mat-form-field>\r\n <div class=\"key-value-grid\">\r\n <span class=\"key\" [textContent]=\"'VISIBLE' | localize\"></span>\r\n <mat-checkbox class=\"value\" [(ngModel)]=\"light.visible\" (ngModelChange)=\"render()\"></mat-checkbox>\r\n <span class=\"value-readonly\"></span>\r\n\r\n <ng-container *ngIf=\"light.type === 'DirectionalLight'\">\r\n <span class=\"key\" [textContent]=\"'TOP-DOWN-DIRECTIONAL' | localize\"></span>\r\n <mat-checkbox class=\"value\" [(ngModel)]=\"light.userData.topDownDirectional\" (ngModelChange)=\"this.updateOffsets(light)\"></mat-checkbox>\r\n <span class=\"value-readonly\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"hasPosition && !light.userData.topDownDirectional\">\r\n\r\n <span class=\"key\" [textContent]=\"'WALL-OFFSET'\"></span>\r\n <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"50\" step=\"1\" [(ngModel)]=\"light.userData.wallOffset\" (ngModelChange)=\"this.updateOffsets(light)\"></mat-slider>\r\n <input matInput type=\"number\" [(ngModel)]=\"light.userData.wallOffset\" (ngModelChange)=\"render()\">\r\n\r\n <span class=\"key\" [textContent]=\"'ROTATION-OFFSET'\"></span>\r\n <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"359\" step=\"1\" [(ngModel)]=\"light.userData.rotationOffset\" (ngModelChange)=\"this.updateOffsets(light)\"></mat-slider>\r\n <input matInput type=\"number\" [(ngModel)]=\"light.userData.rotationOffset\" (ngModelChange)=\"render()\">\r\n\r\n <span class=\"key\" [textContent]=\"'Y'\"></span>\r\n <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"50\" step=\"1\" [(ngModel)]=\"light.position.y\" (ngModelChange)=\"render()\"></mat-slider>\r\n <input matInput type=\"number\" [(ngModel)]=\"light.position.y\" (ngModelChange)=\"render()\">\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"light.hasOwnProperty('color')\">\r\n <span class=\"key\" [textContent]=\"'COLOR' | localize\"></span>\r\n <input class=\"value\" type=\"color\" matInput [ngModel]=\"lightColor\" (ngModelChange)=\"changeLightColor($event)\">\r\n <span class=\"value-readonly\" [textContent]=\"lightColor\"></span>\r\n </ng-container>\r\n <ng-container *ngIf=\"light.hasOwnProperty('groundColor')\">\r\n <span class=\"key\" [textContent]=\"'GROUND_COLOR' | localize\"></span>\r\n <input class=\"value\" type=\"color\" matInput [ngModel]=\"lightGroundColor\" (ngModelChange)=\"changeGroundLightColor($event)\">\r\n <span class=\"value-readonly\" [textContent]=\"lightGroundColor\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"light.hasOwnProperty('intensity')\">\r\n <span class=\"key\" [textContent]=\"'INTENSITY' | localize\"></span>\r\n <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"20\" step=\"0.01\" [(ngModel)]=\"light.intensity\" (ngModelChange)=\"render()\"></mat-slider>\r\n <input matInput type=\"number\" [(ngModel)]=\"light.intensity\" (ngModelChange)=\"render()\">\r\n </ng-container>\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('angle')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'ANGLE' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"20\" step=\"0.01\" [(ngModel)]=\"light.angle\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [(ngModel)]=\"light.angle\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('power')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'POWER' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"20\" step=\"0.01\" [(ngModel)]=\"light.power\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [(ngModel)]=\"light.power\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('decay')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'DECAY' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"4\" step=\"0.001\" [(ngModel)]=\"light.decay\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [(ngModel)]=\"light.decay\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('distance')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'DISTANCE' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"20\" step=\"0.01\" [(ngModel)]=\"light.distance\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [(ngModel)]=\"light.distance\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('penumbra')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'PENUMBRA' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"1\" step=\"0.01\" [(ngModel)]=\"light.penumbra\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [(ngModel)]=\"light.penumbra\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('bias')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'BIAS' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"20\" step=\"0.01\" [(ngModel)]=\"light.bias\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [(ngModel)]=\"light.bias\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('radius')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'RADIUS' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"20\" step=\"0.01\" [(ngModel)]=\"light.radius\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [value]=\"!light.radius ? 0 : light.radius\" [(ngModel)]=\"light.radius\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n <ng-container *ngIf=\"light.hasOwnProperty('castShadow')\">\r\n <span class=\"key\" [textContent]=\"'CAST_SHADOW' | localize\"></span>\r\n <mat-checkbox class=\"value\" [(ngModel)]=\"light.castShadow\" (ngModelChange)=\"render()\"></mat-checkbox>\r\n <span class=\"value-readonly\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"light.hasOwnProperty('shadow')\">\r\n <span class=\"key\" [textContent]=\"'NEAR' | localize\"></span>\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"50\" step=\"1\" [(ngModel)]=\"light.shadow.near\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [value]=\"light.shadow.near\" [(ngModel)]=\"light.shadow.near\" (ngModelChange)=\"render()\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'FAR' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"50\" step=\"1\" [(ngModel)]=\"light.shadow.far\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [value]=\"light.shadow.far\" [(ngModel)]=\"light.shadow.far\" (ngModelChange)=\"render()\">-->\r\n <span class=\"key\" [textContent]=\"'SHADOW_MAPSIZE' | localize\"></span>\r\n <mat-select class=\"dropdown-container\" [value]=\"light.shadow.mapSize.x\">\r\n <mat-option *ngFor=\"let mapSize of mapSizes\" [value]=\"mapSize\" (click)=\"updateShadowMapSize(mapSize)\">\r\n {{ mapSize }}\r\n </mat-option>\r\n </mat-select>\r\n <span class=\"value-readonly\"></span>\r\n <span class=\"key\" [textContent]=\"'SHADOW_MAP_RADIUS' | localize\"></span>\r\n <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"5\" step=\"0.1\" [(ngModel)]=\"light.shadow.radius\" (ngModelChange)=\"updateShadowMap()\"></mat-slider>\r\n <input matInput type=\"number\" [placeholder]=\"0\" [value]=\"light.shadow.radius\" [(ngModel)]=\"light.shadow.radius\" (ngModelChange)=\"updateShadowMap()\">\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"hasHelper\">\r\n <span class=\"key\" [textContent]=\"'HELPER' | localize\"></span>\r\n <mat-checkbox class=\"value\" [ngModel]=\"lightHelper\" (ngModelChange)=\"showHideHelper($event)\"></mat-checkbox>\r\n <span class=\"value-readonly\"></span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"button-wrapper\">\r\n <button mat-button class=\"custom-button\" (click)=\"cancel()\">\r\n <mat-icon class=\"homedecorator-material-icons\" aria-hidden=\"true\">cancel</mat-icon>\r\n {{ 'CANCEL' | localize}}\r\n </button>\r\n <button mat-button class=\"custom-button\" (click)=\"save()\">\r\n <mat-icon class=\"homedecorator-material-icons\" aria-hidden=\"true\">save</mat-icon>\r\n {{ 'SAVE' | localize}}\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [":host .edit-wrapper{display:flex;flex-direction:row;align-items:center}:host .custom-button{font-size:11px;border:1px solid #3760a1;border-radius:25px}:host .edit-popup{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:1px 1px 3px 2px #0101014d;background:white;min-height:400px;min-width:500px;display:flex;flex-direction:column;z-index:905}:host .edit-popup .title-bar{display:flex;justify-content:space-between;background:#3760a1;color:#fff;padding-left:10px}:host .edit-popup .title-bar .title-bar-move{display:flex;flex-basis:100%;align-items:center}:host .edit-popup .title-bar .title-bar-move .title-description{-webkit-user-select:none;user-select:none}:host .edit-popup .title-bar mat-icon{color:#fff}:host .edit-popup .edit-popup-wrapper{padding:15px;font-size:14px;overflow-y:auto}:host .edit-popup .button-wrapper{display:flex;align-items:center;justify-content:flex-end;height:60px;padding:10px;bottom:0;right:0}:host .edit-popup .button-wrapper .custom-button:not(last-child){margin-right:10px}:host .edit-popup .full-width{width:100%}:host .edit-popup .key-value-grid{display:grid;grid-template-columns:30% 60% 10%;grid-auto-rows:30px}:host .edit-popup .key-value-grid .key,:host .edit-popup .key-value-grid .value,:host .edit-popup .key-value-grid .value-readonly{align-self:center}:host .edit-popup .key-value-grid mat-slider{height:30px}:host .edit-popup .key-value-grid ::ng-deep .mat-slider-horizontal .mat-slider-wrapper{top:50%}:host .dropdown-container{display:flex;flex-direction:column;justify-content:center}\n"], components: [{ type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i1$2.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i7$1.MatSlider, selector: "mat-slider", inputs: ["disabled", "color", "tabIndex", "invert", "max", "min", "step", "thumbLabel", "tickInterval", "value", "vertical", "displayWith", "valueText"], outputs: ["change", "input", "valueChange"], exportAs: ["matSlider"] }, { type: i9.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i7.MatLabel, selector: "mat-label" }, { type: i19.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i8.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: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "localize": LocalizePipe }, animations: [
25606
+ EditLightComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: EditLightComponent, selector: "edit-light", inputs: { light: "light" }, outputs: { okClick: "okClick", cancelClick: "cancelClick" }, host: { listeners: { "document:mousemove": "moveDialog($event)", "document:mouseup": "cancelMoveDialog($event)" } }, viewQueries: [{ propertyName: "dialogElement", first: true, predicate: ["dialog"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<div class=\"edit-popup\" #dialog @showHideDialog [style.top.px]=\"top\" [style.left.px]=\"left\">\r\n <div class=\"title-bar\">\r\n <div class=\"title-bar-move\" (mousedown)=\"handleTitleMouseMove($event)\">\r\n <div class=\"title-description\" [textContent]=\"'EDIT' | localize\"></div>\r\n </div>\r\n <button mat-icon-button class=\"hide-dialog\" (click)=\"hidePopup()\">\r\n <mat-icon class=\"homedecorator-material-icons\" aria-hidden=\"true\">close</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"edit-popup-wrapper\">\r\n <mat-form-field class=\"full-width\">\r\n <mat-label [textContent]=\"'NAME' | localize\"></mat-label>\r\n <input matInput [(ngModel)]=\"light.name\">\r\n </mat-form-field>\r\n <div class=\"key-value-grid\">\r\n <span class=\"key\" [textContent]=\"'VISIBLE' | localize\"></span>\r\n <mat-checkbox class=\"value\" [(ngModel)]=\"light.visible\" (ngModelChange)=\"render()\"></mat-checkbox>\r\n <span class=\"value-readonly\"></span>\r\n\r\n <ng-container *ngIf=\"light.type === 'DirectionalLight'\">\r\n <span class=\"key\" [textContent]=\"'TOP-DOWN-DIRECTIONAL' | localize\"></span>\r\n <mat-checkbox class=\"value\" [(ngModel)]=\"light.userData.topDownDirectional\" (ngModelChange)=\"this.updateOffsets(light)\"></mat-checkbox>\r\n <span class=\"value-readonly\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"hasPosition && !light.userData.topDownDirectional\">\r\n\r\n <span class=\"key\" [textContent]=\"'WALL-OFFSET'\"></span>\r\n <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"50\" step=\"1\" [(ngModel)]=\"light.userData.wallOffset\" (ngModelChange)=\"this.updateOffsets(light)\"></mat-slider>\r\n <input matInput type=\"number\" [(ngModel)]=\"light.userData.wallOffset\" (ngModelChange)=\"render()\">\r\n\r\n <span class=\"key\" [textContent]=\"'ROTATION-OFFSET'\"></span>\r\n <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"359\" step=\"1\" [(ngModel)]=\"light.userData.rotationOffset\" (ngModelChange)=\"this.updateOffsets(light)\"></mat-slider>\r\n <input matInput type=\"number\" [(ngModel)]=\"light.userData.rotationOffset\" (ngModelChange)=\"render()\">\r\n\r\n <span class=\"key\" [textContent]=\"'Y'\"></span>\r\n <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"50\" step=\"1\" [(ngModel)]=\"light.position.y\" (ngModelChange)=\"render()\"></mat-slider>\r\n <input matInput type=\"number\" [(ngModel)]=\"light.position.y\" (ngModelChange)=\"render()\">\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"light.hasOwnProperty('color')\">\r\n <span class=\"key\" [textContent]=\"'COLOR' | localize\"></span>\r\n <input class=\"value\" type=\"color\" matInput [ngModel]=\"lightColor\" (ngModelChange)=\"changeLightColor($event)\">\r\n <span class=\"value-readonly\" [textContent]=\"lightColor\"></span>\r\n </ng-container>\r\n <ng-container *ngIf=\"light.hasOwnProperty('groundColor')\">\r\n <span class=\"key\" [textContent]=\"'GROUND_COLOR' | localize\"></span>\r\n <input class=\"value\" type=\"color\" matInput [ngModel]=\"lightGroundColor\" (ngModelChange)=\"changeGroundLightColor($event)\">\r\n <span class=\"value-readonly\" [textContent]=\"lightGroundColor\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"light.hasOwnProperty('intensity')\">\r\n <span class=\"key\" [textContent]=\"'INTENSITY' | localize\"></span>\r\n <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"20\" step=\"0.01\" [(ngModel)]=\"light.intensity\" (ngModelChange)=\"render()\"></mat-slider>\r\n <input matInput type=\"number\" [(ngModel)]=\"light.intensity\" (ngModelChange)=\"render()\">\r\n </ng-container>\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('angle')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'ANGLE' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"20\" step=\"0.01\" [(ngModel)]=\"light.angle\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [(ngModel)]=\"light.angle\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('power')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'POWER' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"20\" step=\"0.01\" [(ngModel)]=\"light.power\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [(ngModel)]=\"light.power\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('decay')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'DECAY' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"4\" step=\"0.001\" [(ngModel)]=\"light.decay\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [(ngModel)]=\"light.decay\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('distance')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'DISTANCE' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"20\" step=\"0.01\" [(ngModel)]=\"light.distance\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [(ngModel)]=\"light.distance\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('penumbra')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'PENUMBRA' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"1\" step=\"0.01\" [(ngModel)]=\"light.penumbra\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [(ngModel)]=\"light.penumbra\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('bias')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'BIAS' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"20\" step=\"0.01\" [(ngModel)]=\"light.bias\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [(ngModel)]=\"light.bias\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n<!-- <ng-container *ngIf=\"light.hasOwnProperty('radius')\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'RADIUS' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"20\" step=\"0.01\" [(ngModel)]=\"light.radius\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [value]=\"!light.radius ? 0 : light.radius\" [(ngModel)]=\"light.radius\" (ngModelChange)=\"render()\">-->\r\n<!-- </ng-container>-->\r\n\r\n <ng-container *ngIf=\"light.hasOwnProperty('castShadow')\">\r\n <span class=\"key\" [textContent]=\"'CAST_SHADOW' | localize\"></span>\r\n <mat-checkbox class=\"value\" [(ngModel)]=\"light.castShadow\" (ngModelChange)=\"render()\"></mat-checkbox>\r\n <span class=\"value-readonly\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"light.hasOwnProperty('shadow')\">\r\n <span class=\"key\" [textContent]=\"'NEAR' | localize\"></span>\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"50\" step=\"1\" [(ngModel)]=\"light.shadow.near\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [value]=\"light.shadow.near\" [(ngModel)]=\"light.shadow.near\" (ngModelChange)=\"render()\">-->\r\n<!-- <span class=\"key\" [textContent]=\"'FAR' | localize\"></span>-->\r\n<!-- <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"50\" step=\"1\" [(ngModel)]=\"light.shadow.far\" (ngModelChange)=\"render()\"></mat-slider>-->\r\n<!-- <input matInput type=\"number\" [placeholder]=\"0\" [value]=\"light.shadow.far\" [(ngModel)]=\"light.shadow.far\" (ngModelChange)=\"render()\">-->\r\n <span class=\"key\" [textContent]=\"'SHADOW_MAPSIZE' | localize\"></span>\r\n <mat-select class=\"dropdown-container\" [value]=\"light.shadow.mapSize.x\">\r\n <mat-option *ngFor=\"let mapSize of mapSizes\" [value]=\"mapSize\" (click)=\"updateShadowMapSize(mapSize)\">\r\n {{ mapSize }}\r\n </mat-option>\r\n </mat-select>\r\n <span class=\"value-readonly\"></span>\r\n <span class=\"key\" [textContent]=\"'SHADOW_MAP_RADIUS' | localize\"></span>\r\n <mat-slider class=\"value\" thumbLabel min=\"0\" max=\"5\" step=\"0.1\" [(ngModel)]=\"light.shadow.radius\" (ngModelChange)=\"updateShadowMap()\"></mat-slider>\r\n <input matInput type=\"number\" [placeholder]=\"0\" [value]=\"light.shadow.radius\" [(ngModel)]=\"light.shadow.radius\" (ngModelChange)=\"updateShadowMap()\">\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"hasHelper\">\r\n <span class=\"key\" [textContent]=\"'HELPER' | localize\"></span>\r\n <mat-checkbox class=\"value\" [ngModel]=\"lightHelper\" (ngModelChange)=\"showHideHelper($event)\"></mat-checkbox>\r\n <span class=\"value-readonly\"></span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"button-wrapper\">\r\n <button mat-button class=\"custom-button\" (click)=\"cancel()\">\r\n <mat-icon class=\"homedecorator-material-icons\" aria-hidden=\"true\">cancel</mat-icon>\r\n {{ 'CANCEL' | localize}}\r\n </button>\r\n <button mat-button class=\"custom-button\" (click)=\"save()\">\r\n <mat-icon class=\"homedecorator-material-icons\" aria-hidden=\"true\">save</mat-icon>\r\n {{ 'SAVE' | localize}}\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [":host .edit-wrapper{display:flex;flex-direction:row;align-items:center}:host .custom-button{font-size:11px;border:1px solid #3760a1;border-radius:25px}:host .edit-popup{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:1px 1px 3px 2px #0101014d;background:white;min-height:400px;min-width:500px;display:flex;flex-direction:column;z-index:905}:host .edit-popup .title-bar{display:flex;justify-content:space-between;background:#3760a1;color:#fff;padding-left:10px}:host .edit-popup .title-bar .title-bar-move{display:flex;flex-basis:100%;align-items:center}:host .edit-popup .title-bar .title-bar-move .title-description{-webkit-user-select:none;user-select:none}:host .edit-popup .title-bar mat-icon{color:#fff}:host .edit-popup .edit-popup-wrapper{padding:15px;font-size:14px;overflow-y:auto}:host .edit-popup .button-wrapper{display:flex;align-items:center;justify-content:flex-end;height:60px;padding:10px;bottom:0;right:0}:host .edit-popup .button-wrapper .custom-button:not(last-child){margin-right:10px}:host .edit-popup .full-width{width:100%}:host .edit-popup .key-value-grid{display:grid;grid-template-columns:30% 60% 10%;grid-auto-rows:30px}:host .edit-popup .key-value-grid .key,:host .edit-popup .key-value-grid .value,:host .edit-popup .key-value-grid .value-readonly{align-self:center}:host .edit-popup .key-value-grid mat-slider{height:30px}:host .edit-popup .key-value-grid ::ng-deep .mat-slider-horizontal .mat-slider-wrapper{top:50%}:host .dropdown-container{display:flex;flex-direction:column;justify-content:center}\n"], components: [{ type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i1$2.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i7$1.MatSlider, selector: "mat-slider", inputs: ["disabled", "color", "tabIndex", "invert", "max", "min", "step", "thumbLabel", "tickInterval", "value", "vertical", "displayWith", "valueText"], outputs: ["change", "input", "valueChange"], exportAs: ["matSlider"] }, { type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i7.MatLabel, selector: "mat-label" }, { type: i19.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i8.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: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "localize": LocalizePipe }, animations: [
25562
25607
  trigger('showHideDialog', [
25563
25608
  state('void', style({ opacity: 0 })),
25564
25609
  state('*', style({ opacity: 1 })),
@@ -25715,7 +25760,7 @@ EditLightplanComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
25715
25760
  </button>
25716
25761
  </div>
25717
25762
  </div>
25718
- `, isInline: true, styles: [":host .edit-wrapper{display:flex;flex-direction:row;align-items:center}:host .custom-button{font-size:11px;border:1px solid #3760a1;border-radius:25px}:host .edit-popup{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:1px 1px 3px 2px #0101014d;background:white;display:flex;flex-direction:column;z-index:905}:host .edit-popup .title-bar{display:flex;justify-content:space-between;align-items:center;height:40px;background:#3760a1;color:#fff;padding-left:10px}:host .edit-popup .title-bar .title-bar-move{display:flex;flex-basis:100%;align-items:center}:host .edit-popup .title-bar .title-bar-move .title-description{-webkit-user-select:none;user-select:none}:host .edit-popup .title-bar mat-icon{color:#fff}:host .edit-popup .edit-popup-wrapper{padding:10px;font-size:12px;overflow-y:auto}:host .edit-popup .button-wrapper{display:flex;align-items:center;justify-content:flex-end;height:60px;padding:10px;bottom:0;right:0}:host .edit-popup .button-wrapper .custom-button:not(last-child){margin-right:10px}:host .edit-popup .full-width{width:100%}:host .edit-popup .key-value-grid{display:grid;grid-template-columns:40% 50% 10%;grid-auto-rows:30px}:host .edit-popup .key-value-grid .key,:host .edit-popup .key-value-grid .value,:host .edit-popup .key-value-grid .value-readonly{align-self:center}:host .edit-popup .key-value-grid mat-slider{height:30px}:host .edit-popup .key-value-grid ::ng-deep .mat-slider-horizontal .mat-slider-wrapper{top:50%}:host .dropdown-container{display:flex;flex-direction:column;justify-content:center}\n"], components: [{ type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i9.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i7$1.MatSlider, selector: "mat-slider", inputs: ["disabled", "color", "tabIndex", "invert", "max", "min", "step", "thumbLabel", "tickInterval", "value", "vertical", "displayWith", "valueText"], outputs: ["change", "input", "valueChange"], exportAs: ["matSlider"] }, { type: i1$2.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i7.MatLabel, selector: "mat-label" }, { type: i19.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i8.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: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }], pipes: { "localize": LocalizePipe, "keys": KeysPipe } });
25763
+ `, isInline: true, styles: [":host .edit-wrapper{display:flex;flex-direction:row;align-items:center}:host .custom-button{font-size:11px;border:1px solid #3760a1;border-radius:25px}:host .edit-popup{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:1px 1px 3px 2px #0101014d;background:white;display:flex;flex-direction:column;z-index:905}:host .edit-popup .title-bar{display:flex;justify-content:space-between;align-items:center;height:40px;background:#3760a1;color:#fff;padding-left:10px}:host .edit-popup .title-bar .title-bar-move{display:flex;flex-basis:100%;align-items:center}:host .edit-popup .title-bar .title-bar-move .title-description{-webkit-user-select:none;user-select:none}:host .edit-popup .title-bar mat-icon{color:#fff}:host .edit-popup .edit-popup-wrapper{padding:10px;font-size:12px;overflow-y:auto}:host .edit-popup .button-wrapper{display:flex;align-items:center;justify-content:flex-end;height:60px;padding:10px;bottom:0;right:0}:host .edit-popup .button-wrapper .custom-button:not(last-child){margin-right:10px}:host .edit-popup .full-width{width:100%}:host .edit-popup .key-value-grid{display:grid;grid-template-columns:40% 50% 10%;grid-auto-rows:30px}:host .edit-popup .key-value-grid .key,:host .edit-popup .key-value-grid .value,:host .edit-popup .key-value-grid .value-readonly{align-self:center}:host .edit-popup .key-value-grid mat-slider{height:30px}:host .edit-popup .key-value-grid ::ng-deep .mat-slider-horizontal .mat-slider-wrapper{top:50%}:host .dropdown-container{display:flex;flex-direction:column;justify-content:center}\n"], components: [{ type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i7$1.MatSlider, selector: "mat-slider", inputs: ["disabled", "color", "tabIndex", "invert", "max", "min", "step", "thumbLabel", "tickInterval", "value", "vertical", "displayWith", "valueText"], outputs: ["change", "input", "valueChange"], exportAs: ["matSlider"] }, { type: i1$2.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i7.MatLabel, selector: "mat-label" }, { type: i19.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i8.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: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }], pipes: { "localize": LocalizePipe, "keys": KeysPipe } });
25719
25764
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: EditLightplanComponent, decorators: [{
25720
25765
  type: Component,
25721
25766
  args: [{
@@ -26102,7 +26147,7 @@ LightplanComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
26102
26147
  (saveClick)="savePreset($event)"
26103
26148
  (cancelClick)="showPlanEditPopup = false"
26104
26149
  ></edit-lightplan>
26105
- `, isInline: true, styles: [":host.popup-showing .lightplan-wrapper{opacity:.1!important}:host.show{display:flex}:host .lightplan-wrapper{opacity:1;position:fixed;background:white;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:1px 1px 3px 2px #0101014d;z-index:904}:host .lightplan-wrapper .scene-lights{max-height:300px;overflow-y:auto}:host .title-bar{display:flex;justify-content:flex-end;background:#3760a1}:host .title-bar mat-icon{color:#fff}:host .title-bar .title-bar-move{display:flex;flex-basis:100%}:host .content-wrapper{font-size:14px;padding:15px;background:white;min-height:400px;min-width:500px;display:flex;flex-direction:column;max-height:500px;overflow-y:auto}:host .section:not(last-child){margin-bottom:20px}:host .button-wrapper{display:flex;height:60px;align-items:center;justify-content:flex-end}:host .edit-wrapper{display:flex;flex-direction:row;align-items:center;justify-content:space-between}:host .edit-button-wrapper{display:flex}:host h4{margin:10px 0}:host .edit-lightplan-wrapper{display:flex}:host .light-preset-selection{display:flex}:host .button-row{display:flex}:host .add-light{font-size:11px;border:1px solid #3760a1;border-radius:25px}:host .add-light:not(last-child){margin-right:5px}:host .dropdown-container{align-self:center}:host .section-row{display:flex;flex-direction:row;justify-content:space-between}::ng-deep .cdk-overlay-container .mat-select-panel .mat-option-text{display:flex;justify-content:space-between;align-items:center}\n"], components: [{ type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i9.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: EditLightComponent, selector: "edit-light", inputs: ["light"], outputs: ["okClick", "cancelClick"] }, { type: EditLightplanComponent, selector: "edit-lightplan", inputs: ["lightPreset"], outputs: ["saveClick", "cancelClick"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i9.MatSelectTrigger, selector: "mat-select-trigger" }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "localize": LocalizePipe }, animations: [
26150
+ `, isInline: true, styles: [":host.popup-showing .lightplan-wrapper{opacity:.1!important}:host.show{display:flex}:host .lightplan-wrapper{opacity:1;position:fixed;background:white;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:1px 1px 3px 2px #0101014d;z-index:904}:host .lightplan-wrapper .scene-lights{max-height:300px;overflow-y:auto}:host .title-bar{display:flex;justify-content:flex-end;background:#3760a1}:host .title-bar mat-icon{color:#fff}:host .title-bar .title-bar-move{display:flex;flex-basis:100%}:host .content-wrapper{font-size:14px;padding:15px;background:white;min-height:400px;min-width:500px;display:flex;flex-direction:column;max-height:500px;overflow-y:auto}:host .section:not(last-child){margin-bottom:20px}:host .button-wrapper{display:flex;height:60px;align-items:center;justify-content:flex-end}:host .edit-wrapper{display:flex;flex-direction:row;align-items:center;justify-content:space-between}:host .edit-button-wrapper{display:flex}:host h4{margin:10px 0}:host .edit-lightplan-wrapper{display:flex}:host .light-preset-selection{display:flex}:host .button-row{display:flex}:host .add-light{font-size:11px;border:1px solid #3760a1;border-radius:25px}:host .add-light:not(last-child){margin-right:5px}:host .dropdown-container{align-self:center}:host .section-row{display:flex;flex-direction:row;justify-content:space-between}::ng-deep .cdk-overlay-container .mat-select-panel .mat-option-text{display:flex;justify-content:space-between;align-items:center}\n"], components: [{ type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: EditLightComponent, selector: "edit-light", inputs: ["light"], outputs: ["okClick", "cancelClick"] }, { type: EditLightplanComponent, selector: "edit-lightplan", inputs: ["lightPreset"], outputs: ["saveClick", "cancelClick"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i12.MatSelectTrigger, selector: "mat-select-trigger" }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "localize": LocalizePipe }, animations: [
26106
26151
  trigger('showHideDialog', [
26107
26152
  state('void', style({ opacity: 0 })),
26108
26153
  state('*', style({ opacity: 1 })),
@@ -26335,7 +26380,7 @@ class SceneControlComponent {
26335
26380
  this.addRenderOptions(this._sceneService.renderer);
26336
26381
  this.addLights(this._sceneService.scene);
26337
26382
  }
26338
- addRenderOptions(renderer) {
26383
+ addRenderOptions(renderer /*| WebGPURenderer*/) {
26339
26384
  const folder = this.gui.addFolder('renderer');
26340
26385
  folder.add(renderer, 'toneMappingExposure', 0, 5).onChange(() => {
26341
26386
  this._updateScene();
@@ -28093,7 +28138,7 @@ var __awaiter$w = (this && this.__awaiter) || function (thisArg, _arguments, P,
28093
28138
  });
28094
28139
  };
28095
28140
  class RenderDialogComponent {
28096
- constructor(cameraService, renderService, messageService, _utilsService, _domSanitizer, _settingsService, _newRenderService, _3dmRenderApi) {
28141
+ constructor(cameraService, renderService, messageService, _utilsService, _domSanitizer, _settingsService, _newRenderService, _3dmRenderApi, _dialog) {
28097
28142
  this.cameraService = cameraService;
28098
28143
  this.renderService = renderService;
28099
28144
  this.messageService = messageService;
@@ -28102,6 +28147,7 @@ class RenderDialogComponent {
28102
28147
  this._settingsService = _settingsService;
28103
28148
  this._newRenderService = _newRenderService;
28104
28149
  this._3dmRenderApi = _3dmRenderApi;
28150
+ this._dialog = _dialog;
28105
28151
  this.renderStatus = RenderStatus;
28106
28152
  this.iconName = IconName;
28107
28153
  this.renderModes = RenderModes;
@@ -28269,6 +28315,10 @@ class RenderDialogComponent {
28269
28315
  this.messageService.emit(MessageType.ShowLoadingIndicator, { title: 'Uploading...' });
28270
28316
  this._utilsService.prepRoomForRender(false, renderInput);
28271
28317
  }
28318
+ cancelBlenderRender() {
28319
+ this.messageService.emit(MessageType.HideLoadingIndicator);
28320
+ this._dialog.closeAll();
28321
+ }
28272
28322
  saveImage(url) {
28273
28323
  const link = document.createElement('a');
28274
28324
  link.setAttribute('target', '_blank');
@@ -28338,8 +28388,8 @@ class RenderDialogComponent {
28338
28388
  }
28339
28389
  }
28340
28390
  }
28341
- RenderDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RenderDialogComponent, deps: [{ token: CameraService }, { token: RenderService }, { token: MessageBusService }, { token: UtilsService }, { token: i1.DomSanitizer }, { token: HomedecoratorSettingsService }, { token: NewRenderService }, { token: ApiServiceModule }], target: i0.ɵɵFactoryTarget.Component });
28342
- RenderDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: RenderDialogComponent, selector: "rp-render-dialog", viewQueries: [{ propertyName: "renderImageField", first: true, predicate: ["render_image"], descendants: true, static: true }, { propertyName: "imageWidthField", first: true, predicate: ["render_image_width"], descendants: true, static: true }, { propertyName: "imageHeightField", first: true, predicate: ["render_image_height"], descendants: true, static: true }], ngImport: i0, template: "<ng-container *ngIf=\"renderService.serverData.renderMode === renderModes.RenderIone\">\r\n <div mat-dialog-content>\r\n <div class=\"render-camera-positions\">\r\n <div class=\"render-camera-positions-left\">\r\n <!--\r\n <button mat-raised-button class=\"matrixToggle\" (click)=\"toggleCameraPosition()\">{{ showMatrix ? ('HIDE_MATRIX' | localize) : ('SHOW_MATRIX' | localize) }}</button>\r\n <div class=\"position-matrix-container\" *ngIf=\"showMatrix\">\r\n <mat-grid-list [cols]=\"4\" rowHeight=\"35px\" class=\"camera_position_grid\">\r\n <ng-container *ngFor=\"let item of cameraMatrix; let i = index\">\r\n <mat-grid-tile colspan=\"1\"><b>{{ i }}:</b></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\"><span>{{item}}</span></mat-grid-tile>\r\n </ng-container>\r\n </mat-grid-list>\r\n </div>\r\n -->\r\n\r\n <h4>{{'LIGHTNING' | localize}}</h4>\r\n <mat-form-field class=\"face-select-form\">\r\n <mat-select [(ngModel)]=\"inputLight\">\r\n <mat-option *ngFor=\"let light of renderService.lightnings\" [value]=\"light.id\">{{ light.name }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <h4>{{'SIZE' | localize}}</h4>\r\n <mat-form-field class=\"face-select-form\">\r\n <mat-select [(value)]=\"inputSize\">\r\n <mat-option *ngFor=\"let size of renderService.imageSizes\" [value]=\"size.id\">{{ size.name }} | <em>{{ size.width }}x{{ size.height }}</em></mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <p>You selected: {{inputSize}}</p>\r\n <div class=\"position-separator\"></div>\r\n\r\n <h4>{{'NAME' | localize}}</h4>\r\n <mat-form-field>\r\n <input\r\n matInput\r\n type=\"text\"\r\n [(ngModel)]=\"inputName\"\r\n />\r\n </mat-form-field>\r\n\r\n <p>{{ 'ADD_CURRENT_CAMERA_POSITION_TO_RENDER' | localize }}</p>\r\n\r\n <button mat-raised-button class=\"add_camera_position\" color=\"primary\" title=\"{{'ADD_CURRENT_POSITION' | localize}}\" (click)=\"addRenderCustom()\">\r\n {{'ADD_CURRENT_POSITION' | localize}}\r\n </button>\r\n\r\n <ng-container *ngIf=\"this.galleryInfo.items === 0\">\r\n\r\n <div class=\"position-separator\"></div>\r\n\r\n <p>{{ 'ADD_GALLERY_POSITIONS_TO_RENDER_INFO' | localize }}</p>\r\n\r\n <button mat-raised-button class=\"add_gallery_positions\" color=\"primary\" title=\"{{'ADD_GALLERY_POSITIONS' | localize}}\" (click)=\"addRenderGallery()\">\r\n {{'ADD_GALLERY_POSITIONS' | localize}}\r\n </button>\r\n\r\n </ng-container>\r\n\r\n </div>\r\n <div class=\"render-camera-positions-right\">\r\n <mat-grid-list [cols]=\"16\" rowHeight=\"35px\" class=\"camera_positions_grid\">\r\n <mat-grid-tile colspan=\"1\"><div class=\"grid-tile-head\"></div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\"><div class=\"grid-tile-head\">{{'AVAILABLE' | localize}}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"5\"><div class=\"grid-tile-head\">{{'NAME' | localize}}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\"><div class=\"grid-tile-head\">{{'LIGHT' | localize}}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\"><div class=\"grid-tile-head\">{{'SIZE' | localize}}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"1\"></mat-grid-tile>\r\n </mat-grid-list>\r\n <mat-grid-list [cols]=\"16\" rowHeight=\"55px\" class=\"camera_positions_grid\">\r\n <ng-container *ngFor=\"let render of renderService.renders; index as i\">\r\n <ng-container *ngIf=\"render.cameraPosition.type === 'custom' && render.productHash === renderService.currentProductHash\" class=\"grid_head\">\r\n <mat-grid-tile colspan=\"1\">\r\n <div class=\"grid-tile-content no-padding\" [hidden]=\"render.status === renderStatus.IsWaiting || render.status === renderStatus.IsRunning\">\r\n <input type=\"checkbox\" [(ngModel)]=\"inputReRenderChecked[i]\" [value]=\"render.id\" (change)=\"renderOnChange()\">\r\n </div>\r\n </mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\">\r\n <div class=\"grid-tile-content grid-tile-image\">\r\n <div class=\"image-container\">\r\n <mat-icon class=\"homedecorator-material-icons\" *ngIf=\"render.url === '' && render.status !== renderStatus.IsRunning\">camera_alt</mat-icon>\r\n <a href=\"{{ render.url }}\" target=\"_blank\" download *ngIf=\"render.url !== '' && render.status !== renderStatus.IsRunning\">\r\n <img src=\"{{ render.url }}\">\r\n </a>\r\n <mat-spinner *ngIf=\"render.status === renderStatus.IsRunning\" [diameter]=\"25\" [mode]=\"'determinate'\" [value]=\"render.progress > 10 ? render.progress : 10\"></mat-spinner>\r\n </div>\r\n </div>\r\n </mat-grid-tile>\r\n <mat-grid-tile colspan=\"5\"><div class=\"grid-tile-content\">{{ render.cameraPosition.name }}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\"><div class=\"grid-tile-content\">{{ render.lightning.name }}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\"><div class=\"grid-tile-content\">{{ render.imageSize.name }} | <em>{{ render.imageSize.width }}x{{ render.imageSize.height }}</em></div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"1\"><div class=\"grid-tile-content no-padding right\"><button (click)=\"removeCameraPosition(render)\" class=\"remove-btn\" [hidden]=\"render.status === renderStatus.IsWaiting || render.status === renderStatus.IsRunning\"><mat-icon class=\"homedecorator-material-icons\">delete</mat-icon></button></div></mat-grid-tile>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"this.galleryInfo.items > 0\">\r\n <ng-container>\r\n <mat-grid-tile colspan=\"1\" class=\"grid_head\">\r\n <div class=\"grid-tile-content no-padding\" [hidden]=\"galleryInfo.renderInfo.status === renderStatus.IsWaiting || galleryInfo.renderInfo.status === renderStatus.IsRunning\">\r\n <input type=\"checkbox\" (change)=\"galleryRenderOnChange($event)\">\r\n </div>\r\n </mat-grid-tile>\r\n <mat-grid-tile colspan=\"8\" class=\"grid_head\"><div class=\"grid-tile-content\">{{ 'GALLERY_IMAGES_FROM' | localize }} {{ galleryInfo.items }} {{ 'CAMERA_POSITIONS' | localize }}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\" class=\"grid_head\"><div class=\"grid-tile-content\">{{ galleryInfo.renderInfo.lightning.name }}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\" class=\"grid_head\"><div class=\"grid-tile-content\">{{ galleryInfo.renderInfo.imageSize.name }} | <em>{{ galleryInfo.renderInfo.imageSize.width }}x{{ galleryInfo.renderInfo.imageSize.height }}</em></div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"1\" class=\"grid_head\"><div class=\"grid-tile-content no-padding right\"><button (click)=\"removeCameraPosition('gallery')\" class=\"remove-btn\" [hidden]=\"galleryInfo.renderInfo.status === renderStatus.IsWaiting || galleryInfo.renderInfo.status === renderStatus.IsRunning\"><mat-icon class=\"homedecorator-material-icons\">delete</mat-icon></button></div></mat-grid-tile>\r\n </ng-container>\r\n <ng-container *ngFor=\"let render of renderService.renders; index as i\">\r\n <ng-container *ngIf=\"render.cameraPosition.type === 'gallery' && render.productHash === renderService.currentProductHash\">\r\n <mat-grid-tile colspan=\"2\">\r\n <div class=\"grid-tile-content\" [hidden]=\"true\"><input type=\"checkbox\" [(ngModel)]=\"inputReRenderChecked[i]\" [value]=\"render.id\" (change)=\"renderOnChange()\"></div>\r\n <div class=\"grid-tile-content small-padding grid-tile-image\">\r\n <div class=\"image-container\">\r\n <mat-icon class=\"homedecorator-material-icons\" *ngIf=\"render.url === '' && render.status !== renderStatus.IsRunning\">camera_alt</mat-icon>\r\n <a href=\"{{ render.url }}\" target=\"_blank\" download *ngIf=\"render.url !== '' && render.status !== renderStatus.IsRunning\">\r\n <img src=\"{{ render.url }}\">\r\n </a>\r\n <mat-spinner *ngIf=\"render.status === renderStatus.IsRunning\" [diameter]=\"25\" [mode]=\"'determinate'\" [value]=\"render.progress > 10 ? render.progress : 10\"></mat-spinner>\r\n </div>\r\n </div>\r\n </mat-grid-tile>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </mat-grid-list>\r\n </div>\r\n </div>\r\n\r\n <button mat-raised-button class=\"render_btn\" (click)=\"addRendersToQueue()\" color=\"primary\" title=\"{{'CREATE_RENDERS' | localize}}\" [disabled]=\"!canRender || renderService.renderQueue.length > 0\">\r\n {{'CREATE_RENDERS' | localize}}\r\n </button>\r\n\r\n </div>\r\n\r\n <button mat-button mat-dialog-close class=\"close_btn\">X</button>\r\n\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"renderService.serverData.renderMode === renderModes.RenderRoom\">\r\n\r\n <div mat-dialog-content>\r\n <div class=\"render-camera-positions\">\r\n <div class=\"render-camera-positions-left large\">\r\n <div *ngIf=\"imageRenderSource != ''\" class=\"render-image-content\">\r\n <img [src]=\"imageRenderSource\" #render_image>\r\n <div class=\"loader\" [ngClass]=\"(renderProgress == 100 ? 'ready' : '')\">\r\n <span class=\"loader_progress\" [style.width.%]=\"(renderProgress ? renderProgress : 0)\">\r\n <span>{{ (renderProgress ? renderProgress : 0) }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"imageRenderSource == ''\" class=\"image_spacer\">\r\n <mat-icon class=\"homedecorator-material-icons\">camera_alt</mat-icon>\r\n </div>\r\n <div class=\"position-separator\"></div>\r\n <mat-form-field class=\"face-select-form\" *ngIf=\"renderService.serverData.renderMode === renderModes.RenderRoom\">\r\n <mat-label>{{\"IMAGE_SIZE\" | localize}}</mat-label>\r\n <mat-select [(ngModel)]=\"renderService.selectedImageSize\">\r\n <mat-option *ngFor=\"let size of renderService.imageSizes\" [value]=\"size.id\">{{ size.name }} {{ size.width }}x{{ size.height }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <div *ngIf=\"renderService.blenderRenderService\">\r\n <mat-form-field\r\n class=\"face-select-form\"\r\n *ngIf=\"renderService.serverData.renderMode === renderModes.RenderRoom\">\r\n <mat-label>{{ \"ENVIRONMENT\" | localize }}</mat-label>\r\n <mat-select [(ngModel)]=\"renderService.selectedRenderScene\">\r\n <mat-option\r\n *ngFor=\"let scene of renderService.renderScenes\"\r\n [value]=\"scene.sceneAssetId\">{{ scene.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n\r\n\r\n<!-- <mat-form-field class=\"face-select-form\" *ngIf=\"renderService.serverData.renderMode === renderModes.RenderRoom\">-->\r\n<!-- <mat-label>{{\"ENVIRONMENT\" | localize}}</mat-label>-->\r\n<!-- <mat-select [(ngModel)]=\"renderService.selectedEnvironment\">-->\r\n<!-- <mat-option *ngFor=\"let renderEnvironment of renderService.renderEnvironments\" [value]=\"renderEnvironment.id\">{{ renderEnvironment.name }}</mat-option>-->\r\n<!-- </mat-select>-->\r\n<!-- </mat-form-field>-->\r\n\r\n <button *ngIf=\"!renderService.blenderRenderService\" mat-raised-button (click)=\"startRenderingRoom()\" color=\"primary\" title=\"{{'MAKE_A_PICTURE' | localize}}\" [disabled]=\"disablePictureButton\">\r\n {{'MAKE_A_PICTURE' | localize}}\r\n </button>\r\n\r\n <button *ngIf=\"renderService.blenderRenderService\" mat-raised-button (click)=\"createBlenderRender()\" color=\"primary\" title=\"{{'MAKE_A_PICTURE' | localize}}\" [disabled]=\"disablePictureButton\">\r\n {{'MAKE_A_PICTURE' | localize}}\r\n </button>\r\n\r\n </div>\r\n\r\n\r\n<!-- <div class=\"render-camera-positions-right small\">-->\r\n<!-- <mat-grid-list [cols]=\"10\" rowHeight=\"35px\" class=\"camera_positions_grid\">-->\r\n<!-- <mat-grid-tile colspan=\"3\"><div class=\"grid-tile-head\">{{'IMAGE' | localize}}</div></mat-grid-tile>-->\r\n<!-- <mat-grid-tile colspan=\"6\"><div class=\"grid-tile-head\">{{'NAME' | localize}}</div></mat-grid-tile>-->\r\n<!-- <mat-grid-tile colspan=\"1\"><div class=\"grid-tile-head\"></div></mat-grid-tile>-->\r\n<!-- </mat-grid-list>-->\r\n<!-- <mat-grid-list [cols]=\"11\" rowHeight=\"55px\" class=\"camera_positions_grid\">-->\r\n<!-- <ng-container *ngFor=\"let image of renderedImages; let index = index\">-->\r\n<!-- <mat-grid-tile colspan=\"3\">-->\r\n<!-- <div class=\"grid-tile-content grid-tile-image\">-->\r\n<!-- <div class=\"image-container\">-->\r\n<!-- <a href=\"{{ image }}\" target=\"_blank\" download>-->\r\n<!-- <img src=\"{{ image }}\">-->\r\n<!-- </a>-->\r\n<!-- </div>-->\r\n<!-- </div>-->\r\n<!-- </mat-grid-tile>-->\r\n<!-- <mat-grid-tile colspan=\"6\"><div class=\"grid-tile-content\">{{ 'IMAGE' | localize }}</div></mat-grid-tile>-->\r\n<!-- <mat-grid-tile colspan=\"2\">-->\r\n<!-- <div class=\"grid-tile-content\">-->\r\n<!-- <button mat-icon-button (click)=\"saveImage(image)\" title=\"{{'DOWNLOAD_IMAGE' | localize}}\">-->\r\n<!-- <mat-icon class=\"homedecorator-material-icons\">get_app</mat-icon>-->\r\n<!-- </button>-->\r\n<!-- </div>-->\r\n<!-- <div class=\"grid-tile-content no-padding right\"><button (click)=\"removeRender(image, index)\" class=\"remove-btn\"><mat-icon class=\"homedecorator-material-icons\">delete</mat-icon></button></div>-->\r\n<!-- </mat-grid-tile>-->\r\n<!-- </ng-container>-->\r\n<!-- </mat-grid-list>-->\r\n<!-- </div>-->\r\n </div>\r\n\r\n <button mat-button mat-dialog-close class=\"close_btn\">X</button>\r\n\r\n </div>\r\n\r\n</ng-container>\r\n", styles: ["::ng-deep .render-dialog-content .mat-dialog-container{margin:0;padding:0}::ng-deep .render-dialog-content .mat-dialog-container .mat-dialog-content{margin:0;padding:0}:host{display:block;max-width:100%;position:relative;box-sizing:border-box}:host *{box-sizing:border-box}:host [hidden]{display:none!important}:host .close_btn{position:absolute;top:0;right:0;font-size:30px;padding:0;width:50px;min-width:0px;line-height:45px}:host .render_btn{position:absolute;left:65%;margin:0 0 0 -83px;bottom:15px}:host .render-camera-positions{display:flex;font-size:14px}:host .render-camera-positions .render-camera-positions-left{min-width:300px;background:#e4edf4;padding:15px;text-align:center}:host .render-camera-positions .render-camera-positions-left h3{text-align:left}:host .render-camera-positions .render-camera-positions-left h4{text-align:left;margin:0}:host .render-camera-positions .render-camera-positions-left .position-separator{width:100%;font-size:0;height:1px;background:#fff;margin:15px 0}:host .render-camera-positions .render-camera-positions-left p{font-size:12px;text-align:center;line-height:170%}:host .render-camera-positions .render-camera-positions-left button{font-size:12px;line-height:32px}:host .render-camera-positions .render-camera-positions-left button.matrixToggle{margin:0 0 5px}:host .render-camera-positions .render-camera-positions-left mat-grid-list{text-align:left}:host .render-camera-positions .render-camera-positions-left mat-grid-list mat-grid-tile .mat-figure{justify-content:left}:host .render-camera-positions .render-camera-positions-left mat-grid-list mat-grid-tile b{text-align:left;width:100%}:host .render-camera-positions .render-camera-positions-left mat-grid-list mat-grid-tile span{display:inline-block;text-align:right;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 10px;background:#fff;border-radius:5px;line-height:30px;font-size:90%}:host .render-camera-positions .render-camera-positions-left .mat-form-field{width:100%}:host .render-camera-positions .render-camera-positions-left mat-slide-toggle{float:right}:host .render-camera-positions .render-camera-positions-left .render-image-content{width:100%;align-self:start;position:relative}:host .render-camera-positions .render-camera-positions-left .render-image-content img{width:100%;max-width:100%;align-self:start;border-radius:5px}:host .render-camera-positions .render-camera-positions-left .render-image-content .loader{align-self:start;width:calc(100% - 20px);font-size:0;line-height:0;height:6px;position:absolute;left:10px;bottom:15px;z-index:2;text-align:left}:host .render-camera-positions .render-camera-positions-left .render-image-content .loader.ready .loader_progress{background:#74B77F}:host .render-camera-positions .render-camera-positions-left .render-image-content .loader.ready .loader_progress span{color:#74b77f;border-color:#74b77f}:host .render-camera-positions .render-camera-positions-left .render-image-content .loader .loader_progress{vertical-align:top;display:inline-block;background:#3760a1;height:6px;position:relative;transition:.2s ease-in-out;-moz-transition:.2s ease-in-out;-webkit-transition:.2s ease-in-out;border-radius:5px;min-width:25px}:host .render-camera-positions .render-camera-positions-left .render-image-content .loader .loader_progress span{float:left;width:25px;height:16px;line-height:16px;border-radius:4px;text-align:center;position:absolute;top:-5px;font-size:9px;font-weight:bold;background:#fff;right:0px}:host .render-camera-positions .render-camera-positions-left .image_spacer{position:relative;background:#fafafa;width:100%;height:200px;border-radius:5px}:host .render-camera-positions .render-camera-positions-left .image_spacer .mat-icon{position:absolute;margin:auto;left:0;top:0;right:0;bottom:0;width:60px;height:60px;font-size:60px}:host .render-camera-positions .render-camera-positions-right{width:70%;padding:15px 15px 66px;font-size:12px}:host .render-camera-positions .render-camera-positions-right.large{width:60%}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile{border-bottom:1px solid #e4edf4}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile.grid_head{border-color:#fff}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-head{width:100%;text-align:left;font-weight:bold;padding:0 15px}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content{width:100%;text-align:left;padding:0 15px}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.no-padding{padding:0}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.small-padding{padding:0 2px}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.right{text-align:right}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.grid-tile-image .image-container{width:100%;height:46px;border:1px solid #e4edf4;border-radius:5px;vertical-align:top;text-align:center;display:table;font-size:0}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.grid-tile-image .image-container a{display:table-cell;vertical-align:middle}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.grid-tile-image .image-container a img{max-width:100%;max-height:46px;display:inline-block}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.grid-tile-image .image-container .mat-icon{height:46px;line-height:46px}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.grid-tile-image .image-container .mat-spinner{margin:11px 0 0;display:inline-block}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content .remove-btn{border:none;background:transparent;color:#0003;cursor:pointer}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content .remove-btn:hover{color:red}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content .remove-btn .mat-icon{height:18px;width:18px;font-size:18px}\n"], components: [{ type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i9.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i15.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i19.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i8.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: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1$1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["type", "mat-dialog-close", "aria-label", "matDialogClose"], exportAs: ["matDialogClose"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.MatLabel, selector: "mat-label" }], pipes: { "localize": LocalizePipe }, animations: [
28391
+ RenderDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RenderDialogComponent, deps: [{ token: CameraService }, { token: RenderService }, { token: MessageBusService }, { token: UtilsService }, { token: i1.DomSanitizer }, { token: HomedecoratorSettingsService }, { token: NewRenderService }, { token: ApiServiceModule }, { token: i1$1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
28392
+ RenderDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: RenderDialogComponent, selector: "rp-render-dialog", viewQueries: [{ propertyName: "renderImageField", first: true, predicate: ["render_image"], descendants: true, static: true }, { propertyName: "imageWidthField", first: true, predicate: ["render_image_width"], descendants: true, static: true }, { propertyName: "imageHeightField", first: true, predicate: ["render_image_height"], descendants: true, static: true }], ngImport: i0, template: "<ng-container *ngIf=\"renderService.serverData.renderMode === renderModes.RenderIone\">\r\n <div mat-dialog-content>\r\n <div class=\"render-camera-positions\">\r\n <div class=\"render-camera-positions-left\">\r\n <!--\r\n <button mat-raised-button class=\"matrixToggle\" (click)=\"toggleCameraPosition()\">{{ showMatrix ? ('HIDE_MATRIX' | localize) : ('SHOW_MATRIX' | localize) }}</button>\r\n <div class=\"position-matrix-container\" *ngIf=\"showMatrix\">\r\n <mat-grid-list [cols]=\"4\" rowHeight=\"35px\" class=\"camera_position_grid\">\r\n <ng-container *ngFor=\"let item of cameraMatrix; let i = index\">\r\n <mat-grid-tile colspan=\"1\"><b>{{ i }}:</b></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\"><span>{{item}}</span></mat-grid-tile>\r\n </ng-container>\r\n </mat-grid-list>\r\n </div>\r\n -->\r\n\r\n <h4>{{'LIGHTNING' | localize}}</h4>\r\n <mat-form-field class=\"face-select-form\">\r\n <mat-select [(ngModel)]=\"inputLight\">\r\n <mat-option *ngFor=\"let light of renderService.lightnings\" [value]=\"light.id\">{{ light.name }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <h4>{{'SIZE' | localize}}</h4>\r\n <mat-form-field class=\"face-select-form\">\r\n <mat-select [(value)]=\"inputSize\">\r\n <mat-option *ngFor=\"let size of renderService.imageSizes\" [value]=\"size.id\">{{ size.name }} | <em>{{ size.width }}x{{ size.height }}</em></mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <p>You selected: {{inputSize}}</p>\r\n <div class=\"position-separator\"></div>\r\n\r\n <h4>{{'NAME' | localize}}</h4>\r\n <mat-form-field>\r\n <input\r\n matInput\r\n type=\"text\"\r\n [(ngModel)]=\"inputName\"\r\n />\r\n </mat-form-field>\r\n\r\n <p>{{ 'ADD_CURRENT_CAMERA_POSITION_TO_RENDER' | localize }}</p>\r\n\r\n <button mat-raised-button class=\"add_camera_position\" color=\"primary\" title=\"{{'ADD_CURRENT_POSITION' | localize}}\" (click)=\"addRenderCustom()\">\r\n {{'ADD_CURRENT_POSITION' | localize}}\r\n </button>\r\n\r\n <ng-container *ngIf=\"this.galleryInfo.items === 0\">\r\n\r\n <div class=\"position-separator\"></div>\r\n\r\n <p>{{ 'ADD_GALLERY_POSITIONS_TO_RENDER_INFO' | localize }}</p>\r\n\r\n <button mat-raised-button class=\"add_gallery_positions\" color=\"primary\" title=\"{{'ADD_GALLERY_POSITIONS' | localize}}\" (click)=\"addRenderGallery()\">\r\n {{'ADD_GALLERY_POSITIONS' | localize}}\r\n </button>\r\n\r\n </ng-container>\r\n\r\n </div>\r\n <div class=\"render-camera-positions-right\">\r\n <mat-grid-list [cols]=\"16\" rowHeight=\"35px\" class=\"camera_positions_grid\">\r\n <mat-grid-tile colspan=\"1\"><div class=\"grid-tile-head\"></div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\"><div class=\"grid-tile-head\">{{'AVAILABLE' | localize}}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"5\"><div class=\"grid-tile-head\">{{'NAME' | localize}}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\"><div class=\"grid-tile-head\">{{'LIGHT' | localize}}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\"><div class=\"grid-tile-head\">{{'SIZE' | localize}}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"1\"></mat-grid-tile>\r\n </mat-grid-list>\r\n <mat-grid-list [cols]=\"16\" rowHeight=\"55px\" class=\"camera_positions_grid\">\r\n <ng-container *ngFor=\"let render of renderService.renders; index as i\">\r\n <ng-container *ngIf=\"render.cameraPosition.type === 'custom' && render.productHash === renderService.currentProductHash\" class=\"grid_head\">\r\n <mat-grid-tile colspan=\"1\">\r\n <div class=\"grid-tile-content no-padding\" [hidden]=\"render.status === renderStatus.IsWaiting || render.status === renderStatus.IsRunning\">\r\n <input type=\"checkbox\" [(ngModel)]=\"inputReRenderChecked[i]\" [value]=\"render.id\" (change)=\"renderOnChange()\">\r\n </div>\r\n </mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\">\r\n <div class=\"grid-tile-content grid-tile-image\">\r\n <div class=\"image-container\">\r\n <mat-icon class=\"homedecorator-material-icons\" *ngIf=\"render.url === '' && render.status !== renderStatus.IsRunning\">camera_alt</mat-icon>\r\n <a href=\"{{ render.url }}\" target=\"_blank\" download *ngIf=\"render.url !== '' && render.status !== renderStatus.IsRunning\">\r\n <img src=\"{{ render.url }}\">\r\n </a>\r\n <mat-spinner *ngIf=\"render.status === renderStatus.IsRunning\" [diameter]=\"25\" [mode]=\"'determinate'\" [value]=\"render.progress > 10 ? render.progress : 10\"></mat-spinner>\r\n </div>\r\n </div>\r\n </mat-grid-tile>\r\n <mat-grid-tile colspan=\"5\"><div class=\"grid-tile-content\">{{ render.cameraPosition.name }}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\"><div class=\"grid-tile-content\">{{ render.lightning.name }}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\"><div class=\"grid-tile-content\">{{ render.imageSize.name }} | <em>{{ render.imageSize.width }}x{{ render.imageSize.height }}</em></div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"1\"><div class=\"grid-tile-content no-padding right\"><button (click)=\"removeCameraPosition(render)\" class=\"remove-btn\" [hidden]=\"render.status === renderStatus.IsWaiting || render.status === renderStatus.IsRunning\"><mat-icon class=\"homedecorator-material-icons\">delete</mat-icon></button></div></mat-grid-tile>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"this.galleryInfo.items > 0\">\r\n <ng-container>\r\n <mat-grid-tile colspan=\"1\" class=\"grid_head\">\r\n <div class=\"grid-tile-content no-padding\" [hidden]=\"galleryInfo.renderInfo.status === renderStatus.IsWaiting || galleryInfo.renderInfo.status === renderStatus.IsRunning\">\r\n <input type=\"checkbox\" (change)=\"galleryRenderOnChange($event)\">\r\n </div>\r\n </mat-grid-tile>\r\n <mat-grid-tile colspan=\"8\" class=\"grid_head\"><div class=\"grid-tile-content\">{{ 'GALLERY_IMAGES_FROM' | localize }} {{ galleryInfo.items }} {{ 'CAMERA_POSITIONS' | localize }}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\" class=\"grid_head\"><div class=\"grid-tile-content\">{{ galleryInfo.renderInfo.lightning.name }}</div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"3\" class=\"grid_head\"><div class=\"grid-tile-content\">{{ galleryInfo.renderInfo.imageSize.name }} | <em>{{ galleryInfo.renderInfo.imageSize.width }}x{{ galleryInfo.renderInfo.imageSize.height }}</em></div></mat-grid-tile>\r\n <mat-grid-tile colspan=\"1\" class=\"grid_head\"><div class=\"grid-tile-content no-padding right\"><button (click)=\"removeCameraPosition('gallery')\" class=\"remove-btn\" [hidden]=\"galleryInfo.renderInfo.status === renderStatus.IsWaiting || galleryInfo.renderInfo.status === renderStatus.IsRunning\"><mat-icon class=\"homedecorator-material-icons\">delete</mat-icon></button></div></mat-grid-tile>\r\n </ng-container>\r\n <ng-container *ngFor=\"let render of renderService.renders; index as i\">\r\n <ng-container *ngIf=\"render.cameraPosition.type === 'gallery' && render.productHash === renderService.currentProductHash\">\r\n <mat-grid-tile colspan=\"2\">\r\n <div class=\"grid-tile-content\" [hidden]=\"true\"><input type=\"checkbox\" [(ngModel)]=\"inputReRenderChecked[i]\" [value]=\"render.id\" (change)=\"renderOnChange()\"></div>\r\n <div class=\"grid-tile-content small-padding grid-tile-image\">\r\n <div class=\"image-container\">\r\n <mat-icon class=\"homedecorator-material-icons\" *ngIf=\"render.url === '' && render.status !== renderStatus.IsRunning\">camera_alt</mat-icon>\r\n <a href=\"{{ render.url }}\" target=\"_blank\" download *ngIf=\"render.url !== '' && render.status !== renderStatus.IsRunning\">\r\n <img src=\"{{ render.url }}\">\r\n </a>\r\n <mat-spinner *ngIf=\"render.status === renderStatus.IsRunning\" [diameter]=\"25\" [mode]=\"'determinate'\" [value]=\"render.progress > 10 ? render.progress : 10\"></mat-spinner>\r\n </div>\r\n </div>\r\n </mat-grid-tile>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </mat-grid-list>\r\n </div>\r\n </div>\r\n\r\n <button mat-raised-button class=\"render_btn\" (click)=\"addRendersToQueue()\" color=\"primary\" title=\"{{'CREATE_RENDERS' | localize}}\" [disabled]=\"!canRender || renderService.renderQueue.length > 0\">\r\n {{'CREATE_RENDERS' | localize}}\r\n </button>\r\n\r\n </div>\r\n\r\n <button mat-button mat-dialog-close class=\"close_btn\">X</button>\r\n\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"renderService.serverData.renderMode === renderModes.RenderRoom\">\r\n\r\n <div mat-dialog-content>\r\n <div class=\"render-camera-positions\">\r\n <div class=\"render-camera-positions-left large\">\r\n <div *ngIf=\"imageRenderSource != ''\" class=\"render-image-content\">\r\n <img [src]=\"imageRenderSource\" #render_image>\r\n <div class=\"loader\" [ngClass]=\"(renderProgress == 100 ? 'ready' : '')\">\r\n <span class=\"loader_progress\" [style.width.%]=\"(renderProgress ? renderProgress : 0)\">\r\n <span>{{ (renderProgress ? renderProgress : 0) }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"imageRenderSource == ''\" class=\"image_spacer\">\r\n <mat-icon class=\"homedecorator-material-icons\">camera_alt</mat-icon>\r\n </div>\r\n <div class=\"position-separator\"></div>\r\n <mat-form-field class=\"face-select-form\" *ngIf=\"renderService.serverData.renderMode === renderModes.RenderRoom\">\r\n <mat-label>{{\"IMAGE_SIZE\" | localize}}</mat-label>\r\n <mat-select [(ngModel)]=\"renderService.selectedImageSize\">\r\n <mat-option *ngFor=\"let size of renderService.imageSizes\" [value]=\"size.id\">{{ size.name }} {{ size.width }}x{{ size.height }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <div *ngIf=\"renderService.blenderRenderService\">\r\n <mat-form-field\r\n class=\"face-select-form\"\r\n *ngIf=\"renderService.serverData.renderMode === renderModes.RenderRoom\">\r\n <mat-label>{{ \"ENVIRONMENT\" | localize }}</mat-label>\r\n <mat-select [(ngModel)]=\"renderService.selectedRenderScene\">\r\n <mat-option\r\n *ngFor=\"let scene of renderService.renderScenes\"\r\n [value]=\"scene.sceneAssetId\">{{ scene.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n\r\n\r\n<!-- <mat-form-field class=\"face-select-form\" *ngIf=\"renderService.serverData.renderMode === renderModes.RenderRoom\">-->\r\n<!-- <mat-label>{{\"ENVIRONMENT\" | localize}}</mat-label>-->\r\n<!-- <mat-select [(ngModel)]=\"renderService.selectedEnvironment\">-->\r\n<!-- <mat-option *ngFor=\"let renderEnvironment of renderService.renderEnvironments\" [value]=\"renderEnvironment.id\">{{ renderEnvironment.name }}</mat-option>-->\r\n<!-- </mat-select>-->\r\n<!-- </mat-form-field>-->\r\n\r\n <button *ngIf=\"!renderService.blenderRenderService\" mat-raised-button (click)=\"startRenderingRoom()\" color=\"primary\" title=\"{{'MAKE_A_PICTURE' | localize}}\" [disabled]=\"disablePictureButton\">\r\n {{'MAKE_A_PICTURE' | localize}}\r\n </button>\r\n\r\n <button *ngIf=\"renderService.blenderRenderService\" mat-raised-button (click)=\"createBlenderRender()\" color=\"primary\" title=\"{{'MAKE_A_PICTURE' | localize}}\" [disabled]=\"disablePictureButton\">\r\n {{'MAKE_A_PICTURE' | localize}}\r\n </button>\r\n\r\n <button *ngIf=\"renderService.blenderRenderService\" mat-raised-button (click)=\"cancelBlenderRender()\" color=\"accent\" title=\"{{'CANCEL' | localize}}\" [disabled]=\"disablePictureButton\">\r\n {{'CANCEL' | localize}}\r\n </button>\r\n\r\n </div>\r\n\r\n\r\n<!-- <div class=\"render-camera-positions-right small\">-->\r\n<!-- <mat-grid-list [cols]=\"10\" rowHeight=\"35px\" class=\"camera_positions_grid\">-->\r\n<!-- <mat-grid-tile colspan=\"3\"><div class=\"grid-tile-head\">{{'IMAGE' | localize}}</div></mat-grid-tile>-->\r\n<!-- <mat-grid-tile colspan=\"6\"><div class=\"grid-tile-head\">{{'NAME' | localize}}</div></mat-grid-tile>-->\r\n<!-- <mat-grid-tile colspan=\"1\"><div class=\"grid-tile-head\"></div></mat-grid-tile>-->\r\n<!-- </mat-grid-list>-->\r\n<!-- <mat-grid-list [cols]=\"11\" rowHeight=\"55px\" class=\"camera_positions_grid\">-->\r\n<!-- <ng-container *ngFor=\"let image of renderedImages; let index = index\">-->\r\n<!-- <mat-grid-tile colspan=\"3\">-->\r\n<!-- <div class=\"grid-tile-content grid-tile-image\">-->\r\n<!-- <div class=\"image-container\">-->\r\n<!-- <a href=\"{{ image }}\" target=\"_blank\" download>-->\r\n<!-- <img src=\"{{ image }}\">-->\r\n<!-- </a>-->\r\n<!-- </div>-->\r\n<!-- </div>-->\r\n<!-- </mat-grid-tile>-->\r\n<!-- <mat-grid-tile colspan=\"6\"><div class=\"grid-tile-content\">{{ 'IMAGE' | localize }}</div></mat-grid-tile>-->\r\n<!-- <mat-grid-tile colspan=\"2\">-->\r\n<!-- <div class=\"grid-tile-content\">-->\r\n<!-- <button mat-icon-button (click)=\"saveImage(image)\" title=\"{{'DOWNLOAD_IMAGE' | localize}}\">-->\r\n<!-- <mat-icon class=\"homedecorator-material-icons\">get_app</mat-icon>-->\r\n<!-- </button>-->\r\n<!-- </div>-->\r\n<!-- <div class=\"grid-tile-content no-padding right\"><button (click)=\"removeRender(image, index)\" class=\"remove-btn\"><mat-icon class=\"homedecorator-material-icons\">delete</mat-icon></button></div>-->\r\n<!-- </mat-grid-tile>-->\r\n<!-- </ng-container>-->\r\n<!-- </mat-grid-list>-->\r\n<!-- </div>-->\r\n </div>\r\n\r\n <button mat-button mat-dialog-close class=\"close_btn\">X</button>\r\n\r\n </div>\r\n\r\n</ng-container>\r\n", styles: ["::ng-deep .render-dialog-content .mat-dialog-container{margin:0;padding:0}::ng-deep .render-dialog-content .mat-dialog-container .mat-dialog-content{margin:0;padding:0}:host{display:block;max-width:100%;position:relative;box-sizing:border-box}:host *{box-sizing:border-box}:host [hidden]{display:none!important}:host .close_btn{position:absolute;top:0;right:0;font-size:30px;padding:0;width:50px;min-width:0px;line-height:45px}:host .render_btn{position:absolute;left:65%;margin:0 0 0 -83px;bottom:15px}:host .render-camera-positions{display:flex;font-size:14px}:host .render-camera-positions .render-camera-positions-left{min-width:300px;background:#e4edf4;padding:15px;text-align:center}:host .render-camera-positions .render-camera-positions-left h3{text-align:left}:host .render-camera-positions .render-camera-positions-left h4{text-align:left;margin:0}:host .render-camera-positions .render-camera-positions-left .position-separator{width:100%;font-size:0;height:1px;background:#fff;margin:15px 0}:host .render-camera-positions .render-camera-positions-left p{font-size:12px;text-align:center;line-height:170%}:host .render-camera-positions .render-camera-positions-left button{font-size:12px;line-height:32px}:host .render-camera-positions .render-camera-positions-left button.matrixToggle{margin:0 0 5px}:host .render-camera-positions .render-camera-positions-left mat-grid-list{text-align:left}:host .render-camera-positions .render-camera-positions-left mat-grid-list mat-grid-tile .mat-figure{justify-content:left}:host .render-camera-positions .render-camera-positions-left mat-grid-list mat-grid-tile b{text-align:left;width:100%}:host .render-camera-positions .render-camera-positions-left mat-grid-list mat-grid-tile span{display:inline-block;text-align:right;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 10px;background:#fff;border-radius:5px;line-height:30px;font-size:90%}:host .render-camera-positions .render-camera-positions-left .mat-form-field{width:100%}:host .render-camera-positions .render-camera-positions-left mat-slide-toggle{float:right}:host .render-camera-positions .render-camera-positions-left .render-image-content{width:100%;align-self:start;position:relative}:host .render-camera-positions .render-camera-positions-left .render-image-content img{width:100%;max-width:100%;align-self:start;border-radius:5px}:host .render-camera-positions .render-camera-positions-left .render-image-content .loader{align-self:start;width:calc(100% - 20px);font-size:0;line-height:0;height:6px;position:absolute;left:10px;bottom:15px;z-index:2;text-align:left}:host .render-camera-positions .render-camera-positions-left .render-image-content .loader.ready .loader_progress{background:#74B77F}:host .render-camera-positions .render-camera-positions-left .render-image-content .loader.ready .loader_progress span{color:#74b77f;border-color:#74b77f}:host .render-camera-positions .render-camera-positions-left .render-image-content .loader .loader_progress{vertical-align:top;display:inline-block;background:#3760a1;height:6px;position:relative;transition:.2s ease-in-out;-moz-transition:.2s ease-in-out;-webkit-transition:.2s ease-in-out;border-radius:5px;min-width:25px}:host .render-camera-positions .render-camera-positions-left .render-image-content .loader .loader_progress span{float:left;width:25px;height:16px;line-height:16px;border-radius:4px;text-align:center;position:absolute;top:-5px;font-size:9px;font-weight:bold;background:#fff;right:0px}:host .render-camera-positions .render-camera-positions-left .image_spacer{position:relative;background:#fafafa;width:100%;height:200px;border-radius:5px}:host .render-camera-positions .render-camera-positions-left .image_spacer .mat-icon{position:absolute;margin:auto;left:0;top:0;right:0;bottom:0;width:60px;height:60px;font-size:60px}:host .render-camera-positions .render-camera-positions-right{width:70%;padding:15px 15px 66px;font-size:12px}:host .render-camera-positions .render-camera-positions-right.large{width:60%}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile{border-bottom:1px solid #e4edf4}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile.grid_head{border-color:#fff}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-head{width:100%;text-align:left;font-weight:bold;padding:0 15px}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content{width:100%;text-align:left;padding:0 15px}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.no-padding{padding:0}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.small-padding{padding:0 2px}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.right{text-align:right}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.grid-tile-image .image-container{width:100%;height:46px;border:1px solid #e4edf4;border-radius:5px;vertical-align:top;text-align:center;display:table;font-size:0}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.grid-tile-image .image-container a{display:table-cell;vertical-align:middle}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.grid-tile-image .image-container a img{max-width:100%;max-height:46px;display:inline-block}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.grid-tile-image .image-container .mat-icon{height:46px;line-height:46px}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content.grid-tile-image .image-container .mat-spinner{margin:11px 0 0;display:inline-block}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content .remove-btn{border:none;background:transparent;color:#0003;cursor:pointer}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content .remove-btn:hover{color:red}:host .render-camera-positions .render-camera-positions-right .mat-grid-tile .grid-tile-content .remove-btn .mat-icon{height:18px;width:18px;font-size:18px}\n"], components: [{ type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i16.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i19.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i8.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: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1$1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["type", "mat-dialog-close", "aria-label", "matDialogClose"], exportAs: ["matDialogClose"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.MatLabel, selector: "mat-label" }], pipes: { "localize": LocalizePipe }, animations: [
28343
28393
  trigger('slideInOut', [
28344
28394
  state('1', style({ 'max-height': '*' })),
28345
28395
  state('0', style({ 'max-height': '0px' })),
@@ -28360,7 +28410,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
28360
28410
  templateUrl: './render-dialog.component.html',
28361
28411
  styleUrls: ['./render-dialog.component.scss']
28362
28412
  }]
28363
- }], ctorParameters: function () { return [{ type: CameraService }, { type: RenderService }, { type: MessageBusService }, { type: UtilsService }, { type: i1.DomSanitizer }, { type: HomedecoratorSettingsService }, { type: NewRenderService }, { type: ApiServiceModule }]; }, propDecorators: { renderImageField: [{
28413
+ }], ctorParameters: function () { return [{ type: CameraService }, { type: RenderService }, { type: MessageBusService }, { type: UtilsService }, { type: i1.DomSanitizer }, { type: HomedecoratorSettingsService }, { type: NewRenderService }, { type: ApiServiceModule }, { type: i1$1.MatDialog }]; }, propDecorators: { renderImageField: [{
28364
28414
  type: ViewChild,
28365
28415
  args: ['render_image', { static: true }]
28366
28416
  }], imageWidthField: [{
@@ -30364,7 +30414,7 @@ class LiteSelectorComponent {
30364
30414
  }
30365
30415
  }
30366
30416
  LiteSelectorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: LiteSelectorComponent, deps: [{ token: HomedecoratorConnectorService }, { token: BuildFurnitureService }, { token: HomedecoratorSettingsService }], target: i0.ɵɵFactoryTarget.Component });
30367
- LiteSelectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: LiteSelectorComponent, selector: "rp-lite-selector", inputs: { showAnswers: "showAnswers", show: "show", showSelections: "showSelections", showLabel: "showLabel", canClose: "canClose", metadata: "metadata", customDimensions: "customDimensions" }, outputs: { showChange: "showChange", answerChosen: "answerChosen" }, host: { properties: { "class.custom-dimensions": "this.customDimensions" } }, viewQueries: [{ propertyName: "templateAnswers", first: true, predicate: ["templateAnswers"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: "<ng-container *ngIf=\"show\">\r\n <rp-selections-summary *ngIf=\"showSelections && iOne.selectionsToDisplay.length > 0\" @showSelections [@.disabled]=\"!animateSlideout\"\r\n class=\"rp-selections-summary\"\r\n [showLabel]=\"showLabel\"\r\n [canClose]=\"canClose\"\r\n [customDimensions]=\"customDimensions\"\r\n [answersTemplate]=\"inlineAnswers ? templateAnswers : undefined\"\r\n [answerToShowFromSelectionText]=\"answerToShowFromSelectionText\"\r\n [selections]=\"iOne.selectionsToDisplay\"\r\n (selectSelection)=\"onSelectionsSummarySelectSelection($event)\"\r\n (closeClick)=\"onCloseLiteSelectorButtonClick()\"\r\n >\r\n </rp-selections-summary>\r\n <ng-container *ngIf=\"!inlineAnswers\" [ngTemplateOutlet]=\"templateAnswers\"></ng-container>\r\n</ng-container>\r\n\r\n<ng-template #templateAnswers>\r\n <rp-answers-slideout\r\n class=\"rp-answers-slideout\"\r\n [metadata]=\"metadata\"\r\n [isShown]=\"showAnswers && buildFurnitureService.activeAnswers.length > 0\"\r\n [showTitle]=\"!inlineAnswers\"\r\n [showFilter]=\"!inlineAnswers\"\r\n [useSlideout]=\"!inlineAnswers\"\r\n [customDimensions]=\"customDimensions\"\r\n [question]=\"buildFurnitureService.activeQuestion\"\r\n [answers]=\"buildFurnitureService.activeAnswers\"\r\n (answerChosen)=\"onAnswersSlideoutAnswerChosen($event)\"\r\n ></rp-answers-slideout>\r\n</ng-template>\r\n", styles: [":host.floating ::ng-deep rp-selections-summary{position:absolute;right:0;max-height:calc(100vh - 120px)}:host:not(.custom-dimensions).floating ::ng-deep rp-selections-summary{top:64px;max-height:calc(100vh - 184px)}\n"], components: [{ type: SelectionsSummaryComponent, selector: "rp-selections-summary", inputs: ["selections", "showLabel", "canClose", "answersTemplate", "answerToShowFromSelectionText", "customDimensions"], outputs: ["closeClick", "cancelAnswers", "selectSelection"] }, { type: AnswersSlideoutComponent, selector: "rp-answers-slideout", inputs: ["isShown", "question", "showTitle", "showFilter", "metadata", "answers", "useSlideout", "customDimensions"], outputs: ["isShownChange", "answerChosen"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], animations: [
30417
+ LiteSelectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: LiteSelectorComponent, selector: "rp-lite-selector", inputs: { showAnswers: "showAnswers", show: "show", showSelections: "showSelections", showLabel: "showLabel", canClose: "canClose", metadata: "metadata", customDimensions: "customDimensions" }, outputs: { showChange: "showChange", answerChosen: "answerChosen" }, host: { properties: { "class.custom-dimensions": "this.customDimensions" } }, viewQueries: [{ propertyName: "templateAnswers", first: true, predicate: ["templateAnswers"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: "<ng-container *ngIf=\"show\">\r\n <rp-selections-summary *ngIf=\"showSelections && iOne.selectionsToDisplay.length > 0\" @showSelections [@.disabled]=\"!animateSlideout\"\r\n class=\"rp-selections-summary\"\r\n [showLabel]=\"showLabel\"\r\n [canClose]=\"canClose\"\r\n [customDimensions]=\"customDimensions\"\r\n [answersTemplate]=\"inlineAnswers ? templateAnswers : undefined\"\r\n [answerToShowFromSelectionText]=\"answerToShowFromSelectionText\"\r\n [selections]=\"iOne.selectionsToDisplay\"\r\n (selectSelection)=\"onSelectionsSummarySelectSelection($event)\"\r\n (closeClick)=\"onCloseLiteSelectorButtonClick()\"\r\n >\r\n </rp-selections-summary>\r\n <ng-container *ngIf=\"!inlineAnswers\" [ngTemplateOutlet]=\"templateAnswers\"></ng-container>\r\n</ng-container>\r\n\r\n<ng-template #templateAnswers>\r\n <rp-answers-slideout\r\n class=\"rp-answers-slideout\"\r\n [metadata]=\"metadata\"\r\n [isShown]=\"showAnswers && iOne.activeAnswers.length > 0\"\r\n [showTitle]=\"!inlineAnswers\"\r\n [showFilter]=\"!inlineAnswers\"\r\n [useSlideout]=\"!inlineAnswers\"\r\n [customDimensions]=\"customDimensions\"\r\n [question]=\"iOne.activeQuestion\"\r\n [answers]=\"iOne.activeAnswers\"\r\n (answerChosen)=\"onAnswersSlideoutAnswerChosen($event)\"\r\n ></rp-answers-slideout>\r\n</ng-template>\r\n", styles: [":host.floating ::ng-deep rp-selections-summary{position:absolute;right:0;max-height:calc(100vh - 120px)}:host:not(.custom-dimensions).floating ::ng-deep rp-selections-summary{top:64px;max-height:calc(100vh - 184px)}\n"], components: [{ type: SelectionsSummaryComponent, selector: "rp-selections-summary", inputs: ["selections", "showLabel", "canClose", "answersTemplate", "answerToShowFromSelectionText", "customDimensions"], outputs: ["closeClick", "cancelAnswers", "selectSelection"] }, { type: AnswersSlideoutComponent, selector: "rp-answers-slideout", inputs: ["isShown", "question", "showTitle", "showFilter", "metadata", "answers", "useSlideout", "customDimensions"], outputs: ["isShownChange", "answerChosen"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], animations: [
30368
30418
  trigger('showSelections', [
30369
30419
  state('void', style({ 'transform': 'translateX(100%)', opacity: 0 })),
30370
30420
  state('*', style({ 'transform': 'translateX(0%)', opacity: 1 })),
@@ -31063,12 +31113,13 @@ var __awaiter$s = (this && this.__awaiter) || function (thisArg, _arguments, P,
31063
31113
  });
31064
31114
  };
31065
31115
  class FloorplannerComponent {
31066
- constructor(_floorplanService, _messageBusService, _configurationService, _dimensionService, _viewModeService) {
31116
+ constructor(_floorplanService, _messageBusService, _configurationService, _dimensionService, _viewModeService, _roomService) {
31067
31117
  this._floorplanService = _floorplanService;
31068
31118
  this._messageBusService = _messageBusService;
31069
31119
  this._configurationService = _configurationService;
31070
31120
  this._dimensionService = _dimensionService;
31071
31121
  this._viewModeService = _viewModeService;
31122
+ this._roomService = _roomService;
31072
31123
  this.selectedWallChange = new Subject();
31073
31124
  this._viewScaleMin = 50;
31074
31125
  this._viewScaleMax = 300;
@@ -31182,7 +31233,11 @@ class FloorplannerComponent {
31182
31233
  }
31183
31234
  }
31184
31235
  showStartMessage() {
31185
- this._diagramBackground.src = '';
31236
+ if (this._diagramBackground) {
31237
+ this._diagramBackground.src = '';
31238
+ }
31239
+ this._floorplanService.reset();
31240
+ this._draw();
31186
31241
  this.showStartingMessages = true;
31187
31242
  }
31188
31243
  setMode(mode) {
@@ -31656,7 +31711,13 @@ class FloorplannerComponent {
31656
31711
  this.setSelectedMode(value);
31657
31712
  }
31658
31713
  setDiagramSettings(input) {
31714
+ this.reset();
31715
+ this._resetOrigin();
31716
+ this._viewScale = 100;
31717
+ this._updateCmPerPixel();
31718
+ this._draw();
31659
31719
  this._floorplanService.reset();
31720
+ this._roomService.resetAllRooms();
31660
31721
  this._diagramBackground = input.background;
31661
31722
  this._diagramBackgroundHeight = input.backgroundHeight;
31662
31723
  this._diagramBackgroundWidth = input.backgroundWidth;
@@ -32308,8 +32369,8 @@ class FloorplannerComponent {
32308
32369
  this._wallLength = null;
32309
32370
  }
32310
32371
  }
32311
- FloorplannerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FloorplannerComponent, deps: [{ token: FloorplanService }, { token: MessageBusService }, { token: ConfigurationService }, { token: DimensioningService }, { token: ViewModeService }], target: i0.ɵɵFactoryTarget.Component });
32312
- FloorplannerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: FloorplannerComponent, selector: "floor-planner", outputs: { selectedWallChange: "selectedWallChange" }, host: { listeners: { "document:keydown": "handleDocKeyDown($event)", "document:keyup": "handleDocKeyUp($event)", "window:resize": "resizeGrid()" } }, viewQueries: [{ propertyName: "canvasElement", first: true, predicate: ["floorplannerCanvas"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<canvas #floorplannerCanvas\r\n (contextmenu)=\"handleContextMenu($event)\"\r\n (mousedown)=\"handleMouseDown($event)\"\r\n (mousemove)=\"handleMouseMove($event)\"\r\n (mouseup)=\"handleMouseUp($event)\"\r\n (mouseleave)=\"handleMouseLeave($event)\"\r\n (wheel)=\"handleMouseWheel($event)\"\r\n (touchstart)=\"handleTouchStart($event)\"\r\n (touchmove)=\"handleTouchMove($event)\"\r\n (touchend)=\"handleTouchUp($event)\"\r\n (touchcancel)=\"handleTouchEnd($event)\"\r\n></canvas>\r\n\r\n<wall-length-input></wall-length-input>\r\n\r\n<div class=\"controls-top\">\r\n <mat-button-toggle-group class=\"mode-toggle\"\r\n (change)=\"changeFloorplannerMode($event.value)\"\r\n [value]=\"selectedMode\"\r\n >\r\n <mat-button-toggle [value]=\"floorplannerMode.Draw\" [matTooltip]=\"'DRAW_WALLS' | localize\">\r\n <mat-icon class=\"homedecorator-material-icons\">edit</mat-icon>\r\n </mat-button-toggle>\r\n <mat-button-toggle [value]=\"floorplannerMode.Move\" [matTooltip]=\"'SELECT_AND_MOVE_WALLS' | localize\">\r\n <mat-icon class=\"homedecorator-material-icons\" svgIcon=\"hand-pointer\"></mat-icon>\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n</div>\r\n\r\n<div class=\"hint\" *ngIf=\"mode === floorplannerMode.Drawing\" (click)=\"changeFloorplannerMode(floorplannerMode.Draw)\">\r\n {{ 'CLICK_HERE_TO_EXIT_DRAWING_MODE_OR_PRESS_THE_ESC_KEY' | localize }}\r\n</div>\r\n\r\n<div class=\"hint\" *ngIf=\"mode === floorplannerMode.Draw && this.showStartingMessages\">\r\n {{ 'TAB_ANYWHERE_TO_START' | localize }}\r\n</div>\r\n", styles: [":host{display:flex;height:100%;width:100%;background:#fff}:host.hidden{visibility:hidden}canvas{width:inherit;height:inherit}.controls-top{pointer-events:none;position:absolute;top:80px;width:100%;display:flex;align-items:center;justify-content:center}.controls-top>*{pointer-events:all;background:#fff;margin:0 3px}.hint{position:absolute;bottom:20px;left:50%;margin-left:-200px;padding:10px 20px;background:#74B77F;border:1px solid #cccccc;border-radius:3px;text-align:center}.mode-toggle>.mat-button-toggle-checked{color:#fff;background-color:#3760a1}\n"], components: [{ type: WallLengthInputComponent, selector: "wall-length-input" }, { type: i7$2.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-labelledby", "tabIndex", "appearance", "checked", "disabled", "id", "name", "aria-label", "value"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i7$2.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "localize": LocalizePipe } });
32372
+ FloorplannerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FloorplannerComponent, deps: [{ token: FloorplanService }, { token: MessageBusService }, { token: ConfigurationService }, { token: DimensioningService }, { token: ViewModeService }, { token: RoomService }], target: i0.ɵɵFactoryTarget.Component });
32373
+ FloorplannerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: FloorplannerComponent, selector: "floor-planner", outputs: { selectedWallChange: "selectedWallChange" }, host: { listeners: { "document:keydown": "handleDocKeyDown($event)", "document:keyup": "handleDocKeyUp($event)", "window:resize": "resizeGrid()" } }, viewQueries: [{ propertyName: "canvasElement", first: true, predicate: ["floorplannerCanvas"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<canvas #floorplannerCanvas\r\n (contextmenu)=\"handleContextMenu($event)\"\r\n (mousedown)=\"handleMouseDown($event)\"\r\n (mousemove)=\"handleMouseMove($event)\"\r\n (mouseup)=\"handleMouseUp($event)\"\r\n (mouseleave)=\"handleMouseLeave($event)\"\r\n (wheel)=\"handleMouseWheel($event)\"\r\n (touchstart)=\"handleTouchStart($event)\"\r\n (touchmove)=\"handleTouchMove($event)\"\r\n (touchend)=\"handleTouchUp($event)\"\r\n (touchcancel)=\"handleTouchEnd($event)\"\r\n></canvas>\r\n\r\n<wall-length-input></wall-length-input>\r\n\r\n<div class=\"controls-top\">\r\n <mat-button-toggle-group class=\"mode-toggle\"\r\n (change)=\"changeFloorplannerMode($event.value)\"\r\n [value]=\"selectedMode\"\r\n >\r\n <mat-button-toggle [value]=\"floorplannerMode.Draw\" [matTooltip]=\"'DRAW_WALLS' | localize\">\r\n <mat-icon class=\"homedecorator-material-icons\">edit</mat-icon>\r\n </mat-button-toggle>\r\n <mat-button-toggle [value]=\"floorplannerMode.Move\" [matTooltip]=\"'SELECT_AND_MOVE_WALLS' | localize\">\r\n <mat-icon class=\"homedecorator-material-icons\" svgIcon=\"hand-pointer\"></mat-icon>\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n</div>\r\n\r\n<div class=\"hint\" *ngIf=\"mode === floorplannerMode.Drawing\" (click)=\"changeFloorplannerMode(floorplannerMode.Draw)\">\r\n {{ 'CLICK_HERE_TO_EXIT_DRAWING_MODE_OR_PRESS_THE_ESC_KEY' | localize }}\r\n</div>\r\n\r\n<div class=\"hint\" *ngIf=\"mode === floorplannerMode.Draw && this.showStartingMessages\">\r\n {{ 'TAB_ANYWHERE_TO_START' | localize }}\r\n</div>\r\n", styles: [":host{display:flex;height:100%;width:100%;background:#fff}:host.hidden{visibility:hidden}canvas{width:inherit;height:inherit}.controls-top{pointer-events:none;position:absolute;top:80px;width:100%;display:flex;align-items:center;justify-content:center}.controls-top>*{pointer-events:all;background:#fff;margin:0 3px}.hint{position:absolute;bottom:20px;left:50%;margin-left:-200px;padding:10px 20px;background:#74B77F;border:1px solid #cccccc;border-radius:3px;text-align:center}.mode-toggle>.mat-button-toggle-checked{color:#fff;background-color:#3760a1}\n"], components: [{ type: WallLengthInputComponent, selector: "wall-length-input" }, { type: i8$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-labelledby", "tabIndex", "appearance", "checked", "disabled", "id", "name", "aria-label", "value"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i8$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "localize": LocalizePipe } });
32313
32374
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FloorplannerComponent, decorators: [{
32314
32375
  type: Component,
32315
32376
  args: [{
@@ -32317,7 +32378,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
32317
32378
  templateUrl: './floorplanner.component.html',
32318
32379
  styleUrls: ['./floorplanner.component.scss']
32319
32380
  }]
32320
- }], ctorParameters: function () { return [{ type: FloorplanService }, { type: MessageBusService }, { type: ConfigurationService }, { type: DimensioningService }, { type: ViewModeService }]; }, propDecorators: { canvasElement: [{
32381
+ }], ctorParameters: function () { return [{ type: FloorplanService }, { type: MessageBusService }, { type: ConfigurationService }, { type: DimensioningService }, { type: ViewModeService }, { type: RoomService }]; }, propDecorators: { canvasElement: [{
32321
32382
  type: ViewChild,
32322
32383
  args: ['floorplannerCanvas', { read: ElementRef, static: true }]
32323
32384
  }], selectedWallChange: [{
@@ -33431,7 +33492,8 @@ var TextureEditorOptions;
33431
33492
  TextureEditorOptions[TextureEditorOptions["Both"] = 3] = "Both";
33432
33493
  })(TextureEditorOptions || (TextureEditorOptions = {}));
33433
33494
  class TextureEditorComponent {
33434
- constructor(_settingsService) {
33495
+ constructor(messageService, _settingsService) {
33496
+ this.messageService = messageService;
33435
33497
  this._settingsService = _settingsService;
33436
33498
  this.textureType = TextureType;
33437
33499
  this.dragNDropEnforced = false;
@@ -33473,6 +33535,7 @@ class TextureEditorComponent {
33473
33535
  };
33474
33536
  };
33475
33537
  // this.dampSetTexture = this.createDampener(this.setTexture);
33538
+ this._subs.push(this.messageService.subscribe(MessageType.ChangeTexture, (texture) => this.setNewTexture(texture)));
33476
33539
  }
33477
33540
  ngOnInit() {
33478
33541
  this.setTiled(false);
@@ -33492,7 +33555,9 @@ class TextureEditorComponent {
33492
33555
  }
33493
33556
  ngOnDestroy() {
33494
33557
  // this.dampSetTexture.release();
33495
- this._subs.forEach((s) => { s.unsubscribe(); });
33558
+ this._subs.forEach((s) => {
33559
+ s.unsubscribe();
33560
+ });
33496
33561
  this.canvas.nativeElement.removeEventListener('mousedown', () => this.onMouseDown());
33497
33562
  this.canvas.nativeElement.removeEventListener('mouseup', () => this.onMouseUp());
33498
33563
  this.canvas.nativeElement.removeEventListener('mousemove', e => this.onMouseMove(e));
@@ -33516,6 +33581,9 @@ class TextureEditorComponent {
33516
33581
  this.initializeTexture();
33517
33582
  }
33518
33583
  }
33584
+ setNewTexture(texture) {
33585
+ this.plainTexture = texture;
33586
+ }
33519
33587
  handleRemoveTextureClick(event) {
33520
33588
  this.imageHasBeenResized = false;
33521
33589
  this.removeTexture.emit(event);
@@ -33655,7 +33723,13 @@ class TextureEditorComponent {
33655
33723
  }
33656
33724
  initializeTexture() {
33657
33725
  return __awaiter$p(this, void 0, void 0, function* () {
33658
- const texture = this.texturePlane ? this.texturePlane.getTexture() : this.plainTexture;
33726
+ let texture;
33727
+ if (this.texturePlane && this.texturePlane.getTexture() !== undefined) {
33728
+ texture = this.texturePlane.getTexture();
33729
+ }
33730
+ else {
33731
+ texture = this.plainTexture;
33732
+ }
33659
33733
  if (texture) {
33660
33734
  yield this._loadTextureData(texture, false);
33661
33735
  }
@@ -33776,6 +33850,7 @@ class TextureEditorComponent {
33776
33850
  // this.dampSetTexture.emit(texture);
33777
33851
  this.imageHasBeenResized = resized;
33778
33852
  this.setTexture.emit(texture);
33853
+ // this.setNewTexture(texture);
33779
33854
  });
33780
33855
  }
33781
33856
  onMouseMove(event) {
@@ -33980,8 +34055,8 @@ class TextureEditorComponent {
33980
34055
  return destCanvas;
33981
34056
  }
33982
34057
  }
33983
- TextureEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: TextureEditorComponent, deps: [{ token: HomedecoratorSettingsService }], target: i0.ɵɵFactoryTarget.Component });
33984
- TextureEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: TextureEditorComponent, selector: "rp-texture-editor", inputs: { width: "width", height: "height", texturePlane: "texturePlane", plainTexture: "plainTexture", changedTexture: "changedTexture", options: "options", dragNDropEnforced: "dragNDropEnforced" }, outputs: { setTexture: "setTexture", removeTexture: "removeTexture" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, static: true }, { propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<rp-file-drop\r\n [showDragDrop]=\"((!changedTexture || texture?.type === textureType.Basic) && options !== Options.None) || dragNDropEnforced\"\r\n [showRemove]=\"changedTexture\"\r\n (fileContentChanged)=\"onPhotoDataChange($event)\"\r\n (removeClick)=\"handleRemoveTextureClick($event)\"\r\n>\r\n</rp-file-drop>\r\n\r\n<div class=\"resize-message-wrapper\" *ngIf=\"imageHasBeenResized\">\r\n <span class=\"resize-message\" [textContent]=\"'IMAGE_RESIZED' | localize\"></span>\r\n</div>\r\n\r\n<div class=\"picture-editor\" [hidden]=\"!texture || !changedTexture || dragNDropEnforced\">\r\n <div\r\n class=\"picture-editor-canvas\"\r\n [hidden]=\"options === Options.None || (texture?.type === textureType.Basic)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\"\r\n >\r\n <div\r\n class=\"canvas-wrapper\"\r\n fxLayout=\"column inline\"\r\n fxLayoutAlign=\"center center\"\r\n >\r\n <canvas [hidden]=\"texture && texture.stretch\" #canvas></canvas>\r\n <mat-button-toggle-group\r\n *ngIf=\"options === Options.Both\"\r\n (change)=\"tiledChanged($event.value === 'texture')\"\r\n [value]=\"tiled ? 'texture' : 'stretch'\"\r\n >\r\n <mat-button-toggle\r\n value=\"stretch\"\r\n title=\"{{'PICTURE' | localize}}\"\r\n [checked]=\"!tiled\">\r\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\">\r\n <mat-icon class=\"homedecorator-material-icons\">photo_size_select_large</mat-icon>\r\n {{'SKIN_FULL_WALL' | localize}}\r\n </div>\r\n </mat-button-toggle>\r\n <mat-button-toggle\r\n value=\"texture\"\r\n title=\"{{'TILE' | localize}}\"\r\n [checked]=\"tiled\"\r\n >\r\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\">\r\n <mat-icon class=\"homedecorator-material-icons\">texture</mat-icon>\r\n {{'CREATE_TEXTURE' | localize}}\r\n </div>\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sliders\" *ngIf=\"texture?.type === textureType.CustomPattern\r\n || ((texture?.type === textureType.Basic || texture?.type === textureType.PBR)\r\n && options === Options.None)\r\n\"\r\n >\r\n <rp-slider-input\r\n title=\"{{'TILE_ROTATION' | localize}}\"\r\n min=\"-180\"\r\n max=\"180\"\r\n step=\"1\"\r\n [value]=\"tileRotationDeg\"\r\n (onChange)=\"onTileRotationChange($event)\">\r\n </rp-slider-input>\r\n <rp-slider-input\r\n title=\"{{'TILE_SIZE' | localize}}\"\r\n [min]=\"tileSizeMin\"\r\n [max]=\"tileSizeMax\"\r\n step=\"0.1\"\r\n [value]=\"tileSize\"\r\n (onChange)=\"onTileSizeChange($event)\">\r\n </rp-slider-input>\r\n </div>\r\n\r\n <div class=\"sliders\" *ngIf=\"!isBasic(texture) && !isPBR(texture)\">\r\n <rp-slider-input\r\n title=\"{{'ROTATION' | localize}}\"\r\n min=\"-180\"\r\n max=\"180\"\r\n step=\"1\"\r\n [value]=\"textureRotationDeg\"\r\n (onChange)=\"onRotationChange($event)\">\r\n </rp-slider-input>\r\n <rp-slider-input\r\n title=\"{{'ZOOM' | localize}}\"\r\n [min]=\"-zoomSliderMax\"\r\n [max]=\"zoomSliderMax\"\r\n step=\"0.1\"\r\n [value]=\"textureScaleSlider\"\r\n (onChange)=\"onScaleChange($event)\">\r\n </rp-slider-input>\r\n </div>\r\n\r\n <!--\r\n <footer class=\"picture-editor-footer\">\r\n <button *ngIf=\"texture?.type !== TextureType.Basic || options === Options.None\"\r\n mat-stroked-button color=\"warn\"\r\n (click)=\"resetTexture()\"\r\n >\r\n {{ 'Remove' | localize }}\r\n </button>\r\n </footer>\r\n -->\r\n</div>\r\n", styles: ["rp-texture-editor{display:block;width:100%}.picture-editor-footer{margin-bottom:16px}.picture-editor-canvas{margin-top:.75em;margin-bottom:1.5em;text-align:center}.canvas-wrapper{position:relative}.canvas-wrapper mat-button-toggle-group{text-align:center;width:320px}.canvas-wrapper mat-button-toggle{flex-basis:50%;padding:4px 0}.resize-message-wrapper{margin:10px 3px 3px;text-align:-webkit-center}.resize-message-wrapper .resize-message{color:red;font-style:italic;font-weight:bold;font-size:.9em}\n"], components: [{ type: FileDropComponent, selector: "rp-file-drop", inputs: ["showDragDrop", "showRemove"], outputs: ["fileContentChanged", "removeClick"] }, { type: i7$2.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-labelledby", "tabIndex", "appearance", "checked", "disabled", "id", "name", "aria-label", "value"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: SliderInputComponent, selector: "rp-slider-input", inputs: ["title", "min", "max", "step", "value"], outputs: ["onChange"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3$3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i3$3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i7$2.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }], pipes: { "localize": LocalizePipe } });
34058
+ TextureEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: TextureEditorComponent, deps: [{ token: MessageBusService }, { token: HomedecoratorSettingsService }], target: i0.ɵɵFactoryTarget.Component });
34059
+ TextureEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: TextureEditorComponent, selector: "rp-texture-editor", inputs: { width: "width", height: "height", texturePlane: "texturePlane", plainTexture: "plainTexture", changedTexture: "changedTexture", options: "options", dragNDropEnforced: "dragNDropEnforced" }, outputs: { setTexture: "setTexture", removeTexture: "removeTexture" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, static: true }, { propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<rp-file-drop\r\n [showDragDrop]=\"((!changedTexture || texture?.type === textureType.Basic) && options !== Options.None) || dragNDropEnforced\"\r\n [showRemove]=\"changedTexture\"\r\n (fileContentChanged)=\"onPhotoDataChange($event)\"\r\n (removeClick)=\"handleRemoveTextureClick($event)\"\r\n>\r\n</rp-file-drop>\r\n\r\n<div class=\"resize-message-wrapper\" *ngIf=\"imageHasBeenResized\">\r\n <span class=\"resize-message\" [textContent]=\"'IMAGE_RESIZED' | localize\"></span>\r\n</div>\r\n\r\n<div class=\"picture-editor\" [hidden]=\"!texture || !changedTexture || dragNDropEnforced\">\r\n <div\r\n class=\"picture-editor-canvas\"\r\n [hidden]=\"options === Options.None || (texture?.type === textureType.Basic)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\"\r\n >\r\n <div\r\n class=\"canvas-wrapper\"\r\n fxLayout=\"column inline\"\r\n fxLayoutAlign=\"center center\"\r\n >\r\n <canvas [hidden]=\"texture && texture.stretch\" #canvas></canvas>\r\n <mat-button-toggle-group\r\n *ngIf=\"options === Options.Both\"\r\n (change)=\"tiledChanged($event.value === 'texture')\"\r\n [value]=\"tiled ? 'texture' : 'stretch'\"\r\n >\r\n <mat-button-toggle\r\n value=\"stretch\"\r\n title=\"{{'PICTURE' | localize}}\"\r\n [checked]=\"!tiled\">\r\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\">\r\n <mat-icon class=\"homedecorator-material-icons\">photo_size_select_large</mat-icon>\r\n {{'SKIN_FULL_WALL' | localize}}\r\n </div>\r\n </mat-button-toggle>\r\n <mat-button-toggle\r\n value=\"texture\"\r\n title=\"{{'TILE' | localize}}\"\r\n [checked]=\"tiled\"\r\n >\r\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\">\r\n <mat-icon class=\"homedecorator-material-icons\">texture</mat-icon>\r\n {{'CREATE_TEXTURE' | localize}}\r\n </div>\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sliders\" *ngIf=\"texture?.type === textureType.CustomPattern\r\n || ((texture?.type === textureType.Basic || texture?.type === textureType.PBR)\r\n && options === Options.None)\r\n\"\r\n >\r\n <rp-slider-input\r\n title=\"{{'TILE_ROTATION' | localize}}\"\r\n min=\"-180\"\r\n max=\"180\"\r\n step=\"1\"\r\n [value]=\"tileRotationDeg\"\r\n (onChange)=\"onTileRotationChange($event)\">\r\n </rp-slider-input>\r\n <rp-slider-input\r\n title=\"{{'TILE_SIZE' | localize}}\"\r\n [min]=\"tileSizeMin\"\r\n [max]=\"tileSizeMax\"\r\n step=\"0.1\"\r\n [value]=\"tileSize\"\r\n (onChange)=\"onTileSizeChange($event)\">\r\n </rp-slider-input>\r\n </div>\r\n\r\n <div class=\"sliders\" *ngIf=\"!isBasic(texture) && !isPBR(texture)\">\r\n <rp-slider-input\r\n title=\"{{'ROTATION' | localize}}\"\r\n min=\"-180\"\r\n max=\"180\"\r\n step=\"1\"\r\n [value]=\"textureRotationDeg\"\r\n (onChange)=\"onRotationChange($event)\">\r\n </rp-slider-input>\r\n <rp-slider-input\r\n title=\"{{'ZOOM' | localize}}\"\r\n [min]=\"-zoomSliderMax\"\r\n [max]=\"zoomSliderMax\"\r\n step=\"0.1\"\r\n [value]=\"textureScaleSlider\"\r\n (onChange)=\"onScaleChange($event)\">\r\n </rp-slider-input>\r\n </div>\r\n\r\n <!--\r\n <footer class=\"picture-editor-footer\">\r\n <button *ngIf=\"texture?.type !== TextureType.Basic || options === Options.None\"\r\n mat-stroked-button color=\"warn\"\r\n (click)=\"resetTexture()\"\r\n >\r\n {{ 'Remove' | localize }}\r\n </button>\r\n </footer>\r\n -->\r\n</div>\r\n", styles: ["rp-texture-editor{display:block;width:100%}.picture-editor-footer{margin-bottom:16px}.picture-editor-canvas{margin-top:.75em;margin-bottom:1.5em;text-align:center}.canvas-wrapper{position:relative}.canvas-wrapper mat-button-toggle-group{text-align:center;width:320px}.canvas-wrapper mat-button-toggle{flex-basis:50%;padding:4px 0}.resize-message-wrapper{margin:10px 3px 3px;text-align:-webkit-center}.resize-message-wrapper .resize-message{color:red;font-style:italic;font-weight:bold;font-size:.9em}\n"], components: [{ type: FileDropComponent, selector: "rp-file-drop", inputs: ["showDragDrop", "showRemove"], outputs: ["fileContentChanged", "removeClick"] }, { type: i8$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-labelledby", "tabIndex", "appearance", "checked", "disabled", "id", "name", "aria-label", "value"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: SliderInputComponent, selector: "rp-slider-input", inputs: ["title", "min", "max", "step", "value"], outputs: ["onChange"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3$3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i3$3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i8$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }], pipes: { "localize": LocalizePipe } });
33985
34060
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: TextureEditorComponent, decorators: [{
33986
34061
  type: Component,
33987
34062
  args: [{
@@ -33989,7 +34064,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
33989
34064
  templateUrl: './texture-editor.component.html',
33990
34065
  styleUrls: ['./texture-editor.component.scss']
33991
34066
  }]
33992
- }], ctorParameters: function () { return [{ type: HomedecoratorSettingsService }]; }, propDecorators: { fileInput: [{
34067
+ }], ctorParameters: function () { return [{ type: MessageBusService }, { type: HomedecoratorSettingsService }]; }, propDecorators: { fileInput: [{
33993
34068
  type: ViewChild,
33994
34069
  args: ['fileInput', { static: true }]
33995
34070
  }], canvas: [{
@@ -34743,7 +34818,7 @@ class CustomShapeCreatorComponent {
34743
34818
  }
34744
34819
  }
34745
34820
  CustomShapeCreatorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CustomShapeCreatorComponent, deps: [{ token: HudService }, { token: SceneService }, { token: RoomService }, { token: ItemService }, { token: SceneEventService }, { token: MessageBusService }], target: i0.ɵɵFactoryTarget.Component });
34746
- CustomShapeCreatorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: CustomShapeCreatorComponent, selector: "rp-custom-shape-creator", inputs: { shape: "shape" }, ngImport: i0, template: "<section>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"auto center\">\r\n <mat-form-field fxFlex=\"grow\">\r\n <input matInput #nameInputRef\r\n type=\"text\"\r\n placeholder=\"{{'SHAPES_NAME' | localize}}\"\r\n [value]=\"name\"\r\n >\r\n </mat-form-field>\r\n <button mat-icon-button\r\n [disabled]=\"name === nameInputRef.value\"\r\n (click)=\"setName(nameInputRef.value)\"\r\n >\r\n <mat-icon class=\"homedecorator-material-icons size-16\">check</mat-icon>\r\n </button>\r\n <button mat-icon-button\r\n [disabled]=\"name === nameInputRef.value\"\r\n (click)=\"nameInputRef.value = name\"\r\n >\r\n <mat-icon class=\"homedecorator-material-icons size-16\">cancel</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"switcher\">\r\n <h2 class=\"mat-body-2\">{{isFloorType ? ('FLOOR' | localize) : ('WALL' | localize)}}</h2>\r\n <mat-slide-toggle\r\n [checked]=\"isFloorType\"\r\n (change)=\"toggleItemType()\"\r\n [labelPosition]=\"'before'\"\r\n >\r\n </mat-slide-toggle>\r\n </div>\r\n\r\n <h3 class=\"mat-subheading-2\"> {{ 'MEASUREMENTS' | localize}}</h3>\r\n <div>\r\n <rp-dimension-input\r\n title=\"{{'HEIGHT' | localize}}\"\r\n [sourceValue]=\"height * scaleFactor\"\r\n [minValue]=\"10\"\r\n (dimensionChanged)=\"setHeight($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n\r\n <rp-dimension-input\r\n title=\"{{'WIDTH' | localize}}\"\r\n [sourceValue]=\"width * scaleFactor\"\r\n [minValue]=\"10\"\r\n (dimensionChanged)=\"setWidth($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n\r\n <rp-dimension-input\r\n title=\"{{'DEPTH' | localize}}\"\r\n [sourceValue]=\"depth * scaleFactor\"\r\n [minValue]=\"10\"\r\n (dimensionChanged)=\"setDepth($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n\r\n <rp-dimension-input\r\n title=\"{{'ELEVATION' | localize}}\"\r\n [sourceValue]=\"elevation * scaleFactor\"\r\n [minValue]=\"0\"\r\n (dimensionChanged)=\"setElevation($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n </div>\r\n\r\n <div>\r\n <h3 class=\"mat-subheading-2\"> {{ 'TEXTURES' | localize}}</h3>\r\n <mat-form-field id=\"face-select-form\">\r\n <mat-label>{{\"SELECT_FACE\" | localize}}</mat-label>\r\n <mat-select [(ngModel)]=\"selectedFace\">\r\n <mat-option [value]=\"faceRef.All\">{{ 'ALL' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Top\">{{ 'TOP' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Bottom\">{{ 'BOTTOM' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Front\">{{ 'FRONT' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Back\">{{ 'BACK' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Left\">{{ 'LEFT' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Right\">{{ 'RIGHT' | localize }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <rp-appearance-section\r\n type=\"shape\"\r\n [hideTextureTab]=\"true\"\r\n [color]=\"skin[selectedFace].color\"\r\n [plainTexture]=\"skin[selectedFace].texture\"\r\n [textureWidth]=\"skin[selectedFace].width() * 100\"\r\n [textureHeight]=\"skin[selectedFace].height() * 100\"\r\n [photoOptions]=\"textureOptions.Tiles\"\r\n (setTexture)=\"setTexture($event)\"\r\n (setColor)=\"setColor($event)\"\r\n >\r\n </rp-appearance-section>\r\n </div>\r\n</section>\r\n", styles: [":host{overflow:hidden}:host section{overflow-y:auto;height:100%}#face-select-form{width:100%}#create-button{color:#fff;background:#3760a1}::ng-deep .mat-select-panel{max-height:80vh!important}.switcher{margin-right:10px}\n"], components: [{ type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i10$1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "required", "checked", "aria-describedby"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: DimensionInputComponent, selector: "rp-dimension-input", inputs: ["minValue", "maxValue", "sourceValue", "title"], outputs: ["dimensionChanged", "focus", "blur"] }, { type: i9.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: AppearanceSectionComponent, selector: "rp-appearance-section", inputs: ["type", "hideTextureTab", "hideColorTab", "hidePhotoTab", "showGlassOption", "texturePlane", "plainTexture", "color", "textureWidth", "textureHeight", "photoOptions", "glassMaterial"], outputs: ["setTexture", "setColor", "setMaterial"] }], directives: [{ type: i3$3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i3$3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i3$3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i19.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i7.MatLabel, selector: "mat-label" }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "localize": LocalizePipe } });
34821
+ CustomShapeCreatorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: CustomShapeCreatorComponent, selector: "rp-custom-shape-creator", inputs: { shape: "shape" }, ngImport: i0, template: "<section>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"auto center\">\r\n <mat-form-field fxFlex=\"grow\">\r\n <input matInput #nameInputRef\r\n type=\"text\"\r\n placeholder=\"{{'SHAPES_NAME' | localize}}\"\r\n [value]=\"name\"\r\n >\r\n </mat-form-field>\r\n <button mat-icon-button\r\n [disabled]=\"name === nameInputRef.value\"\r\n (click)=\"setName(nameInputRef.value)\"\r\n >\r\n <mat-icon class=\"homedecorator-material-icons size-16\">check</mat-icon>\r\n </button>\r\n <button mat-icon-button\r\n [disabled]=\"name === nameInputRef.value\"\r\n (click)=\"nameInputRef.value = name\"\r\n >\r\n <mat-icon class=\"homedecorator-material-icons size-16\">cancel</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"switcher\">\r\n <h2 class=\"mat-body-2\">{{isFloorType ? ('FLOOR' | localize) : ('WALL' | localize)}}</h2>\r\n <mat-slide-toggle\r\n [checked]=\"isFloorType\"\r\n (change)=\"toggleItemType()\"\r\n [labelPosition]=\"'before'\"\r\n >\r\n </mat-slide-toggle>\r\n </div>\r\n\r\n <h3 class=\"mat-subheading-2\"> {{ 'MEASUREMENTS' | localize}}</h3>\r\n <div>\r\n <rp-dimension-input\r\n title=\"{{'HEIGHT' | localize}}\"\r\n [sourceValue]=\"height * scaleFactor\"\r\n [minValue]=\"0\"\r\n (dimensionChanged)=\"setHeight($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n\r\n <rp-dimension-input\r\n title=\"{{'WIDTH' | localize}}\"\r\n [sourceValue]=\"width * scaleFactor\"\r\n [minValue]=\"0\"\r\n (dimensionChanged)=\"setWidth($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n\r\n <rp-dimension-input\r\n title=\"{{'DEPTH' | localize}}\"\r\n [sourceValue]=\"depth * scaleFactor\"\r\n [minValue]=\"0\"\r\n (dimensionChanged)=\"setDepth($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n\r\n <rp-dimension-input\r\n title=\"{{'ELEVATION' | localize}}\"\r\n [sourceValue]=\"elevation * scaleFactor\"\r\n [minValue]=\"0\"\r\n (dimensionChanged)=\"setElevation($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n </div>\r\n\r\n <div>\r\n <h3 class=\"mat-subheading-2\"> {{ 'TEXTURES' | localize}}</h3>\r\n <mat-form-field id=\"face-select-form\">\r\n <mat-label>{{\"SELECT_FACE\" | localize}}</mat-label>\r\n <mat-select [(ngModel)]=\"selectedFace\">\r\n <mat-option [value]=\"faceRef.All\">{{ 'ALL' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Top\">{{ 'TOP' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Bottom\">{{ 'BOTTOM' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Front\">{{ 'FRONT' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Back\">{{ 'BACK' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Left\">{{ 'LEFT' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Right\">{{ 'RIGHT' | localize }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <rp-appearance-section\r\n type=\"shape\"\r\n [hideTextureTab]=\"true\"\r\n [color]=\"skin[selectedFace].color\"\r\n [plainTexture]=\"skin[selectedFace].texture\"\r\n [textureWidth]=\"skin[selectedFace].width() * 100\"\r\n [textureHeight]=\"skin[selectedFace].height() * 100\"\r\n [photoOptions]=\"textureOptions.Tiles\"\r\n (setTexture)=\"setTexture($event)\"\r\n (setColor)=\"setColor($event)\"\r\n >\r\n </rp-appearance-section>\r\n </div>\r\n</section>\r\n", styles: [":host{overflow:hidden}:host section{overflow-y:auto;height:100%}#face-select-form{width:100%}#create-button{color:#fff;background:#3760a1}::ng-deep .mat-select-panel{max-height:80vh!important}.switcher{margin-right:10px}\n"], components: [{ type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i10$1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "required", "checked", "aria-describedby"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: DimensionInputComponent, selector: "rp-dimension-input", inputs: ["minValue", "maxValue", "sourceValue", "title"], outputs: ["dimensionChanged", "focus", "blur"] }, { type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: AppearanceSectionComponent, selector: "rp-appearance-section", inputs: ["type", "hideTextureTab", "hideColorTab", "hidePhotoTab", "showGlassOption", "texturePlane", "plainTexture", "color", "textureWidth", "textureHeight", "photoOptions", "glassMaterial"], outputs: ["setTexture", "setColor", "setMaterial"] }], directives: [{ type: i3$3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i3$3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i3$3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i19.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i7.MatLabel, selector: "mat-label" }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "localize": LocalizePipe } });
34747
34822
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CustomShapeCreatorComponent, decorators: [{
34748
34823
  type: Component,
34749
34824
  args: [{
@@ -34919,7 +34994,9 @@ class CustomCylinderCreatorComponent {
34919
34994
  texture.width = this.skin[face].width();
34920
34995
  texture.dimensions = new Vector2(this.skin[face].width(), this.skin[face].height()).multiplyScalar(100);
34921
34996
  this.shape.customMesh.material[CylinderFaces.indexOf(face)] = new MeshPhongMaterial({
34922
- map: yield MaterialUtils.FromImage(texture)
34997
+ map: yield MaterialUtils.FromImage(texture),
34998
+ transparent: true,
34999
+ alphaTest: 0.5
34923
35000
  });
34924
35001
  }
34925
35002
  this.shape.skin[face] = { texture: texture };
@@ -34932,7 +35009,7 @@ class CustomCylinderCreatorComponent {
34932
35009
  }
34933
35010
  }
34934
35011
  CustomCylinderCreatorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CustomCylinderCreatorComponent, deps: [{ token: HudService }, { token: SceneService }, { token: ItemService }, { token: RoomService }, { token: SceneEventService }, { token: MessageBusService }], target: i0.ɵɵFactoryTarget.Component });
34935
- CustomCylinderCreatorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: CustomCylinderCreatorComponent, selector: "custom-cylinder-creator", inputs: { shape: "shape" }, ngImport: i0, template: "<section>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"auto center\">\r\n <mat-form-field fxFlex=\"grow\">\r\n <input matInput #nameInputRef\r\n type=\"text\"\r\n placeholder=\"{{'SHAPES_NAME' | localize}}\"\r\n [value]=\"name\"\r\n >\r\n </mat-form-field>\r\n <button mat-icon-button\r\n [disabled]=\"name === nameInputRef.value\"\r\n (click)=\"setName(nameInputRef.value)\"\r\n >\r\n <mat-icon class=\"homedecorator-material-icons size-16\">check</mat-icon>\r\n </button>\r\n <button mat-icon-button\r\n [disabled]=\"name === nameInputRef.value\"\r\n (click)=\"nameInputRef.value = name\"\r\n >\r\n <mat-icon class=\"homedecorator-material-icons size-16\">cancel</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"switcher\">\r\n <h2 class=\"mat-body-2\">{{isFloorType ? ('FLOOR' | localize) : ('WALL' | localize)}}</h2>\r\n <mat-slide-toggle\r\n [checked]=\"isFloorType\"\r\n (change)=\"toggleItemType()\"\r\n [labelPosition]=\"'before'\"\r\n >\r\n </mat-slide-toggle>\r\n </div>\r\n\r\n <h3 class=\"mat-subheading-2\"> {{ 'MEASUREMENTS' | localize}}</h3>\r\n <div>\r\n <rp-dimension-input\r\n title=\"{{'RADIUS' | localize}}\"\r\n [sourceValue]=\"radius * scaleFactor\"\r\n [minValue]=\"0\"\r\n (dimensionChanged)=\"setRadius($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n\r\n <rp-dimension-input\r\n title=\"{{'HEIGHT' | localize}}\"\r\n [sourceValue]=\"height * scaleFactor\"\r\n [minValue]=\"0\"\r\n (dimensionChanged)=\"setHeight($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n\r\n <rp-dimension-input\r\n *ngIf=\"isFloorType\"\r\n title=\"{{'ELEVATION' | localize}}\"\r\n [sourceValue]=\"elevation * scaleFactor\"\r\n [minValue]=\"0\"\r\n (dimensionChanged)=\"setElevation($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n </div>\r\n\r\n <div>\r\n <h3 class=\"mat-subheading-2\"> {{ 'TEXTURES' | localize}}</h3>\r\n <mat-form-field class=\"face-select-form\">\r\n <mat-label>{{\"SELECT_FACE\" | localize}}</mat-label>\r\n <mat-select [(ngModel)]=\"selectedFace\">\r\n <mat-option [value]=\"faceRef.All\">{{ 'ALL' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Top\">{{ 'TOP' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Bottom\">{{ 'BOTTOM' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Front\">{{ 'FRONT' | localize }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <rp-appearance-section\r\n [hideTextureTab]=\"true\"\r\n [color]=\"skin[selectedFace].color\"\r\n [plainTexture]=\"skin[selectedFace].texture\"\r\n [photoOptions]=\"textureOptions.Tiles\"\r\n [textureWidth]=\"skin[selectedFace].width() * 100\"\r\n [textureHeight]=\"skin[selectedFace].height() * 100\"\r\n (setTexture)=\"setTexture($event)\"\r\n (setColor)=\"setColor($event)\"\r\n >\r\n </rp-appearance-section>\r\n </div>\r\n</section>\r\n", styles: [":host{overflow:hidden}:host section{overflow-y:auto;height:100%}.face-select-form{width:100%}::ng-deep .mat-select-panel{max-height:80vh!important}.switcher{margin-right:10px}\n"], components: [{ type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i10$1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "required", "checked", "aria-describedby"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: DimensionInputComponent, selector: "rp-dimension-input", inputs: ["minValue", "maxValue", "sourceValue", "title"], outputs: ["dimensionChanged", "focus", "blur"] }, { type: i9.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: AppearanceSectionComponent, selector: "rp-appearance-section", inputs: ["type", "hideTextureTab", "hideColorTab", "hidePhotoTab", "showGlassOption", "texturePlane", "plainTexture", "color", "textureWidth", "textureHeight", "photoOptions", "glassMaterial"], outputs: ["setTexture", "setColor", "setMaterial"] }], directives: [{ type: i3$3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i3$3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i3$3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i19.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.MatLabel, selector: "mat-label" }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "localize": LocalizePipe } });
35012
+ CustomCylinderCreatorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: CustomCylinderCreatorComponent, selector: "custom-cylinder-creator", inputs: { shape: "shape" }, ngImport: i0, template: "<section>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"auto center\">\r\n <mat-form-field fxFlex=\"grow\">\r\n <input matInput #nameInputRef\r\n type=\"text\"\r\n placeholder=\"{{'SHAPES_NAME' | localize}}\"\r\n [value]=\"name\"\r\n >\r\n </mat-form-field>\r\n <button mat-icon-button\r\n [disabled]=\"name === nameInputRef.value\"\r\n (click)=\"setName(nameInputRef.value)\"\r\n >\r\n <mat-icon class=\"homedecorator-material-icons size-16\">check</mat-icon>\r\n </button>\r\n <button mat-icon-button\r\n [disabled]=\"name === nameInputRef.value\"\r\n (click)=\"nameInputRef.value = name\"\r\n >\r\n <mat-icon class=\"homedecorator-material-icons size-16\">cancel</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"switcher\">\r\n <h2 class=\"mat-body-2\">{{isFloorType ? ('FLOOR' | localize) : ('WALL' | localize)}}</h2>\r\n <mat-slide-toggle\r\n [checked]=\"isFloorType\"\r\n (change)=\"toggleItemType()\"\r\n [labelPosition]=\"'before'\"\r\n >\r\n </mat-slide-toggle>\r\n </div>\r\n\r\n <h3 class=\"mat-subheading-2\"> {{ 'MEASUREMENTS' | localize}}</h3>\r\n <div>\r\n <rp-dimension-input\r\n title=\"{{'RADIUS' | localize}}\"\r\n [sourceValue]=\"radius * scaleFactor\"\r\n [minValue]=\"0\"\r\n (dimensionChanged)=\"setRadius($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n\r\n <rp-dimension-input\r\n title=\"{{'HEIGHT' | localize}}\"\r\n [sourceValue]=\"height * scaleFactor\"\r\n [minValue]=\"0\"\r\n (dimensionChanged)=\"setHeight($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n\r\n <rp-dimension-input\r\n *ngIf=\"isFloorType\"\r\n title=\"{{'ELEVATION' | localize}}\"\r\n [sourceValue]=\"elevation * scaleFactor\"\r\n [minValue]=\"0\"\r\n (dimensionChanged)=\"setElevation($event / scaleFactor)\"\r\n >\r\n </rp-dimension-input>\r\n </div>\r\n\r\n <div>\r\n <h3 class=\"mat-subheading-2\"> {{ 'TEXTURES' | localize}}</h3>\r\n <mat-form-field class=\"face-select-form\">\r\n <mat-label>{{\"SELECT_FACE\" | localize}}</mat-label>\r\n <mat-select [(ngModel)]=\"selectedFace\">\r\n <mat-option [value]=\"faceRef.All\">{{ 'ALL' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Top\">{{ 'TOP' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Bottom\">{{ 'BOTTOM' | localize }}</mat-option>\r\n <mat-option [value]=\"faceRef.Front\">{{ 'FRONT' | localize }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <rp-appearance-section\r\n [hideTextureTab]=\"true\"\r\n [color]=\"skin[selectedFace].color\"\r\n [plainTexture]=\"skin[selectedFace].texture\"\r\n [photoOptions]=\"textureOptions.Tiles\"\r\n [textureWidth]=\"skin[selectedFace].width() * 100\"\r\n [textureHeight]=\"skin[selectedFace].height() * 100\"\r\n (setTexture)=\"setTexture($event)\"\r\n (setColor)=\"setColor($event)\"\r\n >\r\n </rp-appearance-section>\r\n </div>\r\n</section>\r\n", styles: [":host{overflow:hidden}:host section{overflow-y:auto;height:100%}.face-select-form{width:100%}::ng-deep .mat-select-panel{max-height:80vh!important}.switcher{margin-right:10px}\n"], components: [{ type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i10$1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "required", "checked", "aria-describedby"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: DimensionInputComponent, selector: "rp-dimension-input", inputs: ["minValue", "maxValue", "sourceValue", "title"], outputs: ["dimensionChanged", "focus", "blur"] }, { type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: AppearanceSectionComponent, selector: "rp-appearance-section", inputs: ["type", "hideTextureTab", "hideColorTab", "hidePhotoTab", "showGlassOption", "texturePlane", "plainTexture", "color", "textureWidth", "textureHeight", "photoOptions", "glassMaterial"], outputs: ["setTexture", "setColor", "setMaterial"] }], directives: [{ type: i3$3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i3$3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i3$3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i19.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.MatLabel, selector: "mat-label" }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "localize": LocalizePipe } });
34936
35013
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CustomCylinderCreatorComponent, decorators: [{
34937
35014
  type: Component,
34938
35015
  args: [{
@@ -37823,7 +37900,7 @@ ModelDialogFurnitureListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion
37823
37900
  <div class="furniture-item-wrapper">
37824
37901
  <co-icon *ngIf="item.errorMessages.length > 0" class="error-expand-handle" [class.expanded]="item.showErrors"
37825
37902
  [iconData]="iconService.getIcon(icon.ArrowPointDown)" (click)="item.showErrors = !item.showErrors"></co-icon>
37826
- <span class="furniture-item-title" [textContent]="item.name"></span>
37903
+ <span class="furniture-item-title" [textContent]="item.name ? item.name : item.sku"></span>
37827
37904
  <button *ngIf=showCopy class="furniture-item-copy"
37828
37905
  [textContent]="item.toggle ? ('COPIED' | localize) : ('COPY' | localize)"
37829
37906
  (click)="copyFurnitureName(item)"></button>
@@ -37923,7 +38000,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
37923
38000
  <div class="furniture-item-wrapper">
37924
38001
  <co-icon *ngIf="item.errorMessages.length > 0" class="error-expand-handle" [class.expanded]="item.showErrors"
37925
38002
  [iconData]="iconService.getIcon(icon.ArrowPointDown)" (click)="item.showErrors = !item.showErrors"></co-icon>
37926
- <span class="furniture-item-title" [textContent]="item.name"></span>
38003
+ <span class="furniture-item-title" [textContent]="item.name ? item.name : item.sku"></span>
37927
38004
  <button *ngIf=showCopy class="furniture-item-copy"
37928
38005
  [textContent]="item.toggle ? ('COPIED' | localize) : ('COPY' | localize)"
37929
38006
  (click)="copyFurnitureName(item)"></button>
@@ -41067,7 +41144,7 @@ class SaveDialogComponent {
41067
41144
  }
41068
41145
  }
41069
41146
  SaveDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SaveDialogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: PermanentStoreService }, { token: HomedecoratorIconCacheService }, { token: i1$1.MatDialog }, { token: i1$1.MatDialogRef }, { token: MessageBusService }, { token: PresetsService }, { token: HomedecoratorDictionaryService }, { token: HomedecoratorSettingsService }], target: i0.ɵɵFactoryTarget.Component });
41070
- SaveDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: SaveDialogComponent, selector: "rp-save-dialog", ngImport: i0, template: "<h1 mat-dialog-title>{{'SAVE_THE_PLAN' | localize}}</h1>\r\n<div mat-dialog-content class=\"dialog-wrapper\" cdkTrapFocus>\r\n <mat-nav-list>\r\n <mat-list-item (click)=\"saveToCloud()\">\r\n <h4 mat-line><strong>{{'SAVE_TO_CLOUD' | localize}}</strong></h4>\r\n <p mat-line class=\"item-description\">{{'ACCESS_THE_PLAN_USING_A_UNIQUE_CODE' | localize}}</p>\r\n </mat-list-item>\r\n <mat-list-item *ngIf=\"wasPlanSaved\" (click)=\"saveToCloud(true)\">\r\n <h4 mat-line><strong>{{'SAVE_AS_NEW' | localize}}</strong></h4>\r\n <p mat-line class=\"item-description\">{{'CREATE_A_COPY_OF_THE_PLAN' | localize}}</p>\r\n </mat-list-item>\r\n <button mat-mini-fab class=\"download-button\" (click)=\"download()\" *ngIf=\"permanentStoreService.code || showLocalSave\">\r\n <co-icon [iconData]=\"iconCache.getIcon(icon.Download)\"></co-icon>\r\n </button>\r\n </mat-nav-list>\r\n</div>\r\n", styles: [":host .mat-dialog-content{margin:0;padding:0;overflow:hidden}:host .mat-nav-list{display:flex;flex-direction:column}:host .mat-nav-list .mat-list-item:not(:last-child){margin-bottom:30px}:host .download-button{box-shadow:none;background-color:#3760a1;display:flex;align-items:center;justify-content:center;align-self:flex-end}:host .download-button ::ng-deep co-icon [fill]{fill:#fff}.mat-dialog-actions{margin-bottom:0}.item-description{white-space:inherit!important}\n"], components: [{ type: i2$2.MatNavList, selector: "mat-nav-list", inputs: ["disableRipple", "disabled"], exportAs: ["matNavList"] }, { type: i2$2.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["disableRipple", "disabled"], exportAs: ["matListItem"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4.ɵb, selector: "co-icon", inputs: ["icon", "iconData"] }], directives: [{ type: i1$1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1$1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i3.MatLine, selector: "[mat-line], [matLine]" }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "localize": LocalizePipe } });
41147
+ SaveDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: SaveDialogComponent, selector: "rp-save-dialog", ngImport: i0, template: "<h1 mat-dialog-title>{{'SAVE_THE_PLAN' | localize}}</h1>\r\n<div mat-dialog-content class=\"dialog-wrapper\" cdkTrapFocus>\r\n <mat-nav-list>\r\n <mat-list-item (click)=\"saveToCloud()\">\r\n <h4 mat-line><strong>{{'SAVE_TO_CLOUD' | localize}}</strong></h4>\r\n <p mat-line class=\"item-description\">{{'ACCESS_THE_PLAN_USING_A_UNIQUE_CODE' | localize}}</p>\r\n </mat-list-item>\r\n <mat-list-item *ngIf=\"wasPlanSaved\" (click)=\"saveToCloud(true)\">\r\n <h4 mat-line><strong>{{'SAVE_AS_NEW' | localize}}</strong></h4>\r\n <p mat-line class=\"item-description\">{{'CREATE_A_COPY_OF_THE_PLAN' | localize}}</p>\r\n </mat-list-item>\r\n <ng-container *ngIf=\"permanentStoreService.code || showLocalSave\">\r\n <button mat-mini-fab class=\"download-button\" (click)=\"download()\">\r\n <co-icon [iconData]=\"iconCache.getIcon(icon.Download)\"></co-icon>\r\n </button>\r\n </ng-container>\r\n </mat-nav-list>\r\n</div>\r\n", styles: [":host .mat-dialog-content{margin:0;padding:0;overflow:hidden}:host .mat-nav-list{display:flex;flex-direction:column}:host .mat-nav-list .mat-list-item:not(:last-child){margin-bottom:30px}:host .download-button{box-shadow:none;background-color:#3760a1;display:flex;align-items:center;justify-content:center;align-self:flex-end}:host .download-button ::ng-deep co-icon [fill]{fill:#fff}.mat-dialog-actions{margin-bottom:0}.item-description{white-space:inherit!important}\n"], components: [{ type: i2$2.MatNavList, selector: "mat-nav-list", inputs: ["disableRipple", "disabled"], exportAs: ["matNavList"] }, { type: i2$2.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["disableRipple", "disabled"], exportAs: ["matListItem"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4.ɵb, selector: "co-icon", inputs: ["icon", "iconData"] }], directives: [{ type: i1$1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1$1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i3.MatLine, selector: "[mat-line], [matLine]" }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "localize": LocalizePipe } });
41071
41148
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SaveDialogComponent, decorators: [{
41072
41149
  type: Component,
41073
41150
  args: [{
@@ -41100,8 +41177,8 @@ class DrawDialogComponent {
41100
41177
  this.draftingMode = 'movement';
41101
41178
  this.cameraOffset = { x: window.innerWidth / 2, y: window.innerHeight / 2 };
41102
41179
  this.cameraZoom = 1;
41103
- this.maxZoom = 5;
41104
- this.minZoom = 1;
41180
+ this.maxZoom = 10;
41181
+ this.minZoom = 0.1;
41105
41182
  this.scrollSensitivity = 0.005;
41106
41183
  this.isDragging = false;
41107
41184
  this.dragStart = { x: 0, y: 0 };
@@ -41140,6 +41217,17 @@ class DrawDialogComponent {
41140
41217
  this._context.stroke();
41141
41218
  }
41142
41219
  }
41220
+ if (this.draftingMode === 'movement') {
41221
+ this._canvas.style.cursor = 'pointer';
41222
+ }
41223
+ else {
41224
+ if (this.isDragging) {
41225
+ this._canvas.style.cursor = 'pointer';
41226
+ }
41227
+ else {
41228
+ this._canvas.style.cursor = `url(${drawModeCursorImageUrl}) 0 ${drawModeCursorHeight}, auto`;
41229
+ }
41230
+ }
41143
41231
  requestAnimationFrame(() => this.draw());
41144
41232
  };
41145
41233
  }
@@ -41175,6 +41263,9 @@ class DrawDialogComponent {
41175
41263
  this.hiddenImage.nativeElement.src = url;
41176
41264
  }
41177
41265
  }
41266
+ updateUserValue() {
41267
+ this.customerInputLenght = this.inputLength.nativeElement.value;
41268
+ }
41178
41269
  handleMouseDown(event) {
41179
41270
  if (this.draftingMode === 'movement') {
41180
41271
  this.isDragging = true;
@@ -41220,16 +41311,13 @@ class DrawDialogComponent {
41220
41311
  this.cameraZoom = Math.max(this.cameraZoom, this.minZoom);
41221
41312
  }
41222
41313
  handleMouseWheel(event) {
41223
- if (this.draftingMode === 'movement') {
41224
- const zoomAmount = event.deltaY * this.scrollSensitivity;
41225
- console.log(zoomAmount);
41226
- if (!this.isDragging) {
41227
- if (zoomAmount) {
41228
- this.cameraZoom -= zoomAmount;
41229
- }
41230
- this.cameraZoom = Math.min(this.cameraZoom, this.maxZoom);
41231
- this.cameraZoom = Math.max(this.cameraZoom, this.minZoom);
41314
+ const zoomAmount = event.deltaY * this.scrollSensitivity;
41315
+ if (!this.isDragging) {
41316
+ if (zoomAmount) {
41317
+ this.cameraZoom -= zoomAmount;
41232
41318
  }
41319
+ this.cameraZoom = Math.min(this.cameraZoom, this.maxZoom);
41320
+ this.cameraZoom = Math.max(this.cameraZoom, this.minZoom);
41233
41321
  }
41234
41322
  }
41235
41323
  getEventLocation(e) {
@@ -41242,12 +41330,6 @@ class DrawDialogComponent {
41242
41330
  }
41243
41331
  setModus(modus) {
41244
41332
  this.draftingMode = modus;
41245
- if (this.draftingMode === 'scaling') {
41246
- this._canvas.style.cursor = `url(assets/cursors/pencil.png) 0 26}, auto`;
41247
- }
41248
- else {
41249
- this._canvas.style.cursor = '';
41250
- }
41251
41333
  }
41252
41334
  submitLength() {
41253
41335
  if (this.inputLength.nativeElement.value !== '' && this.measurePoints.length === 2) {
@@ -41271,6 +41353,7 @@ class DrawDialogComponent {
41271
41353
  backgroundWidth: this.hiddenImage.nativeElement.width,
41272
41354
  cameraZoom: this.cameraZoom
41273
41355
  };
41356
+ this._messageService.emit(MessageType.StartWithEmptyRoom);
41274
41357
  this._messageService.emit(MessageType.LoadScaledDiagram, output);
41275
41358
  this._dialog.closeAll();
41276
41359
  }
@@ -41321,7 +41404,7 @@ class DrawDialogComponent {
41321
41404
  }
41322
41405
  }
41323
41406
  DrawDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: DrawDialogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1$1.MatDialogRef }, { token: i1$1.MatDialog }, { token: MessageBusService }, { token: UtilsService }, { token: PresetsService }], target: i0.ɵɵFactoryTarget.Component });
41324
- DrawDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: DrawDialogComponent, selector: "rp-draw-dialog", viewQueries: [{ propertyName: "canvasElement", first: true, predicate: ["drawCanvas"], descendants: true, read: ElementRef, static: true }, { propertyName: "inputLength", first: true, predicate: ["inputLength"], descendants: true }, { propertyName: "hiddenImage", first: true, predicate: ["hiddenImage"], descendants: true }], ngImport: i0, template: "<h1 mat-dialog-title>{{ 'OPEN_A_DIAGRAM' | localize }}</h1>\r\n\r\n\r\n<div class=\"top-bar-container\" >\r\n <div class=\"reference-input-container\" *ngIf=\"draftingMode === 'scaling'\">\r\n <div class=\"input-button-container\">\r\n <input\r\n #inputLength\r\n type=\"number\"\r\n placeholder=\"{{ 'PDF_REFERENCE_PLACEHOLDER' | localize}}\"\r\n [attr.disabled]=\"this.measurePoints.length === 0 ? '' : null\"\r\n >\r\n <button (click)=\"resetPoints()\" title=\"Reset referentie meting\">\r\n <mat-icon class=\"homedecorator-material-icons\">refresh</mat-icon>\r\n </button>\r\n </div>\r\n <p class=\"helper-text\">{{ 'PDF_REFERENCE_HELPER' | localize }}</p>\r\n </div>\r\n\r\n<!-- <div class=\"rotation-input-container\" *ngIf=\"draftingMode === 'scaling'\">-->\r\n<!-- rotatiedingen-->\r\n<!-- </div>-->\r\n\r\n <div class=\"zoom-button-containers\" *ngIf=\"draftingMode === 'movement'\">\r\n <button (click)=\"clickingZoom('in')\">\r\n <mat-icon class=\"homedecorator-material-icons\">zoom_in</mat-icon>\r\n </button>\r\n <button (click)=\"clickingZoom('reset')\">\r\n <mat-icon class=\"homedecorator-material-icons\">all_out</mat-icon>\r\n </button>\r\n <button (click)=\"clickingZoom('out')\">\r\n <mat-icon class=\"homedecorator-material-icons\">zoom_out</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div class=\"main-button-container\">\r\n <mat-button-toggle-group\r\n class=\"mode-toggle\"\r\n (change)=\"setModus($event.value)\"\r\n [value]=\"draftingMode\">\r\n <mat-button-toggle [value]=\"'movement'\" [matTooltip]=\"'Zoom / verplaats modus'\">\r\n <mat-icon svgIcon=\"hand-pointer\"></mat-icon>\r\n </mat-button-toggle>\r\n <mat-button-toggle [value]=\"'scaling'\" [matTooltip]=\"'Maak referentie meting'\">\r\n <mat-icon svgIcon=\"pen-ruler\"></mat-icon>\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n</div>\r\n\r\n<div class=\"canvas-wrapper\">\r\n <canvas\r\n #drawCanvas\r\n (mousedown)=\"handleMouseDown($event)\"\r\n (mousemove)=\"handleMouseMove($event)\"\r\n (mouseup)=\"handleMouseUp($event)\"\r\n (mouseleave)=\"handleMouseLeave($event)\"\r\n (wheel)=\"handleMouseWheel($event)\"\r\n ></canvas>\r\n</div>\r\n\r\n<div class=\"save-cancel-button-container\">\r\n <button (click)=\"cancelAndReset()\">\r\n <mat-icon class=\"homedecorator-material-icons\">cancel</mat-icon>\r\n <span>Cancel</span>\r\n </button>\r\n <button (click)=\"submitLength()\" title=\"Opslaan\" *ngIf=\"draftingMode === 'scaling'\">\r\n <mat-icon class=\"homedecorator-material-icons\">check_circle</mat-icon>\r\n <span>Ok</span>\r\n </button>\r\n</div>\r\n\r\n<img #hiddenImage src=\"\" style=\"display: none;\">\r\n", styles: ["canvas{position:relative}button{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:5px;display:flex;align-items:center}button:hover{background:#dda73f;color:#fff}.main-button-container{display:flex;justify-content:center;margin-bottom:15px}.main-button-container .mat-button-toggle-checked{background:#dda73f;color:#fff}.reference-input-container .input-button-container{display:flex;align-items:center}.reference-input-container .input-button-container input{min-width:285px;border:1px solid #f7f7f9;border-radius:3px;height:35px;line-height:35px;box-sizing:border-box;padding:10px}.reference-input-container .input-button-container input:disabled{background:#f7f7f9;cursor:default}.reference-input-container .input-button-container button{border:none;display:inline-block}.reference-input-container .helper-text{font-size:13px;font-style:italic;margin:0;padding:0;display:block}.zoom-button-containers{display:flex;justify-items:center;justify-content:right}.zoom-button-containers button{margin:0 5px}.save-cancel-button-container{display:flex;justify-content:center;justify-items:center}.save-cancel-button-container button{margin:3px 10px;padding:8px 15px}.save-cancel-button-container button .homedecorator-material-icons{font-size:18px}.save-cancel-button-container button span{line-height:18px;font-size:15px}.canvas-wrapper{overflow:scroll;max-height:60vh;max-width:80vw}\n"], components: [{ type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7$2.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-labelledby", "tabIndex", "appearance", "checked", "disabled", "id", "name", "aria-label", "value"], outputs: ["change"], exportAs: ["matButtonToggle"] }], directives: [{ type: i1$1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7$2.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], pipes: { "localize": LocalizePipe } });
41407
+ DrawDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: DrawDialogComponent, selector: "rp-draw-dialog", viewQueries: [{ propertyName: "canvasElement", first: true, predicate: ["drawCanvas"], descendants: true, read: ElementRef, static: true }, { propertyName: "inputLength", first: true, predicate: ["inputLength"], descendants: true }, { propertyName: "hiddenImage", first: true, predicate: ["hiddenImage"], descendants: true }], ngImport: i0, template: "<h1 mat-dialog-title>{{ 'OPEN_A_DIAGRAM' | localize }}</h1>\r\n\r\n\r\n<div class=\"top-bar-container\" >\r\n <div class=\"reference-input-container\" *ngIf=\"draftingMode === 'scaling'\">\r\n <div class=\"input-button-container\">\r\n <input\r\n (change)=\"updateUserValue()\"\r\n [value]=\"customerInputLenght\"\r\n #inputLength\r\n type=\"number\"\r\n placeholder=\"{{ 'PDF_REFERENCE_PLACEHOLDER' | localize}}\"\r\n [attr.disabled]=\"this.measurePoints.length === 0 ? '' : null\"\r\n >\r\n <button (click)=\"resetPoints()\" title=\"Reset referentie meting\">\r\n <mat-icon class=\"homedecorator-material-icons\">refresh</mat-icon>\r\n </button>\r\n </div>\r\n <p class=\"helper-text\">{{ 'PDF_REFERENCE_HELPER' | localize }}</p>\r\n </div>\r\n\r\n<!-- <div class=\"rotation-input-container\" *ngIf=\"draftingMode === 'scaling'\">-->\r\n<!-- rotatiedingen-->\r\n<!-- </div>-->\r\n\r\n <div class=\"zoom-button-containers\" *ngIf=\"draftingMode === 'movement'\">\r\n <button (click)=\"clickingZoom('in')\">\r\n <mat-icon class=\"homedecorator-material-icons\">zoom_in</mat-icon>\r\n </button>\r\n <button (click)=\"clickingZoom('reset')\">\r\n <mat-icon class=\"homedecorator-material-icons\">all_out</mat-icon>\r\n </button>\r\n <button (click)=\"clickingZoom('out')\">\r\n <mat-icon class=\"homedecorator-material-icons\">zoom_out</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div class=\"main-button-container\">\r\n <mat-button-toggle-group\r\n class=\"mode-toggle\"\r\n (change)=\"setModus($event.value)\"\r\n [value]=\"draftingMode\">\r\n <mat-button-toggle [value]=\"'movement'\" [matTooltip]=\"'Zoom / verplaats modus'\">\r\n <mat-icon svgIcon=\"hand-pointer\"></mat-icon>\r\n </mat-button-toggle>\r\n <mat-button-toggle [value]=\"'scaling'\" [matTooltip]=\"'Maak referentie meting'\">\r\n <mat-icon svgIcon=\"pen-ruler\"></mat-icon>\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n</div>\r\n\r\n<div class=\"canvas-wrapper\">\r\n <canvas\r\n #drawCanvas\r\n (mousedown)=\"handleMouseDown($event)\"\r\n (mousemove)=\"handleMouseMove($event)\"\r\n (mouseup)=\"handleMouseUp($event)\"\r\n (mouseleave)=\"handleMouseLeave($event)\"\r\n (wheel)=\"handleMouseWheel($event)\"\r\n ></canvas>\r\n</div>\r\n\r\n<div class=\"save-cancel-button-container\">\r\n <button (click)=\"cancelAndReset()\">\r\n <mat-icon class=\"homedecorator-material-icons\">cancel</mat-icon>\r\n <span>Cancel</span>\r\n </button>\r\n <button (click)=\"submitLength()\" title=\"Opslaan\" *ngIf=\"draftingMode === 'scaling'\">\r\n <mat-icon class=\"homedecorator-material-icons\">check_circle</mat-icon>\r\n <span>Ok</span>\r\n </button>\r\n</div>\r\n\r\n<img #hiddenImage src=\"\" style=\"display: none;\">\r\n", styles: ["canvas{position:relative}button{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:5px;display:flex;align-items:center}button:hover{background:#dda73f;color:#fff}.main-button-container{display:flex;justify-content:center;margin-bottom:15px}.main-button-container .mat-button-toggle-checked{background:#dda73f;color:#fff}.reference-input-container .input-button-container{display:flex;align-items:center}.reference-input-container .input-button-container input{min-width:285px;border:1px solid #f7f7f9;border-radius:3px;height:35px;line-height:35px;box-sizing:border-box;padding:10px}.reference-input-container .input-button-container input:disabled{background:#f7f7f9;cursor:default}.reference-input-container .input-button-container button{border:none;display:inline-block}.reference-input-container .helper-text{font-size:13px;font-style:italic;margin:0;padding:0;display:block}.zoom-button-containers{display:flex;justify-items:center;justify-content:right}.zoom-button-containers button{margin:0 5px}.save-cancel-button-container{display:flex;justify-content:center;justify-items:center}.save-cancel-button-container button{margin:3px 10px;padding:8px 15px}.save-cancel-button-container button .homedecorator-material-icons{font-size:18px}.save-cancel-button-container button span{line-height:18px;font-size:15px}.canvas-wrapper{overflow:hidden;max-height:60vh;max-width:80vw}\n"], components: [{ type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i8$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-labelledby", "tabIndex", "appearance", "checked", "disabled", "id", "name", "aria-label", "value"], outputs: ["change"], exportAs: ["matButtonToggle"] }], directives: [{ type: i1$1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], pipes: { "localize": LocalizePipe } });
41325
41408
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: DrawDialogComponent, decorators: [{
41326
41409
  type: Component,
41327
41410
  args: [{
@@ -41555,9 +41638,10 @@ var __awaiter$4 = (this && this.__awaiter) || function (thisArg, _arguments, P,
41555
41638
  });
41556
41639
  };
41557
41640
  class ModelPreviewComponent {
41558
- constructor(data, settingsService, _dialogRef, _thirdPartyModelService, _messageService, _dialog, _adapterService, _lightPresetsService, _dictionaryService, _fontService) {
41641
+ constructor(data, settingsService, iconCache, _dialogRef, _thirdPartyModelService, _messageService, _dialog, _adapterService, _lightPresetsService, _dictionaryService, _fontService) {
41559
41642
  this.data = data;
41560
41643
  this.settingsService = settingsService;
41644
+ this.iconCache = iconCache;
41561
41645
  this._dialogRef = _dialogRef;
41562
41646
  this._thirdPartyModelService = _thirdPartyModelService;
41563
41647
  this._messageService = _messageService;
@@ -41567,6 +41651,7 @@ class ModelPreviewComponent {
41567
41651
  this._dictionaryService = _dictionaryService;
41568
41652
  this._fontService = _fontService;
41569
41653
  this.unitsOfMeasurement = 'cm';
41654
+ this.units = ['cm', 'inches'];
41570
41655
  this.mathPi = Math.PI;
41571
41656
  this.showReferenceModel = true;
41572
41657
  this.floorSizeHeight = 10;
@@ -41576,16 +41661,22 @@ class ModelPreviewComponent {
41576
41661
  this.distanceStep = 1;
41577
41662
  this.stackable = false;
41578
41663
  this.heightAdjustable = false;
41664
+ this.selectedPlacement = 0;
41579
41665
  this._measurements = [];
41666
+ this.icon = IconEnum;
41580
41667
  this.font = this._fontService.hudFont;
41581
41668
  }
41582
41669
  ngOnInit() {
41583
41670
  this.initScene();
41584
41671
  this.loadModel(this.data);
41672
+ this._adapterService.getModelPlacementOptions().then(result => {
41673
+ this.placementOptions = result;
41674
+ });
41585
41675
  }
41586
41676
  ngOnDestroy() {
41587
41677
  }
41588
41678
  initScene() {
41679
+ const viewScale = 1.3;
41589
41680
  // init scene
41590
41681
  this.scenePreview = new Scene();
41591
41682
  // init renderer
@@ -41609,11 +41700,11 @@ class ModelPreviewComponent {
41609
41700
  this.rendererPreview.outputColorSpace = LinearSRGBColorSpace;
41610
41701
  canvReference.appendChild(this.rendererPreview.domElement);
41611
41702
  this.rendererPreview.domElement.setAttribute('id', 'threed');
41612
- this.rendererPreview.setSize(window.innerWidth / 2, window.innerHeight / 2, true);
41703
+ this.rendererPreview.setSize(window.innerHeight / viewScale, window.innerHeight / viewScale, true);
41613
41704
  // init camera
41614
41705
  this.cameraPreview = new PerspectiveCamera(45, 1, 0.01, 100000000);
41615
41706
  this.cameraPreview.position.set(0, 2, 10);
41616
- this.cameraPreview.aspect = window.innerWidth / window.innerHeight;
41707
+ this.cameraPreview.aspect = (window.innerHeight / viewScale) / (window.innerHeight / viewScale);
41617
41708
  this.cameraPreview.updateProjectionMatrix();
41618
41709
  this.controls = new OrbitControls(this.cameraPreview, this.rendererPreview.domElement);
41619
41710
  this.controls.update();
@@ -41726,6 +41817,7 @@ class ModelPreviewComponent {
41726
41817
  }, options);
41727
41818
  }
41728
41819
  scaleArticle() {
41820
+ const model = this.scenePreview.getObjectByName(this.modelName);
41729
41821
  const inputHeight = this.heightArticle.nativeElement.value;
41730
41822
  let heightInMeter;
41731
41823
  if (this.unitsOfMeasurement === 'cm') {
@@ -41736,7 +41828,8 @@ class ModelPreviewComponent {
41736
41828
  }
41737
41829
  // scale = this.bounding / heightInMeter and use Y as up/ height
41738
41830
  const scale = this.boundingBoxSize.y / heightInMeter;
41739
- this.scenePreview.getObjectByName(this.modelName).scale.set(this.scenePreview.children[0].scale.x / scale, this.scenePreview.children[0].scale.y / scale, this.scenePreview.children[0].scale.z / scale);
41831
+ model.scale.set(model.scale.x / scale, model.scale.y / scale, model.scale.z / scale);
41832
+ this._getBoundingBox(model);
41740
41833
  }
41741
41834
  rotateModel(axis, degrees) {
41742
41835
  const model = this.scenePreview.getObjectByName(this.modelName);
@@ -41762,12 +41855,15 @@ class ModelPreviewComponent {
41762
41855
  else if (axis === 'z') {
41763
41856
  model.position.z += amount;
41764
41857
  }
41858
+ else if (axis === 'all') {
41859
+ model.position.set(0, 0, 0);
41860
+ }
41765
41861
  this._getBoundingBox(model);
41766
41862
  }
41767
41863
  setUnit(event) {
41768
41864
  this.unitsOfMeasurement = event.value;
41769
41865
  }
41770
- toggleShowReferenceModel() {
41866
+ toggleShowReferenceModel($event) {
41771
41867
  const model = this.scenePreview.getObjectByName('Reference_model');
41772
41868
  model.visible = !this.showReferenceModel;
41773
41869
  this.showReferenceModel = !this.showReferenceModel;
@@ -41799,6 +41895,7 @@ class ModelPreviewComponent {
41799
41895
  }
41800
41896
  _sendModelToCDN(fileName, blob) {
41801
41897
  return __awaiter$4(this, void 0, void 0, function* () {
41898
+ // console.log(this.placementOptions[this.selectedPlacement]);
41802
41899
  const reader = new FileReader();
41803
41900
  reader.readAsDataURL(blob);
41804
41901
  reader.onloadend = (event) => __awaiter$4(this, void 0, void 0, function* () {
@@ -41820,6 +41917,8 @@ class ModelPreviewComponent {
41820
41917
  });
41821
41918
  });
41822
41919
  }
41920
+ }).catch(error => {
41921
+ this._messageService.emit(MessageType.RenderError, { title: 'Upload error', message: error });
41823
41922
  });
41824
41923
  });
41825
41924
  });
@@ -41887,6 +41986,8 @@ class ModelPreviewComponent {
41887
41986
  this.boundingBoxSize = boundingBox.getSize(new Vector3());
41888
41987
  this._setMeasurements(this.boundingBoxSize);
41889
41988
  this._showMeasurements();
41989
+ const modelBoxhelper = this.scenePreview.getObjectByName('modelBoxhelper');
41990
+ this.scenePreview.remove(modelBoxhelper);
41890
41991
  const boxHelper = new BoxHelper(object);
41891
41992
  boxHelper.material.color.set(0xFF00FF);
41892
41993
  boxHelper.name = 'modelBoxhelper';
@@ -42009,225 +42110,297 @@ class ModelPreviewComponent {
42009
42110
  }
42010
42111
  }
42011
42112
  }
42012
- ModelPreviewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ModelPreviewComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: HomedecoratorSettingsService }, { token: i1$1.MatDialogRef }, { token: ThirdPartyModelService }, { token: MessageBusService }, { token: i1$1.MatDialog }, { token: HomedecoratorConnectorAdapterService }, { token: LightPresetsService }, { token: HomedecoratorDictionaryService }, { token: FontService }], target: i0.ɵɵFactoryTarget.Component });
42113
+ ModelPreviewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ModelPreviewComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: HomedecoratorSettingsService }, { token: HomedecoratorIconCacheService }, { token: i1$1.MatDialogRef }, { token: ThirdPartyModelService }, { token: MessageBusService }, { token: i1$1.MatDialog }, { token: HomedecoratorConnectorAdapterService }, { token: LightPresetsService }, { token: HomedecoratorDictionaryService }, { token: FontService }], target: i0.ɵɵFactoryTarget.Component });
42013
42114
  ModelPreviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ModelPreviewComponent, selector: "rp-model-preview", viewQueries: [{ propertyName: "glbExportName", first: true, predicate: ["fileName"], descendants: true }, { propertyName: "heightArticle", first: true, predicate: ["heightArticle"], descendants: true }], ngImport: i0, template: `
42014
42115
  <div class="model-preview">
42015
- <div class="model-preview-container" id="canvasContainer">
42116
+ <div class="model-preview-window">
42117
+ <div class="model-preview-container" id="canvasContainer"></div>
42118
+ <div class="model-preview-window-bottom">
42119
+ <div>
42120
+ <mat-slide-toggle
42121
+ [checked]="showReferenceModel"
42122
+ [labelPosition]="'after'"
42123
+ (change)="toggleShowReferenceModel($event)">
42124
+ Show Reference model
42125
+ </mat-slide-toggle>
42126
+ </div>
42127
+ <div class="disclaimer-text-container">
42128
+ <p class="disclaimer-text">
42129
+ Grid scale: 1 tile = 1x1 meter
42130
+ </p>
42131
+ </div>
42132
+ </div>
42016
42133
  </div>
42017
42134
  <div class="model-preview-actions">
42018
42135
  <div class="input-height-container">
42019
- <p>Centimeters of inches</p>
42020
- <div class="mat-radio-wrapper">
42021
- <mat-radio-group aria-label="Select an unit" (change)="setUnit($event)">
42022
- <mat-radio-button [checked]="true" value="cm">Height in cm</mat-radio-button>
42023
- <mat-radio-button value="inches">Height in inches</mat-radio-button>
42024
- </mat-radio-group>
42025
- </div>
42136
+ <h2>Model settings</h2>
42026
42137
  <div>
42027
- <input type="text" id="heightArticle" #heightArticle>
42028
- <button (click)="scaleArticle()">scale</button>
42138
+ <h3>Scale:</h3>
42139
+ <input type="text" id="heightArticle" #heightArticle placeholder="Set model height">
42140
+ <mat-form-field class="units-select-form">
42141
+ <mat-select class="units-mat-select" [(value)]="unitsOfMeasurement">
42142
+ <mat-option class="units-mat-option" *ngFor="let unit of units" [value]="unit">{{ unit }}</mat-option>
42143
+ </mat-select>
42144
+ </mat-form-field>
42145
+ <button class="apply-button base-button" (click)="scaleArticle()">Apply</button>
42029
42146
  </div>
42030
42147
  </div>
42031
-
42032
- <div>
42033
- <button (click)="toggleShowReferenceModel()">Show Reference model</button>
42034
- </div>
42035
-
42036
42148
  <div class="rotation-button-container">
42037
- <p>Rotation</p>
42038
- <div class="rotation-x-buttons">
42039
- <button (click)="rotateModel('x', mathPi / 2)">x-as + 90 graden</button>
42040
- <button (click)="rotateModel('x', -mathPi / 2)">x-as - 90 graden</button>
42149
+ <h3>Rotation:</h3>
42150
+ <div>
42151
+ <p>Rotate on X axis (90 degrees)</p>
42152
+ <p>
42153
+ <button (click)="rotateModel('x', -mathPi / 2)">
42154
+ <mat-icon svgIcon="dash-button"></mat-icon>
42155
+ </button>
42156
+ <button (click)="rotateModel('x', mathPi / 2)">
42157
+ <mat-icon svgIcon="add-button"></mat-icon>
42158
+ </button>
42159
+ </p>
42041
42160
  </div>
42042
- <div class="rotation-y-buttons">
42043
- <button (click)="rotateModel('y', mathPi / 2)">y-as + 90 graden</button>
42044
- <button (click)="rotateModel('y', -mathPi / 2)">y-as - 90 graden</button>
42161
+ <div>
42162
+ <p>Rotate on Y axis (90 degrees)</p>
42163
+ <p>
42164
+ <button (click)="rotateModel('y', -mathPi / 2)">
42165
+ <mat-icon svgIcon="dash-button"></mat-icon>
42166
+ </button>
42167
+ <button (click)="rotateModel('y', mathPi / 2)">
42168
+ <mat-icon svgIcon="add-button"></mat-icon>
42169
+ </button>
42170
+ </p>
42045
42171
  </div>
42046
- <div class="rotation-z-buttons">
42047
- <button (click)="rotateModel('z', mathPi / 2)">z-as + 90 graden</button>
42048
- <button (click)="rotateModel('z', -mathPi / 2)">z-as - 90 graden</button>
42172
+ <div>
42173
+ <p>Rotate on Z axis (90 degrees)</p>
42174
+ <p>
42175
+ <button (click)="rotateModel('z', -mathPi / 2)">
42176
+ <mat-icon svgIcon="dash-button"></mat-icon>
42177
+ </button>
42178
+ <button (click)="rotateModel('z', mathPi / 2)">
42179
+ <mat-icon svgIcon="add-button"></mat-icon>
42180
+ </button>
42181
+ </p>
42049
42182
  </div>
42050
42183
  </div>
42051
-
42052
-
42053
42184
  <div class="rotation-button-container">
42054
- <p>Positie</p>
42055
- <div class="rotation-x-buttons">
42056
- <button (click)="moveModel('x', 0.01)">x-as + 0.01</button>
42057
- <button (click)="moveModel('x', -0.01)">x-as -0.01</button>
42058
- </div>
42059
- <div class="rotation-y-buttons">
42060
- <button (click)="moveModel('y', 0.01)">y-as + 0.01</button>
42061
- <button (click)="moveModel('y', -0.01)">y-as - 0.01</button>
42185
+ <h3>Position:</h3>
42186
+ <div>
42187
+ <p>Reset to coordinates 0,0,0</p>
42188
+ <p>
42189
+ <button class="button-as-link" (click)="moveModel('all', 0)">
42190
+ <mat-icon svgIcon="retry-button"></mat-icon>
42191
+ Reset
42192
+ </button>
42193
+ </p>
42062
42194
  </div>
42063
- <div class="rotation-z-buttons">
42064
- <button (click)="moveModel('z', 0.01)">z-as + 0.01</button>
42065
- <button (click)="moveModel('z', -0.01)">z-as -0.01</button>
42195
+ <div>
42196
+ <p>Move on the Y axis (0.01 unit)</p>
42197
+ <p>
42198
+ <button (click)="moveModel('y', -0.01)">
42199
+ <mat-icon svgIcon="dash-button"></mat-icon>
42200
+ </button>
42201
+ <button (click)="moveModel('y', 0.01)">
42202
+ <mat-icon svgIcon="add-button"></mat-icon>
42203
+ </button>
42204
+ </p>
42066
42205
  </div>
42067
42206
  </div>
42068
42207
 
42069
- <div class="model-preview-info" *ngIf="this.data">
42070
- <div class="model-preview-info-container">
42071
- <div class="model-preview-info-left">
42072
- <label>Name</label>
42073
- </div>
42074
- <div class="model-preview-info-right">
42075
- <input type="text" id="fileName" #fileName value="{{ this.data.file.file.name }}">
42076
- </div>
42208
+ <div class="model-preview-info-container">
42209
+ <h3>Properties:</h3>
42210
+ <div>
42211
+ <mat-slide-toggle
42212
+ [checked]="false"
42213
+ [labelPosition]="'before'"
42214
+ (change)="setStackable($event)">
42215
+ Stackable
42216
+ </mat-slide-toggle>
42077
42217
  </div>
42078
-
42079
- <div class="model-preview-info-container">
42080
- <div class="model-preview-info-left">
42081
- <label>Stackable</label>
42082
- </div>
42083
- <div class="model-preview-info-right">
42084
- <div class="mat-radio-wrapper">
42085
- <mat-radio-group aria-label="Select an unit" (change)="setStackable($event)">
42086
- <mat-radio-button [checked]="true" value="false">No</mat-radio-button>
42087
- <mat-radio-button value="true">Yes</mat-radio-button>
42088
- </mat-radio-group>
42089
- </div>
42090
- </div>
42218
+ <div>
42219
+ <mat-slide-toggle
42220
+ [checked]="false"
42221
+ [labelPosition]="'before'"
42222
+ (change)="setHeightAdjustable($event)">
42223
+ Height adjustable
42224
+ </mat-slide-toggle>
42091
42225
  </div>
42092
42226
 
42093
- <div class="model-preview-info-container">
42094
- <div class="model-preview-info-left">
42095
- <label>Height adjustable</label>
42096
- </div>
42097
- <div class="model-preview-info-right">
42098
- <div class="mat-radio-wrapper">
42099
- <mat-radio-group aria-label="Select an unit" (change)="setHeightAdjustable($event)">
42100
- <mat-radio-button [checked]="true" value="false">No</mat-radio-button>
42101
- <mat-radio-button value="true">Yes</mat-radio-button>
42102
- </mat-radio-group>
42103
- </div>
42227
+ <div class="model-placement-container">
42228
+ <div>
42229
+ <label>Placement</label>
42230
+
42231
+ <mat-form-field *ngIf="placementOptions">
42232
+ <mat-select [(value)]="selectedPlacement">
42233
+ <mat-option *ngFor="let placementOption of placementOptions"
42234
+ [value]="placementOption.code">{{ placementOption.description }}
42235
+ </mat-option>
42236
+ </mat-select>
42237
+ </mat-form-field>
42104
42238
  </div>
42105
42239
  </div>
42240
+ </div>
42106
42241
 
42242
+ <div class="model-preview-info" *ngIf="this.data">
42107
42243
  <div class="model-preview-info-container">
42108
42244
  <div class="model-preview-info-left">
42109
- <label>Extension</label>
42245
+ <label>Save as:</label>
42110
42246
  </div>
42111
42247
  <div class="model-preview-info-right">
42112
- <label>{{ this.data.file.fileType }}</label>
42248
+ <input type="text" id="fileName" #fileName value="{{ this.data.file.file.name }}">
42113
42249
  </div>
42114
42250
  </div>
42115
- <button class="exportButton" (click)="exportSceneAsGLB('upload')">Upload to CDN and add to scene</button>
42116
- <p></p>
42117
- <button class="exportButton" (click)="exportSceneAsGLB('download')">Download model</button>
42251
+ <div>
42252
+ <button class="base-button exportButton" (click)="exportSceneAsGLB('upload')">Upload and add to scene</button>
42253
+ <button class="base-button exportButtonDark" (click)="exportSceneAsGLB('download')">Download</button>
42254
+ </div>
42118
42255
  </div>
42119
42256
  </div>
42120
42257
  </div>
42121
- `, isInline: true, styles: [".model-preview{display:flex;flex-direction:row}.model-preview .model-preview-actions{min-width:240px;box-sizing:border-box;padding:10px 20px;border-left:1px solid #5b6875}.model-preview .model-preview-actions .model-preview-info-container{margin-bottom:10px}.model-preview .model-preview-actions .model-preview-info-container .model-preview-info-left{font-weight:bolder}.model-preview .exportButton{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:5px;display:flex;align-items:center}.model-preview .exportButton:hover{background:#dda73f;color:#fff}input{border:1px solid #5b6875;box-sizing:border-box;padding:3px 10px;border-radius:3px}.mat-radio-wrapper{margin:10px 0}mat-radio-group mat-radio-button{display:block}.rotation-button-container div{display:flex;justify-content:space-between;margin-bottom:10px}.rotation-button-container div button{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:5px}.rotation-button-container div button:hover{background:#dda73f;color:#fff}\n"], components: [{ type: i9$1.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }], directives: [{ type: i9$1.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
42258
+ `, isInline: true, styles: [".model-preview{display:flex;flex-direction:row;font-size:14px}.model-preview .model-preview-window .model-preview-window-bottom{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.model-preview .model-preview-window .model-preview-window-bottom .disclaimer-text-container{padding-right:20px;text-align:right;font-style:italic;font-size:12px}.model-preview .model-preview-actions{min-width:350px;box-sizing:border-box;padding:10px 20px;border-left:1px solid #5b6875}.model-preview .model-preview-actions #heightArticle{max-width:160px}.model-preview .model-preview-actions .units-select-form{width:80px;margin:0 5px}.model-preview .model-preview-actions .model-preview-info-container{margin-bottom:10px}.model-preview .model-preview-actions .model-preview-info-container .model-preview-info-left{font-weight:bolder}.model-preview .model-preview-actions .model-preview-info{margin-top:80px}.model-preview .exportButton{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:5px;display:flex;align-items:center}.model-preview .exportButton:hover{background:#dda73f;color:#fff}.model-preview input{border:1px solid #5b6875;box-sizing:border-box;padding:3px 10px;border-radius:3px;line-height:30px;width:100%}.mat-radio-wrapper{margin:10px 0}mat-radio-group mat-radio-button{display:block}.base-button{cursor:pointer;color:#fff;background:#dda73f;border:1px solid #dda73f;border-radius:3px;box-sizing:border-box;padding:4px 10px;line-height:30px}.base-button:hover{background:#dda73f;color:#fff}.model-placement-container div{display:flex;justify-content:space-between;margin:5px 0;align-items:center}.rotation-button-container div{display:flex;justify-content:space-between;margin-bottom:5px}.rotation-button-container div p{margin:0;padding:0}.rotation-button-container div button{margin:0 0 0 10px;cursor:pointer;color:#5b6875;background:#fff;border:2px solid #5b6875;border-radius:50%;box-sizing:border-box;padding:0;height:22px;width:22px;font-size:18px;text-align:center}.rotation-button-container div button:hover{background:#dda73f;color:#fff}.rotation-button-container div .button-as-link{color:#dda73f;border:none;width:100%;height:100%;font-size:14px;position:relative;top:-15px}.rotation-button-container div .button-as-link ::ng-deep mat-icon{width:25px;height:25px;position:relative;top:8px}.rotation-button-container div .button-as-link ::ng-deep mat-icon svg path{fill:#dda73f}.rotation-button-container div .button-as-link:hover{background:none;color:#dda73f}.error-container{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid #f5c6cb;border-radius:.25rem;color:#721c24;background-color:#f8d7da;max-width:190px}.exportButton,.exportButtonDark{display:inline-block!important;margin-right:10px}.exportButtonDark{background:#5b6875;border-color:#5b6875}.exportButtonDark:hover{background:#5b6875;color:#fff}:host ::ng-deep .mat-form-field-wrapper{padding-bottom:0;border:1px solid #5b6875;border-radius:4px}:host ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-infix{padding:0;border:none}:host ::ng-deep .mat-select-value{padding-left:5px}:host ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{height:0}:host ::ng-deep .mat-select-trigger{line-height:36px}:host ::ng-deep mat-icon{width:18px;height:18px}:host ::ng-deep mat-icon svg path{fill:#5b6875}:host ::ng-deep .mat-slide-toggle-content{width:calc(100% - 36px);min-width:300px}\n"], components: [{ type: i10$1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "required", "checked", "aria-describedby"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
42122
42259
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ModelPreviewComponent, decorators: [{
42123
42260
  type: Component,
42124
42261
  args: [{
42125
42262
  selector: 'rp-model-preview',
42126
42263
  template: `
42127
42264
  <div class="model-preview">
42128
- <div class="model-preview-container" id="canvasContainer">
42265
+ <div class="model-preview-window">
42266
+ <div class="model-preview-container" id="canvasContainer"></div>
42267
+ <div class="model-preview-window-bottom">
42268
+ <div>
42269
+ <mat-slide-toggle
42270
+ [checked]="showReferenceModel"
42271
+ [labelPosition]="'after'"
42272
+ (change)="toggleShowReferenceModel($event)">
42273
+ Show Reference model
42274
+ </mat-slide-toggle>
42275
+ </div>
42276
+ <div class="disclaimer-text-container">
42277
+ <p class="disclaimer-text">
42278
+ Grid scale: 1 tile = 1x1 meter
42279
+ </p>
42280
+ </div>
42281
+ </div>
42129
42282
  </div>
42130
42283
  <div class="model-preview-actions">
42131
42284
  <div class="input-height-container">
42132
- <p>Centimeters of inches</p>
42133
- <div class="mat-radio-wrapper">
42134
- <mat-radio-group aria-label="Select an unit" (change)="setUnit($event)">
42135
- <mat-radio-button [checked]="true" value="cm">Height in cm</mat-radio-button>
42136
- <mat-radio-button value="inches">Height in inches</mat-radio-button>
42137
- </mat-radio-group>
42138
- </div>
42285
+ <h2>Model settings</h2>
42139
42286
  <div>
42140
- <input type="text" id="heightArticle" #heightArticle>
42141
- <button (click)="scaleArticle()">scale</button>
42287
+ <h3>Scale:</h3>
42288
+ <input type="text" id="heightArticle" #heightArticle placeholder="Set model height">
42289
+ <mat-form-field class="units-select-form">
42290
+ <mat-select class="units-mat-select" [(value)]="unitsOfMeasurement">
42291
+ <mat-option class="units-mat-option" *ngFor="let unit of units" [value]="unit">{{ unit }}</mat-option>
42292
+ </mat-select>
42293
+ </mat-form-field>
42294
+ <button class="apply-button base-button" (click)="scaleArticle()">Apply</button>
42142
42295
  </div>
42143
42296
  </div>
42144
-
42145
- <div>
42146
- <button (click)="toggleShowReferenceModel()">Show Reference model</button>
42147
- </div>
42148
-
42149
42297
  <div class="rotation-button-container">
42150
- <p>Rotation</p>
42151
- <div class="rotation-x-buttons">
42152
- <button (click)="rotateModel('x', mathPi / 2)">x-as + 90 graden</button>
42153
- <button (click)="rotateModel('x', -mathPi / 2)">x-as - 90 graden</button>
42298
+ <h3>Rotation:</h3>
42299
+ <div>
42300
+ <p>Rotate on X axis (90 degrees)</p>
42301
+ <p>
42302
+ <button (click)="rotateModel('x', -mathPi / 2)">
42303
+ <mat-icon svgIcon="dash-button"></mat-icon>
42304
+ </button>
42305
+ <button (click)="rotateModel('x', mathPi / 2)">
42306
+ <mat-icon svgIcon="add-button"></mat-icon>
42307
+ </button>
42308
+ </p>
42154
42309
  </div>
42155
- <div class="rotation-y-buttons">
42156
- <button (click)="rotateModel('y', mathPi / 2)">y-as + 90 graden</button>
42157
- <button (click)="rotateModel('y', -mathPi / 2)">y-as - 90 graden</button>
42310
+ <div>
42311
+ <p>Rotate on Y axis (90 degrees)</p>
42312
+ <p>
42313
+ <button (click)="rotateModel('y', -mathPi / 2)">
42314
+ <mat-icon svgIcon="dash-button"></mat-icon>
42315
+ </button>
42316
+ <button (click)="rotateModel('y', mathPi / 2)">
42317
+ <mat-icon svgIcon="add-button"></mat-icon>
42318
+ </button>
42319
+ </p>
42158
42320
  </div>
42159
- <div class="rotation-z-buttons">
42160
- <button (click)="rotateModel('z', mathPi / 2)">z-as + 90 graden</button>
42161
- <button (click)="rotateModel('z', -mathPi / 2)">z-as - 90 graden</button>
42321
+ <div>
42322
+ <p>Rotate on Z axis (90 degrees)</p>
42323
+ <p>
42324
+ <button (click)="rotateModel('z', -mathPi / 2)">
42325
+ <mat-icon svgIcon="dash-button"></mat-icon>
42326
+ </button>
42327
+ <button (click)="rotateModel('z', mathPi / 2)">
42328
+ <mat-icon svgIcon="add-button"></mat-icon>
42329
+ </button>
42330
+ </p>
42162
42331
  </div>
42163
42332
  </div>
42164
-
42165
-
42166
42333
  <div class="rotation-button-container">
42167
- <p>Positie</p>
42168
- <div class="rotation-x-buttons">
42169
- <button (click)="moveModel('x', 0.01)">x-as + 0.01</button>
42170
- <button (click)="moveModel('x', -0.01)">x-as -0.01</button>
42171
- </div>
42172
- <div class="rotation-y-buttons">
42173
- <button (click)="moveModel('y', 0.01)">y-as + 0.01</button>
42174
- <button (click)="moveModel('y', -0.01)">y-as - 0.01</button>
42334
+ <h3>Position:</h3>
42335
+ <div>
42336
+ <p>Reset to coordinates 0,0,0</p>
42337
+ <p>
42338
+ <button class="button-as-link" (click)="moveModel('all', 0)">
42339
+ <mat-icon svgIcon="retry-button"></mat-icon>
42340
+ Reset
42341
+ </button>
42342
+ </p>
42175
42343
  </div>
42176
- <div class="rotation-z-buttons">
42177
- <button (click)="moveModel('z', 0.01)">z-as + 0.01</button>
42178
- <button (click)="moveModel('z', -0.01)">z-as -0.01</button>
42344
+ <div>
42345
+ <p>Move on the Y axis (0.01 unit)</p>
42346
+ <p>
42347
+ <button (click)="moveModel('y', -0.01)">
42348
+ <mat-icon svgIcon="dash-button"></mat-icon>
42349
+ </button>
42350
+ <button (click)="moveModel('y', 0.01)">
42351
+ <mat-icon svgIcon="add-button"></mat-icon>
42352
+ </button>
42353
+ </p>
42179
42354
  </div>
42180
42355
  </div>
42181
42356
 
42182
- <div class="model-preview-info" *ngIf="this.data">
42183
- <div class="model-preview-info-container">
42184
- <div class="model-preview-info-left">
42185
- <label>Name</label>
42186
- </div>
42187
- <div class="model-preview-info-right">
42188
- <input type="text" id="fileName" #fileName value="{{ this.data.file.file.name }}">
42189
- </div>
42357
+ <div class="model-preview-info-container">
42358
+ <h3>Properties:</h3>
42359
+ <div>
42360
+ <mat-slide-toggle
42361
+ [checked]="false"
42362
+ [labelPosition]="'before'"
42363
+ (change)="setStackable($event)">
42364
+ Stackable
42365
+ </mat-slide-toggle>
42190
42366
  </div>
42191
-
42192
- <div class="model-preview-info-container">
42193
- <div class="model-preview-info-left">
42194
- <label>Stackable</label>
42195
- </div>
42196
- <div class="model-preview-info-right">
42197
- <div class="mat-radio-wrapper">
42198
- <mat-radio-group aria-label="Select an unit" (change)="setStackable($event)">
42199
- <mat-radio-button [checked]="true" value="false">No</mat-radio-button>
42200
- <mat-radio-button value="true">Yes</mat-radio-button>
42201
- </mat-radio-group>
42202
- </div>
42203
- </div>
42367
+ <div>
42368
+ <mat-slide-toggle
42369
+ [checked]="false"
42370
+ [labelPosition]="'before'"
42371
+ (change)="setHeightAdjustable($event)">
42372
+ Height adjustable
42373
+ </mat-slide-toggle>
42204
42374
  </div>
42205
42375
 
42206
- <div class="model-preview-info-container">
42207
- <div class="model-preview-info-left">
42208
- <label>Height adjustable</label>
42209
- </div>
42210
- <div class="model-preview-info-right">
42211
- <div class="mat-radio-wrapper">
42212
- <mat-radio-group aria-label="Select an unit" (change)="setHeightAdjustable($event)">
42213
- <mat-radio-button [checked]="true" value="false">No</mat-radio-button>
42214
- <mat-radio-button value="true">Yes</mat-radio-button>
42215
- </mat-radio-group>
42216
- </div>
42376
+ <div class="model-placement-container">
42377
+ <div>
42378
+ <label>Placement</label>
42379
+
42380
+ <mat-form-field *ngIf="placementOptions">
42381
+ <mat-select [(value)]="selectedPlacement">
42382
+ <mat-option *ngFor="let placementOption of placementOptions"
42383
+ [value]="placementOption.code">{{ placementOption.description }}
42384
+ </mat-option>
42385
+ </mat-select>
42386
+ </mat-form-field>
42217
42387
  </div>
42218
42388
  </div>
42389
+ </div>
42219
42390
 
42391
+ <div class="model-preview-info" *ngIf="this.data">
42220
42392
  <div class="model-preview-info-container">
42221
42393
  <div class="model-preview-info-left">
42222
- <label>Extension</label>
42394
+ <label>Save as:</label>
42223
42395
  </div>
42224
42396
  <div class="model-preview-info-right">
42225
- <label>{{ this.data.file.fileType }}</label>
42397
+ <input type="text" id="fileName" #fileName value="{{ this.data.file.file.name }}">
42226
42398
  </div>
42227
42399
  </div>
42228
- <button class="exportButton" (click)="exportSceneAsGLB('upload')">Upload to CDN and add to scene</button>
42229
- <p></p>
42230
- <button class="exportButton" (click)="exportSceneAsGLB('download')">Download model</button>
42400
+ <div>
42401
+ <button class="base-button exportButton" (click)="exportSceneAsGLB('upload')">Upload and add to scene</button>
42402
+ <button class="base-button exportButtonDark" (click)="exportSceneAsGLB('download')">Download</button>
42403
+ </div>
42231
42404
  </div>
42232
42405
  </div>
42233
42406
  </div>
@@ -42237,7 +42410,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
42237
42410
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
42238
42411
  type: Inject,
42239
42412
  args: [MAT_DIALOG_DATA]
42240
- }] }, { type: HomedecoratorSettingsService }, { type: i1$1.MatDialogRef }, { type: ThirdPartyModelService }, { type: MessageBusService }, { type: i1$1.MatDialog }, { type: HomedecoratorConnectorAdapterService }, { type: LightPresetsService }, { type: HomedecoratorDictionaryService }, { type: FontService }]; }, propDecorators: { glbExportName: [{
42413
+ }] }, { type: HomedecoratorSettingsService }, { type: HomedecoratorIconCacheService }, { type: i1$1.MatDialogRef }, { type: ThirdPartyModelService }, { type: MessageBusService }, { type: i1$1.MatDialog }, { type: HomedecoratorConnectorAdapterService }, { type: LightPresetsService }, { type: HomedecoratorDictionaryService }, { type: FontService }]; }, propDecorators: { glbExportName: [{
42241
42414
  type: ViewChild,
42242
42415
  args: ['fileName']
42243
42416
  }], heightArticle: [{
@@ -42309,7 +42482,7 @@ class ToolbarComponent {
42309
42482
  this._subs = [];
42310
42483
  this._subs.push(this.messageService.subscribe(MessageType.SetLeftSidebar, (templateRef) => this._setLeftSidebar(templateRef)), this.messageService.subscribe(MessageType.HideLeftSidebar, () => this._closeLeftSidebar({ keepTemplateRef: true })), this.messageService.subscribe(MessageType.RegisterToolbarIcon, (icon) => this._registerToolbarIcon(icon)), this.messageService.subscribe(MessageType.ViewModeChanged, () => this._closeLeftSidebar()), this.messageService.subscribe(MessageType.NewRoom, () => this.newRoom()), this.messageService.subscribe(MessageType.ShowOpenDialog, () => this.openOpenDialog()), this.messageService.subscribe(MessageType.FinishedIOneFurnitureBuild, () => this._hideToast()), this.messageService.subscribe(MessageType.UndefinedErrorOccured, () => this._hideToast()), this.messageService.subscribe(MessageType.RenderServiceTryToConnect, () => this._hideToast()), this.messageService.subscribe(MessageType.RenderServiceConnected, () => this._hideToast()), this._toastService.showToastSub.subscribe((toast) => this._showToast(toast)), this._screenSizeService.screenSizeChanged.subscribe(info => this.phoneSizeScreen = info.isPhoneSize),
42311
42484
  // this.messageService.subscribe(MessageType.StartWithDiagram, () => this.openUploadDiagram()),
42312
- this.messageService.subscribe(MessageType.StartDrawingDiagram, (file) => this.openDrawDiagram(file)), this.messageService.subscribe(MessageType.StartCroppingPDF, (file) => this.openCroppingDiagram(file)), this.messageService.subscribe(MessageType.UserModelUploaded, (file) => this.openModelPreview(file)));
42485
+ this.messageService.subscribe(MessageType.StartDrawingDiagram, (file) => this.openDrawDiagram(file)), this.messageService.subscribe(MessageType.StartCroppingPDF, (file) => this.openCroppingDiagram(file)), this.messageService.subscribe(MessageType.UserModelUploaded, (file) => this.openModelPreview(file)), this.messageService.subscribe(MessageType.RenderError, (data) => this.showRenderError(data)));
42313
42486
  }
42314
42487
  handleKeyDown(event) {
42315
42488
  if (event.ctrlKey && event.shiftKey && event.key === 'S') {
@@ -42507,6 +42680,12 @@ class ToolbarComponent {
42507
42680
  data: { file: file }
42508
42681
  });
42509
42682
  }
42683
+ showRenderError(data) {
42684
+ this._dialog.open(ErrorDialogComponent, {
42685
+ data: data
42686
+ });
42687
+ this.messageService.emit(MessageType.HideLoadingIndicator);
42688
+ }
42510
42689
  testRender() {
42511
42690
  this._newRenderService.forceRenderImage();
42512
42691
  }
@@ -42599,9 +42778,9 @@ ToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", versi
42599
42778
  </ng-container>
42600
42779
  <div class="hd-toolbar-spacer"></div>
42601
42780
 
42602
- <!-- <ng-container>-->
42603
- <!-- <rp-pdf-export></rp-pdf-export>-->
42604
- <!-- </ng-container>-->
42781
+ <!-- <ng-container>-->
42782
+ <!-- <rp-pdf-export></rp-pdf-export>-->
42783
+ <!-- </ng-container>-->
42605
42784
 
42606
42785
  <mat-nav-list class="toolbar__nav" role="list">
42607
42786
  <div matTooltip="{{'NEW_ROOM' | localize}}">
@@ -42755,9 +42934,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
42755
42934
  </ng-container>
42756
42935
  <div class="hd-toolbar-spacer"></div>
42757
42936
 
42758
- <!-- <ng-container>-->
42759
- <!-- <rp-pdf-export></rp-pdf-export>-->
42760
- <!-- </ng-container>-->
42937
+ <!-- <ng-container>-->
42938
+ <!-- <rp-pdf-export></rp-pdf-export>-->
42939
+ <!-- </ng-container>-->
42761
42940
 
42762
42941
  <mat-nav-list class="toolbar__nav" role="list">
42763
42942
  <div matTooltip="{{'NEW_ROOM' | localize}}">
@@ -42958,7 +43137,7 @@ ProductOwnCollectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "1
42958
43137
  (onArticleClick)="handleArticleClick($event)"
42959
43138
  (onArButtonClick)="handleArButtonClick($event)"
42960
43139
  ></co-catalog-search>
42961
- `, isInline: true, styles: [":host{display:block;overflow:auto}\n"], components: [{ type: i7$3.ɵbf, selector: "co-catalog-search", inputs: ["createFrozenArticle", "showNavigation", "showLandingPage", "showFilter", "showViewModes", "settings", "title", "subTitle", "searchPlaceholder"], outputs: ["settingsChange", "onLookAtArticleButtonClick", "onArButtonClick", "onAddArticleButtonClick", "onArticleClick", "onStockDetailsClick", "onExternalSourceClick"] }], pipes: { "localize": LocalizePipe } });
43140
+ `, isInline: true, styles: [":host{display:block;overflow:auto}\n"], components: [{ type: i7$2.ɵbf, selector: "co-catalog-search", inputs: ["createFrozenArticle", "showNavigation", "showLandingPage", "showFilter", "showViewModes", "settings", "title", "subTitle", "searchPlaceholder"], outputs: ["settingsChange", "onLookAtArticleButtonClick", "onArButtonClick", "onAddArticleButtonClick", "onArticleClick", "onStockDetailsClick", "onExternalSourceClick"] }], pipes: { "localize": LocalizePipe } });
42962
43141
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ProductOwnCollectionComponent, decorators: [{
42963
43142
  type: Component,
42964
43143
  args: [{
@@ -43391,7 +43570,7 @@ class ProductCatalogComponent {
43391
43570
  });
43392
43571
  }
43393
43572
  }
43394
- ProductCatalogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ProductCatalogComponent, deps: [{ token: HomedecoratorSettingsService }, { token: MessageBusService }, { token: HomedecoratorConnectorService }, { token: ScreenSizeAnalysisService }, { token: SceneService }, { token: FloorplanService }, { token: i0.Injector }, { token: i7$3.CatalogService }, { token: DynamicScriptService }, { token: HomedecoratorConnectorAdapterService }, { token: BuildFurnitureService }, { token: ThirdPartyModelService }], target: i0.ɵɵFactoryTarget.Component });
43573
+ ProductCatalogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ProductCatalogComponent, deps: [{ token: HomedecoratorSettingsService }, { token: MessageBusService }, { token: HomedecoratorConnectorService }, { token: ScreenSizeAnalysisService }, { token: SceneService }, { token: FloorplanService }, { token: i0.Injector }, { token: i7$2.CatalogService }, { token: DynamicScriptService }, { token: HomedecoratorConnectorAdapterService }, { token: BuildFurnitureService }, { token: ThirdPartyModelService }], target: i0.ɵɵFactoryTarget.Component });
43395
43574
  ProductCatalogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ProductCatalogComponent, selector: "rp-product-catalog", host: { properties: { "class.shown": "this.shown", "class.no-offset": "this.phoneSizeScreen" } }, ngImport: i0, template: `
43396
43575
  <div class="product-catalog-wrapper">
43397
43576
  <div class="catalog-button-wrapper" *ngIf="showOwnCollection || showExternalCatalog">
@@ -43452,7 +43631,7 @@ ProductCatalogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0"
43452
43631
  <mat-icon class="homedecorator-material-icons" aria-hidden="true">close</mat-icon>
43453
43632
  </button>
43454
43633
  </div>
43455
- `, isInline: true, styles: [":host{display:none;z-index:99;overflow:hidden}:host .layer{pointer-events:all!important;overflow-y:hidden;display:flex;flex-direction:column}:host .product-catalog-wrapper{display:flex;flex-direction:column;height:100%;padding:30px}:host .product-catalog-wrapper .catalog-button-wrapper{font-size:16px;margin-bottom:20px}:host .product-catalog-wrapper .co-catalog-external-source{display:flex;flex-basis:100%}:host .own-collection-button-wrapper{cursor:pointer}:host .own-collection-button-wrapper .own-collection-description{font-size:12px;font-weight:bold;text-shadow:none;text-transform:capitalize;margin:10px 0}:host .own-collection-button-wrapper .co-image{padding:25px;background:#3760a1;border-radius:10px}:host.shown{display:inline-block;position:relative;top:64px;left:64px;width:calc(100% - 64px);height:calc(100vh - 64px);background-color:#fff}:host.no-offset{left:0;width:100%;z-index:100}:host .ione-catalog{display:block;overflow:hidden}:host .ione-catalog ::ng-deep app-catalog{overflow:hidden}:host .catalog-button-wrapper .back-button,:host .catalog-button-wrapper .refresh-button{cursor:pointer;display:inline-block;font-weight:bold}:host .catalog-button-wrapper .back-button .refresh-button-span,:host .catalog-button-wrapper .back-button .back-button-span,:host .catalog-button-wrapper .refresh-button .refresh-button-span,:host .catalog-button-wrapper .refresh-button .back-button-span{vertical-align:top;line-height:25px;margin:10px 5px 0}:host .catalog-button-wrapper .button-spacer{display:inline-block;margin:0 10px}:host .product-catalog-wrapper{overflow:auto}:host .hide-catalog{position:absolute;top:6px;right:0px;z-index:100}.co-catalog-external-sources .external-source-item .co-image img{object-fit:cover}::ng-deep .co-catalog-navigation{position:relative}::ng-deep .co-catalog-navigation .navigation-overlay-wrapper{position:absolute!important;left:-40px!important;padding:20px 40px;grid-column-gap:60px}\n"], components: [{ type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: ProductOwnCollectionComponent, selector: "rp-product-own-collection", inputs: ["settings"], outputs: ["articleClick", "arButtonClick"] }, { type: ModelUploaderComponent, selector: "rp-model-uploader" }, { type: i4$1.ImageComponent, selector: "co-image", inputs: ["source", "placeHolder"] }, { type: i7$3.ɵt, selector: "co-catalog-external-sources", outputs: ["externalSourceClick"] }, { type: i7$3.ɵbg, selector: "co-catalog-external-source", inputs: ["showFilter", "showNavigation", "externalCatalogStartupInfo", "catalogDefinition", "user", "title", "subTitle", "searchPlaceholder", "options", "name"], outputs: ["articleClick", "addArticleClick", "iFrameFeedbackReceived"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "localize": LocalizePipe, "append": AppendPipe } });
43634
+ `, isInline: true, styles: [":host{display:none;z-index:99;overflow:hidden}:host .layer{pointer-events:all!important;overflow-y:hidden;display:flex;flex-direction:column}:host .product-catalog-wrapper{display:flex;flex-direction:column;height:100%;padding:30px}:host .product-catalog-wrapper .catalog-button-wrapper{font-size:16px;margin-bottom:20px}:host .product-catalog-wrapper .co-catalog-external-source{display:flex;flex-basis:100%}:host .own-collection-button-wrapper{cursor:pointer}:host .own-collection-button-wrapper .own-collection-description{font-size:12px;font-weight:bold;text-shadow:none;text-transform:capitalize;margin:10px 0}:host .own-collection-button-wrapper .co-image{padding:25px;background:#3760a1;border-radius:10px}:host.shown{display:inline-block;position:relative;top:64px;left:64px;width:calc(100% - 64px);height:calc(100vh - 64px);background-color:#fff}:host.no-offset{left:0;width:100%;z-index:100}:host .ione-catalog{display:block;overflow:hidden}:host .ione-catalog ::ng-deep app-catalog{overflow:hidden}:host .catalog-button-wrapper .back-button,:host .catalog-button-wrapper .refresh-button{cursor:pointer;display:inline-block;font-weight:bold}:host .catalog-button-wrapper .back-button .refresh-button-span,:host .catalog-button-wrapper .back-button .back-button-span,:host .catalog-button-wrapper .refresh-button .refresh-button-span,:host .catalog-button-wrapper .refresh-button .back-button-span{vertical-align:top;line-height:25px;margin:10px 5px 0}:host .catalog-button-wrapper .button-spacer{display:inline-block;margin:0 10px}:host .product-catalog-wrapper{overflow:auto}:host .hide-catalog{position:absolute;top:6px;right:0px;z-index:100}.co-catalog-external-sources .external-source-item .co-image img{object-fit:cover}::ng-deep .co-catalog-navigation{position:relative}::ng-deep .co-catalog-navigation .navigation-overlay-wrapper{position:absolute!important;left:-40px!important;padding:20px 40px;grid-column-gap:60px}\n"], components: [{ type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: ProductOwnCollectionComponent, selector: "rp-product-own-collection", inputs: ["settings"], outputs: ["articleClick", "arButtonClick"] }, { type: ModelUploaderComponent, selector: "rp-model-uploader" }, { type: i4$1.ImageComponent, selector: "co-image", inputs: ["source", "placeHolder"] }, { type: i7$2.ɵt, selector: "co-catalog-external-sources", outputs: ["externalSourceClick"] }, { type: i7$2.ɵbg, selector: "co-catalog-external-source", inputs: ["showFilter", "showNavigation", "externalCatalogStartupInfo", "catalogDefinition", "user", "title", "subTitle", "searchPlaceholder", "options", "name"], outputs: ["articleClick", "addArticleClick", "iFrameFeedbackReceived"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "localize": LocalizePipe, "append": AppendPipe } });
43456
43635
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ProductCatalogComponent, decorators: [{
43457
43636
  type: Component,
43458
43637
  args: [{
@@ -43520,7 +43699,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
43520
43699
  `,
43521
43700
  styleUrls: ['./product-catalog.component.scss']
43522
43701
  }]
43523
- }], ctorParameters: function () { return [{ type: HomedecoratorSettingsService }, { type: MessageBusService }, { type: HomedecoratorConnectorService }, { type: ScreenSizeAnalysisService }, { type: SceneService }, { type: FloorplanService }, { type: i0.Injector }, { type: i7$3.CatalogService }, { type: DynamicScriptService }, { type: HomedecoratorConnectorAdapterService }, { type: BuildFurnitureService }, { type: ThirdPartyModelService }]; }, propDecorators: { shown: [{
43702
+ }], ctorParameters: function () { return [{ type: HomedecoratorSettingsService }, { type: MessageBusService }, { type: HomedecoratorConnectorService }, { type: ScreenSizeAnalysisService }, { type: SceneService }, { type: FloorplanService }, { type: i0.Injector }, { type: i7$2.CatalogService }, { type: DynamicScriptService }, { type: HomedecoratorConnectorAdapterService }, { type: BuildFurnitureService }, { type: ThirdPartyModelService }]; }, propDecorators: { shown: [{
43524
43703
  type: HostBinding,
43525
43704
  args: ['class.shown']
43526
43705
  }], phoneSizeScreen: [{
@@ -43692,7 +43871,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
43692
43871
  });
43693
43872
  };
43694
43873
  class HomedecoratorComponent {
43695
- constructor(controllerService, appState, presetsService, screenAnalysis, _componentFactoryResolver, _iconRegistry, _domSanitizer, _messageService, _homedecoratorService) {
43874
+ constructor(controllerService, appState, presetsService, screenAnalysis, _componentFactoryResolver, _iconRegistry, _domSanitizer, _messageService, _homedecoratorService, _eventService) {
43696
43875
  this.controllerService = controllerService;
43697
43876
  this.appState = appState;
43698
43877
  this.presetsService = presetsService;
@@ -43702,6 +43881,7 @@ class HomedecoratorComponent {
43702
43881
  this._domSanitizer = _domSanitizer;
43703
43882
  this._messageService = _messageService;
43704
43883
  this._homedecoratorService = _homedecoratorService;
43884
+ this._eventService = _eventService;
43705
43885
  this.showClass = true;
43706
43886
  this.loaded = false;
43707
43887
  this.title = 'MyRoomPlans';
@@ -43833,7 +44013,10 @@ class HomedecoratorComponent {
43833
44013
  'hand-pointer',
43834
44014
  'check',
43835
44015
  'move-phone-ar',
43836
- 'cart-shopping-regular'
44016
+ 'cart-shopping-regular',
44017
+ 'pen-ruler',
44018
+ 'dash-button',
44019
+ 'retry-button'
43837
44020
  ].map(addIcon);
43838
44021
  }
43839
44022
  keyup(event) {
@@ -43857,6 +44040,7 @@ class HomedecoratorComponent {
43857
44040
  });
43858
44041
  }
43859
44042
  _startWithEmptyRoom(switchTo2D) {
44043
+ this._eventService.dirty.next(true);
43860
44044
  const preset = Preset.CreateModelFromInterface({ filename: 'assets/presets/empty.json' });
43861
44045
  this._startWithPreset(preset, switchTo2D);
43862
44046
  }
@@ -43871,7 +44055,7 @@ class HomedecoratorComponent {
43871
44055
  this._messageService.emit(MessageType.LoadRoomFromPreset, preset);
43872
44056
  }
43873
44057
  }
43874
- HomedecoratorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: HomedecoratorComponent, deps: [{ token: HomedecoratorConnectorService }, { token: AppStateService }, { token: PresetsService }, { token: ScreenSizeAnalysisService }, { token: i0.ComponentFactoryResolver }, { token: i5$1.MatIconRegistry }, { token: i1.DomSanitizer }, { token: MessageBusService }, { token: HomedecoratorService }], target: i0.ɵɵFactoryTarget.Component });
44058
+ HomedecoratorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: HomedecoratorComponent, deps: [{ token: HomedecoratorConnectorService }, { token: AppStateService }, { token: PresetsService }, { token: ScreenSizeAnalysisService }, { token: i0.ComponentFactoryResolver }, { token: i5$1.MatIconRegistry }, { token: i1.DomSanitizer }, { token: MessageBusService }, { token: HomedecoratorService }, { token: HomedecoratorAppEventService }], target: i0.ɵɵFactoryTarget.Component });
43875
44059
  HomedecoratorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: HomedecoratorComponent, selector: "co-homedecorator", inputs: { settings: "settings" }, host: { listeners: { "document:keyup": "keyup($event)" }, properties: { "class.co-homedecorator": "this.showClass" } }, ngImport: i0, template: `
43876
44060
  <div class="viewport" *ngIf="loaded">
43877
44061
  <progress-bar></progress-bar>
@@ -43932,7 +44116,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
43932
44116
  `,
43933
44117
  encapsulation: ViewEncapsulation.None
43934
44118
  }]
43935
- }], ctorParameters: function () { return [{ type: HomedecoratorConnectorService }, { type: AppStateService }, { type: PresetsService }, { type: ScreenSizeAnalysisService }, { type: i0.ComponentFactoryResolver }, { type: i5$1.MatIconRegistry }, { type: i1.DomSanitizer }, { type: MessageBusService }, { type: HomedecoratorService }]; }, propDecorators: { settings: [{
44119
+ }], ctorParameters: function () { return [{ type: HomedecoratorConnectorService }, { type: AppStateService }, { type: PresetsService }, { type: ScreenSizeAnalysisService }, { type: i0.ComponentFactoryResolver }, { type: i5$1.MatIconRegistry }, { type: i1.DomSanitizer }, { type: MessageBusService }, { type: HomedecoratorService }, { type: HomedecoratorAppEventService }]; }, propDecorators: { settings: [{
43936
44120
  type: Input
43937
44121
  }], showClass: [{
43938
44122
  type: HostBinding,
@@ -44785,7 +44969,7 @@ class EditApplyComponent {
44785
44969
  }
44786
44970
  }
44787
44971
  EditApplyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: EditApplyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
44788
- EditApplyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: EditApplyComponent, selector: "rp-edit-apply", inputs: { watched: "watched", disable: "disable" }, outputs: { cancel: "cancel", apply: "apply", toggleChange: "toggleChange" }, ngImport: i0, template: "<mat-button-toggle\r\n *ngIf=\"!checked\"\r\n (change)=\"toggle($event)\">\r\n <mat-icon class=\"homedecorator-material-icons\">mode_edit</mat-icon>\r\n <span>{{'EDIT' | localize}}</span>\r\n</mat-button-toggle>\r\n<article *ngIf=\"checked\">\r\n <button mat-raised-button (click)=\"onCancel()\">\r\n <mat-icon class=\"homedecorator-material-icons\">clear</mat-icon>\r\n </button>\r\n <button mat-raised-button\r\n [disabled]=\"!watched || disable\"\r\n (click)=\"onApply()\"\r\n >\r\n <mat-icon class=\"homedecorator-material-icons\">done</mat-icon>\r\n </button>\r\n</article>\r\n", styles: [""], components: [{ type: i7$2.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-labelledby", "tabIndex", "appearance", "checked", "disabled", "id", "name", "aria-label", "value"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "localize": LocalizePipe } });
44972
+ EditApplyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: EditApplyComponent, selector: "rp-edit-apply", inputs: { watched: "watched", disable: "disable" }, outputs: { cancel: "cancel", apply: "apply", toggleChange: "toggleChange" }, ngImport: i0, template: "<mat-button-toggle\r\n *ngIf=\"!checked\"\r\n (change)=\"toggle($event)\">\r\n <mat-icon class=\"homedecorator-material-icons\">mode_edit</mat-icon>\r\n <span>{{'EDIT' | localize}}</span>\r\n</mat-button-toggle>\r\n<article *ngIf=\"checked\">\r\n <button mat-raised-button (click)=\"onCancel()\">\r\n <mat-icon class=\"homedecorator-material-icons\">clear</mat-icon>\r\n </button>\r\n <button mat-raised-button\r\n [disabled]=\"!watched || disable\"\r\n (click)=\"onApply()\"\r\n >\r\n <mat-icon class=\"homedecorator-material-icons\">done</mat-icon>\r\n </button>\r\n</article>\r\n", styles: [""], components: [{ type: i8$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-labelledby", "tabIndex", "appearance", "checked", "disabled", "id", "name", "aria-label", "value"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "localize": LocalizePipe } });
44789
44973
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: EditApplyComponent, decorators: [{
44790
44974
  type: Component,
44791
44975
  args: [{
@@ -46079,7 +46263,12 @@ ModelUploaderModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", ver
46079
46263
  ImageModule,
46080
46264
  CatalogExternalSourcesModule,
46081
46265
  CatalogExternalSourceModule,
46082
- MatRadioModule], exports: [ModelUploaderComponent] });
46266
+ MatRadioModule,
46267
+ MatSlideToggleModule,
46268
+ MatFormFieldModule,
46269
+ MatOptionModule,
46270
+ MatSelectModule,
46271
+ IconModule], exports: [ModelUploaderComponent] });
46083
46272
  ModelUploaderModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ModelUploaderModule, imports: [[
46084
46273
  CommonModule,
46085
46274
  CoreModule,
@@ -46090,6 +46279,11 @@ ModelUploaderModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", ver
46090
46279
  CatalogExternalSourcesModule,
46091
46280
  CatalogExternalSourceModule,
46092
46281
  MatRadioModule,
46282
+ MatSlideToggleModule,
46283
+ MatFormFieldModule,
46284
+ MatOptionModule,
46285
+ MatSelectModule,
46286
+ IconModule,
46093
46287
  ]] });
46094
46288
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ModelUploaderModule, decorators: [{
46095
46289
  type: NgModule,
@@ -46104,6 +46298,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
46104
46298
  CatalogExternalSourcesModule,
46105
46299
  CatalogExternalSourceModule,
46106
46300
  MatRadioModule,
46301
+ MatSlideToggleModule,
46302
+ MatFormFieldModule,
46303
+ MatOptionModule,
46304
+ MatSelectModule,
46305
+ IconModule,
46107
46306
  ],
46108
46307
  exports: [
46109
46308
  ModelUploaderComponent