@colijnit/configurator 262.1.1 → 262.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/colijnit-configurator-262.1.2.tgz +0 -0
  2. package/fesm2022/colijnit-configurator.mjs +995 -293
  3. package/fesm2022/colijnit-configurator.mjs.map +1 -1
  4. package/index.d.ts +144 -38
  5. package/lib/components/configuration-preset/style/_layout.scss +42 -0
  6. package/lib/components/configuration-preset/style/_material-definition.scss +5 -0
  7. package/lib/components/configuration-preset/style/_theme.scss +20 -0
  8. package/lib/components/configuration-preset/style/material.scss +3 -0
  9. package/lib/components/configuration-preset-dialog/style/_layout.scss +82 -0
  10. package/lib/components/configuration-preset-dialog/style/_material-definition.scss +5 -0
  11. package/lib/components/configuration-preset-dialog/style/_theme.scss +7 -0
  12. package/lib/components/configuration-preset-dialog/style/material.scss +3 -0
  13. package/lib/components/product-configurator/style/_layout.scss +4 -0
  14. package/lib/components/product-configurator/style/_material-definition.scss +1 -0
  15. package/lib/components/product-configurator/style/_theme.scss +7 -1
  16. package/lib/components/product-configurator-selector/style/_layout.scss +26 -1
  17. package/lib/components/product-configurator-selector/style/_theme.scss +20 -3
  18. package/lib/components/product-configurator-selector-option-checkbox/style/_theme.scss +3 -0
  19. package/lib/components/product-configurator-selector-option-tile/style/_layout.scss +12 -4
  20. package/lib/components/product-configurator-selector-option-tile/style/_theme.scss +28 -2
  21. package/lib/style/_variables.scss +20 -7
  22. package/package.json +1 -1
@@ -65,6 +65,8 @@ import { trigger, state, style, transition, animate } from '@angular/animations'
65
65
  import * as i4 from '@colijnit/corecomponents_v12';
66
66
  import { LoaderModule, IconModule, CardModule, InputTextModule, ButtonModule, PriceDisplayPipeModule, ImageModule, TooltipDirectiveModule } from '@colijnit/corecomponents_v12';
67
67
  import { ConfigurationDisplayOption } from '@colijnit/configuratorapi/build/enum/refcode/configuration-display-option.enum';
68
+ import * as i7 from '@angular/cdk/clipboard';
69
+ import { CdkCopyToClipboard } from '@angular/cdk/clipboard';
68
70
  import * as i6$1 from '@angular/forms';
69
71
  import { FormsModule } from '@angular/forms';
70
72
  import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';
@@ -148,6 +150,9 @@ class SettingOptions {
148
150
  useExternalOpenSave = false;
149
151
  floorFadeStart = 2.0;
150
152
  floorFadeEnd = 6.0;
153
+ maxVisibleTiles = 10;
154
+ maxVisibleSmallTiles = 24;
155
+ groupedShowAllBtn = false;
151
156
  }
152
157
 
153
158
  class RenderParameters {
@@ -196,6 +201,9 @@ class ConfiguratorSettings {
196
201
  jwtEnabled;
197
202
  gtm;
198
203
  dracoPath = 'https?://cdn1.colijn-it.nl/draco/';
204
+ mainUrl;
205
+ mainSchema;
206
+ mainVersion;
199
207
  options = new SettingOptions();
200
208
  catalogParameters;
201
209
  renderParameters = new RenderParameters();
@@ -509,6 +517,7 @@ class AppEventService {
509
517
  articleInfoReceived = new Subject(); // TODO check; _onAnswerInfoReceived has a todo from 17-06-2024
510
518
  onObjectSelected = new Subject();
511
519
  onObjectUnSelected = new Subject();
520
+ changeConfigurationPresetDialogMode = new Subject();
512
521
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: AppEventService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
513
522
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: AppEventService, providedIn: 'root' });
514
523
  }
@@ -823,12 +832,12 @@ class ConfiguratorService {
823
832
  this._mainApi = null;
824
833
  this._articleApi = null;
825
834
  }
826
- async initConnector(options, forceReload) {
835
+ async initConnector(options, forceReload, mainUrl, mainSchema, mainVersion) {
827
836
  let createdConnection = false;
828
837
  const renewConnector = (this._configuratorApi ? this._configuratorApi.url !== options.url : false) || forceReload;
829
838
  if (!this._configuratorApi || renewConnector) {
830
839
  this._configuratorApi = new Configurator(options);
831
- this.loginResponse = await this._configuratorApi.connect();
840
+ this.loginResponse = await this._configuratorApi.connect(mainUrl, mainSchema, mainVersion);
832
841
  this._configuratorApi.showLoader.subscribe(value => this.showLoader.next(value));
833
842
  this._configuratorApi.connectionResetInactivity.subscribe(value => this.connectionReset.next());
834
843
  }
@@ -951,14 +960,13 @@ class ConfiguratorService {
951
960
  return this._configuratorApi.copyInstance(instanceId, shouldSaveCurrentInstanceId, showLoader);
952
961
  }
953
962
  async saveConfigurations(showLoader = true) {
954
- try {
955
- await this._configuratorApi.saveConfigurations(showLoader).catch((e) => {
956
- return false;
957
- });
958
- }
959
- catch (e) {
960
- }
961
- return true;
963
+ return await this._configuratorApi.saveConfigurations(showLoader);
964
+ }
965
+ async storePreset(instanceId, showLoader = true) {
966
+ return await this._configuratorApi.storePreset(instanceId, showLoader);
967
+ }
968
+ async initForPreset(presetId, goodId, showLoader = true) {
969
+ return await this._configuratorApi.initForPreset(presetId, goodId, showLoader);
962
970
  }
963
971
  async googleTranslateEnabled() {
964
972
  // this should always be fetched from the mainapi from the client
@@ -1115,7 +1123,7 @@ class ConfiguratorConnectorService {
1115
1123
  this._imageCache.clear();
1116
1124
  this._subs.forEach(sub => sub.unsubscribe());
1117
1125
  }
1118
- async initConnection(forceReload, standAlone = false) {
1126
+ async initConnection(forceReload, mainUrl, mainSchema, mainVersion) {
1119
1127
  if ((this._initialized || this._initializing) && !forceReload) {
1120
1128
  return;
1121
1129
  }
@@ -1127,7 +1135,7 @@ class ConfiguratorConnectorService {
1127
1135
  }
1128
1136
  this._connectorOptions = Object.assign(new Options(), settings);
1129
1137
  this._subs.push(this._configuratorService.showLoader.subscribe(showLoader => this.onShowLoaderChange(showLoader)), this._configuratorService.connectionReset.subscribe(() => this.onConnectionReset()));
1130
- await this._configuratorService.initConnector(this._connectorOptions, forceReload);
1138
+ await this._configuratorService.initConnector(this._connectorOptions, forceReload, mainUrl, mainSchema, mainVersion);
1131
1139
  await this._settingsService.checkAdditionalParameters();
1132
1140
  this.controllerInitialized.next(true);
1133
1141
  this._initialized = true;
@@ -1399,6 +1407,12 @@ class ConfiguratorConnectorService {
1399
1407
  console.error('error saving configurations');
1400
1408
  }
1401
1409
  }
1410
+ async storePreset(instanceId, showLoader = true) {
1411
+ return this._configuratorService.storePreset(instanceId, showLoader);
1412
+ }
1413
+ async initForPreset(presetId, goodId, showLoader = true) {
1414
+ return this._configuratorService.initForPreset(presetId, goodId, showLoader);
1415
+ }
1402
1416
  async getDefaultLanguage(upId) {
1403
1417
  return await this._configuratorService.getDefaultLanguage(upId);
1404
1418
  }
@@ -1806,7 +1820,7 @@ class AppInitializerService {
1806
1820
  }
1807
1821
  async initializeApp(settings) {
1808
1822
  await this._settingsService.initializeSettings(settings);
1809
- await this._configuratorConnectorService.initConnection(true);
1823
+ await this._configuratorConnectorService.initConnection(true, settings.mainUrl, settings.mainSchema, settings.mainVersion);
1810
1824
  this.appInitialized.next(true);
1811
1825
  }
1812
1826
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: AppInitializerService, deps: [{ token: SettingsService }, { token: ConfiguratorConnectorService }], target: i0.ɵɵFactoryTarget.Injectable });
@@ -10181,11 +10195,6 @@ class LoadFurnitureService extends LoadFurnitureBaseService {
10181
10195
  if (!this.needs3DModel(result.placement)) {
10182
10196
  result.resultType = ResultType.No3DModel;
10183
10197
  }
10184
- if (!result.assetUrl && result.resultType !== ResultType.No3DModel || result.resultType === ResultType.ArticleNotFound) {
10185
- result.errorMessages.push(new ConfiguratorErrorMessage('ARTICLE_NOT_FOUND', 'ARTICLE_NOT_FOUND_DESC'));
10186
- DebugUtils.log('Article not found');
10187
- return Promise.reject(result);
10188
- }
10189
10198
  });
10190
10199
  if (this.article) {
10191
10200
  // Add the data to the result
@@ -12243,6 +12252,7 @@ var IconEnum;
12243
12252
  IconEnum["ArrowTurnRight"] = "arrow_turn_right";
12244
12253
  IconEnum["ArrowTurnRightRegular"] = "arrow_turn_right_regular";
12245
12254
  IconEnum["ArCircle"] = "ar_circle";
12255
+ IconEnum["BarsLightFull"] = "bars_light_full";
12246
12256
  IconEnum["Brush"] = "brush";
12247
12257
  IconEnum["CameraSolid"] = "camera_solid";
12248
12258
  IconEnum["CameraTopdown"] = "camera_topdown";
@@ -12267,6 +12277,7 @@ var IconEnum;
12267
12277
  IconEnum["ConfFrame"] = "conf_frame";
12268
12278
  IconEnum["ConfPlane"] = "conf_plane";
12269
12279
  IconEnum["CopyLight"] = "copy_light";
12280
+ IconEnum["CopyRegularFull"] = "copy_regular_full";
12270
12281
  IconEnum["Couch"] = "couch";
12271
12282
  IconEnum["Cross"] = "cross";
12272
12283
  IconEnum["CubeOutline"] = "cube-outline";
@@ -12279,7 +12290,9 @@ var IconEnum;
12279
12290
  IconEnum["EditButton"] = "edit-button";
12280
12291
  IconEnum["Expand"] = "expand";
12281
12292
  IconEnum["FillDripLight"] = "fill_drip_light";
12293
+ IconEnum["FloppyDiskLightFull"] = "floppy_disk_light_full";
12282
12294
  IconEnum["Flower"] = "flower";
12295
+ IconEnum["FolderOpenLightFull"] = "folder_open_light_full";
12283
12296
  IconEnum["GaugeHighSolidFull"] = "gauge_high_solid_full";
12284
12297
  IconEnum["GaugeLowSolidFull"] = "gauge_low_solid_full";
12285
12298
  IconEnum["GaugeMaxSolidFull"] = "gauge_max_solid_full";
@@ -12333,6 +12346,7 @@ var IconEnum;
12333
12346
  IconEnum["WandMagicSparkles"] = "wand_magic_sparkles";
12334
12347
  IconEnum["WifiSolidFull"] = "wifi_solid_full";
12335
12348
  IconEnum["XmarkLight"] = "xmark_light";
12349
+ IconEnum["XmarkLightFull"] = "xmark_light_full";
12336
12350
  IconEnum["XmarkRegular"] = "xmark_regular";
12337
12351
  })(IconEnum || (IconEnum = {}));
12338
12352
 
@@ -12355,6 +12369,7 @@ const IconSvg = {
12355
12369
  "arrow_turn_right": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M379.3 363.3c-6.2 6.2-16.4 6.2-22.6 0s-6.2-16.4 0-22.6L457.4 240 80 240c-26.5 0-48 21.5-48 48l0 176c0 8.8-7.2 16-16 16s-16-7.2-16-16L0 288c0-44.2 35.8-80 80-80l377.4 0L356.7 107.3c-6.2-6.2-6.2-16.4 0-22.6s16.4-6.2 22.6 0l128 128c6.2 6.2 6.2 16.4 0 22.6l-128 128z\"/></svg>",
12356
12370
  "arrow_turn_right_regular": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M377 369c-9.4 9.4-24.6 9.4-33.9 0s-9.4-24.6 0-33.9l87-87L88 248c-22.1 0-40 17.9-40 40l0 168c0 13.3-10.7 24-24 24s-24-10.7-24-24L0 288c0-48.6 39.4-88 88-88l342.1 0-87-87c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0L505 207c9.4 9.4 9.4 24.6 0 33.9L377 369z\"/></svg>",
12357
12371
  "ar_circle": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 50 50\"><path d=\"M25,11A14,14,0,1,1,11,25,14,14,0,0,1,25,11m0-1A15,15,0,1,0,40,25,15,15,0,0,0,25,10Z\" fill=\"#484f60\"/><path d=\"M23.23,30.1l-.85-2.2H18.53l-.85,2.2H15.5l4-10.2h2l4,10.2Zm-2.77-7.16-1.15,3h2.3Z\" fill=\"#484f60\"/><path d=\"M33.92,23.29c0,1.63-.58,2.69-1.74,3.16L34.5,30.1H32l-2-3.25H28.53V30.1H26.48V19.9H30a4.65,4.65,0,0,1,3,.8A3.29,3.29,0,0,1,33.92,23.29ZM31.45,24.5a1.64,1.64,0,0,0,.39-1.21,1.38,1.38,0,0,0-.4-1.13,2.35,2.35,0,0,0-1.38-.3H28.53v3H30A2,2,0,0,0,31.45,24.5Z\" fill=\"#484f60\"/></svg>",
12372
+ "bars_light_full": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M96 144C96 135.2 103.2 128 112 128L528 128C536.8 128 544 135.2 544 144C544 152.8 536.8 160 528 160L112 160C103.2 160 96 152.8 96 144zM96 320C96 311.2 103.2 304 112 304L528 304C536.8 304 544 311.2 544 320C544 328.8 536.8 336 528 336L112 336C103.2 336 96 328.8 96 320zM544 496C544 504.8 536.8 512 528 512L112 512C103.2 512 96 504.8 96 496C96 487.2 103.2 480 112 480L528 480C536.8 480 544 487.2 544 496z\"/></svg>",
12358
12373
  "brush": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 50 50\"><path d=\"M28.16,26a9.71,9.71,0,0,1-4-3.66A.88.88,0,0,0,22.92,22c-1.08.48-2.19.92-3.27,1.43-3.71,1.74-6,4.5-6.23,8.75-.17,2.75-.89,5.32-3.42,7.25,1.18,0,2.12,0,3.05,0,.73,0,1.46-.07,2.18-.12a10.82,10.82,0,0,0,4.86-3.38c1.31-1.61,3.14-3.58,3.95-5.49l-.08.38a22.78,22.78,0,0,1-3.09,5.74A11.79,11.79,0,0,1,18.13,39a22.35,22.35,0,0,0,4.29-1A8.2,8.2,0,0,0,28.06,32c.38-1.62.44-3.31.66-5A1,1,0,0,0,28.16,26Z\" fill=\"#484f60\"/><path d=\"M26.23,20.43l6.57-9.32a1.23,1.23,0,0,1,1.87-.18l4.94,4.7a1.24,1.24,0,0,1-.11,1.9l-9.15,6.78a1.25,1.25,0,0,1-1.58-.08L26.4,22.06A1.23,1.23,0,0,1,26.23,20.43Z\" fill=\"#484f60\"/></svg>",
12359
12374
  "camera_solid": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M149.1 64.8L138.7 96 64 96C28.7 96 0 124.7 0 160L0 416c0 35.3 28.7 64 64 64l384 0c35.3 0 64-28.7 64-64l0-256c0-35.3-28.7-64-64-64l-74.7 0L362.9 64.8C356.4 45.2 338.1 32 317.4 32L194.6 32c-20.7 0-39 13.2-45.5 32.8zM256 192a96 96 0 1 1 0 192 96 96 0 1 1 0-192z\"/></svg>",
12360
12375
  "camera_topdown": "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 600 600\" style=\"enable-background:new 0 0 600 600;\" ><g><path d=\"M198.4,473.9c-12.3,0-23.9-6.8-29.4-17.4c-2.4-4.6-3.7-9.8-3.7-15c0-6.7,2-13.1,5.9-18.6l57.5-82.1c3.7-5.2,9.7-8.4,16.1-8.4c4,0,7.9,1.2,11.2,3.5c8.8,6.2,11,18.4,4.8,27.3l-49.9,71.4h178.2l-50-71.4c-3.2-4.7-4.3-10.5-3-16c1.1-5,4-9.1,8.1-11.5c3.3-2.2,7.1-3.4,11-3.4c6.4,0,12.4,3.1,16.1,8.4l57.6,82.1c6.9,9.9,7.8,22.7,2.1,33.6c-5.6,10.8-16.7,17.4-28.7,17.4H198.4z M219.9,320.5c-32,0-58-26-58-58V58c0-32,26-58,58-58h160.2c32,0,58,26,58,58v204.6c0,32-26,58-58,58H219.9z M219.9,39.3c-10.3,0-18.7,8.4-18.7,18.7v204.6c0,10.3,8.4,18.7,18.7,18.7h160.2c10.3,0,18.7-8.4,18.7-18.7V58c0-10.3-8.4-18.7-18.7-18.7H219.9z\"/><path d=\"M300,600c-4,0-7.2-3.2-7.2-7.2v-85.3c0-4,3.2-7.2,7.2-7.2s7.2,3.2,7.2,7.2v85.3C307.2,596.8,304,600,300,600z\"/><path d=\"M179.7,591.6c-1.5,0-2.9-0.5-4.1-1.3c-1.6-1.1-2.6-2.8-3-4.6c-0.3-1.9,0.1-3.8,1.2-5.4l50.6-77c1.3-1.9,3.5-3,5.9-3c1.5,0,2.9,0.5,4.1,1.3c1.6,1.1,2.6,2.8,3,4.6c0.3,1.9-0.1,3.8-1.2,5.4l-50.6,77C184.2,590.5,182,591.6,179.7,591.6z\"/><path d=\"M420.3,591.6c-2.3,0-4.5-1.1-5.9-3l-50.6-77c-2.3-3.3-1.5-7.7,1.8-10c1.2-0.9,2.6-1.3,4.1-1.3c2.3,0,4.5,1.1,5.9,3l50.5,76.9l0,0.1c1.1,1.6,1.5,3.5,1.2,5.4c-0.3,1.9-1.4,3.5-3,4.6C423.2,591.2,421.8,591.6,420.3,591.6z\"/><path d=\"M375.9,65v38.7c0,1.5-1.2,2.8-2.8,2.8h-19.9c-1.5,0-2.8-1.2-2.8-2.8V65c0-1.5,1.2-2.8,2.8-2.8h19.9C374.6,62.2,375.9,63.5,375.9,65z\"/></g></svg>",
@@ -12379,6 +12394,7 @@ const IconSvg = {
12379
12394
  "conf_frame": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 50 50\"><title>conf_frame</title><path d=\"M37,11.5,38.5,10h-27V40L13,38.5v-27H37Z\" fill=\"#484f60\"/><g opacity=\"0.25\"><rect x=\"14.5\" y=\"13\" width=\"21\" height=\"24\" fill=\"#484f60\"/></g><polygon points=\"18.27 15.01 20.28 13 14.5 13 14.5 18.78 16.51 16.77 20.24 20.5 22 18.74 18.27 15.01\" fill=\"#484f60\"/></svg>",
12380
12395
  "conf_plane": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 50 50\"><title>conf_plane</title><g opacity=\"0.25\"><path d=\"M37,11.5,38.5,10h-27V40L13,38.5v-27H37Z\" fill=\"#484f60\"/></g><rect x=\"14.5\" y=\"13\" width=\"21\" height=\"24\" fill=\"#484f60\"/><polygon points=\"19.26 16 17.5 17.76 21.23 21.49 19.22 23.5 25 23.5 25 17.72 22.99 19.73 19.26 16\" fill=\"#fff\"/></svg>",
12381
12396
  "copy_light": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><path d=\"M384 352l-160 0c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l108.1 0c4.2 0 8.3 1.7 11.3 4.7l67.9 67.9c3 3 4.7 7.1 4.7 11.3L416 320c0 17.7-14.3 32-32 32zM433.9 81.9L366.1 14.1c-9-9-21.2-14.1-33.9-14.1L224 0c-35.3 0-64 28.7-64 64l0 256c0 35.3 28.7 64 64 64l160 0c35.3 0 64-28.7 64-64l0-204.1c0-12.7-5.1-24.9-14.1-33.9zM64 128c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l160 0c35.3 0 64-28.7 64-64l0-32-32 0 0 32c0 17.7-14.3 32-32 32L64 480c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l64 0 0-32-64 0z\"/></svg>",
12397
+ "copy_regular_full": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M480 400L288 400C279.2 400 272 392.8 272 384L272 128C272 119.2 279.2 112 288 112L421.5 112C425.7 112 429.8 113.7 432.8 116.7L491.3 175.2C494.3 178.2 496 182.3 496 186.5L496 384C496 392.8 488.8 400 480 400zM288 448L480 448C515.3 448 544 419.3 544 384L544 186.5C544 169.5 537.3 153.2 525.3 141.2L466.7 82.7C454.7 70.7 438.5 64 421.5 64L288 64C252.7 64 224 92.7 224 128L224 384C224 419.3 252.7 448 288 448zM160 192C124.7 192 96 220.7 96 256L96 512C96 547.3 124.7 576 160 576L352 576C387.3 576 416 547.3 416 512L416 496L368 496L368 512C368 520.8 360.8 528 352 528L160 528C151.2 528 144 520.8 144 512L144 256C144 247.2 151.2 240 160 240L176 240L176 192L160 192z\"/></svg>",
12382
12398
  "couch": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"><path d=\"M448 64c53 0 96 43 96 96l0 37.5c10-3.5 20.8-5.5 32-5.5l0-32c0-70.7-57.3-128-128-128L192 32C121.3 32 64 89.3 64 160l0 32c11.2 0 22 1.9 32 5.5L96 160c0-53 43-96 96-96l256 0zM96 320l0 96 0 16c0 8.8-7.2 16-16 16l-32 0c-8.8 0-16-7.2-16-16l0-144c0-17.7 14.3-32 32-32s32 14.3 32 32l0 32zM80 480c20.9 0 38.7-13.4 45.3-32l389.5 0c6.6 18.6 24.4 32 45.3 32l32 0c26.5 0 48-21.5 48-48l0-144c0-35.3-28.7-64-64-64s-64 28.7-64 64l-384 0c0-35.3-28.7-64-64-64s-64 28.7-64 64L0 432c0 26.5 21.5 48 48 48l32 0zm48-64l0-96 384 0 0 96-384 0zm416 16l0-16 0-96 0-32c0-17.7 14.3-32 32-32s32 14.3 32 32l0 144c0 8.8-7.2 16-16 16l-32 0c-8.8 0-16-7.2-16-16z\"/></svg>",
12383
12399
  "cross": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 50 50\"><polygon points=\"35.35 15.52 34.65 14.81 25 24.46 15.35 14.81 14.65 15.52 24.29 25.17 14.65 34.81 15.35 35.52 25 25.87 34.65 35.52 35.35 34.81 25.71 25.17 35.35 15.52\" fill=\"#484f60\"/></svg>",
12384
12400
  "cube-outline": "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M21,16.5C21,16.88 20.79,17.21 20.47,17.38L12.57,21.82C12.41,21.94 12.21,22 12,22C11.79,22 11.59,21.94 11.43,21.82L3.53,17.38C3.21,17.21 3,16.88 3,16.5V7.5C3,7.12 3.21,6.79 3.53,6.62L11.43,2.18C11.59,2.06 11.79,2 12,2C12.21,2 12.41,2.06 12.57,2.18L20.47,6.62C20.79,6.79 21,7.12 21,7.5V16.5M12,4.15L6.04,7.5L12,10.85L17.96,7.5L12,4.15M5,15.91L11,19.29V12.58L5,9.21V15.91M19,15.91V9.21L13,12.58V19.29L19,15.91Z\" /></svg>",
@@ -12391,7 +12407,9 @@ const IconSvg = {
12391
12407
  "edit-button": "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 43 43\" ><g><rect x=\"13.011\" y=\"20.038\" transform=\"matrix(0.7071 -0.7071 0.7071 0.7071 -8.7899 19.4259)\" fill=\"#FFFFFF\" width=\"12.085\" height=\"0.57\"/><rect x=\"19.341\" y=\"16.641\" transform=\"matrix(0.7072 0.707 -0.707 0.7072 22.3084 -8.4979)\" fill=\"#FFFFFF\" width=\"4.145\" height=\"12.086\"/><path fill=\"#FFFFFF\" d=\"M30.839,14.931l-2.772-2.769c-0.348-0.348-0.91-0.348-1.257,0L25.9,13.069l4.032,4.028l0.905-0.908C31.187,15.841,31.187,15.28,30.839,14.931z\"/><rect x=\"23.68\" y=\"15.743\" transform=\"matrix(-0.7072 -0.7071 0.7071 -0.7072 33.6426 46.8755)\" fill=\"#FFFFFF\" width=\"5.696\" height=\"1.456\"/><polygon fill=\"#FFFFFF\" points=\"11.9,31.099 13.546,30.663 12.337,29.456 \"/><polygon fill=\"#FFFFFF\" points=\"13.579,25.643 12.711,28.079 14.921,30.29 17.356,29.421 \"/></g></svg>",
12392
12408
  "expand": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><path d=\"M144 32c8.8 0 16 7.2 16 16s-7.2 16-16 16L32 64l0 112c0 8.8-7.2 16-16 16s-16-7.2-16-16L0 48c0-8.8 7.2-16 16-16l128 0zM0 336c0-8.8 7.2-16 16-16s16 7.2 16 16l0 112 112 0c8.8 0 16 7.2 16 16s-7.2 16-16 16L16 480c-8.8 0-16-7.2-16-16L0 336zM432 32c8.8 0 16 7.2 16 16l0 128c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-112L304 64c-8.8 0-16-7.2-16-16s7.2-16 16-16l128 0zM416 336c0-8.8 7.2-16 16-16s16 7.2 16 16l0 128c0 8.8-7.2 16-16 16l-128 0c-8.8 0-16-7.2-16-16s7.2-16 16-16l112 0 0-112z\"/></svg>",
12393
12409
  "fill_drip_light": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\"><path d=\"M36.7 4.7c6.2-6.2 16.4-6.2 22.6 0l97.4 97.4 64.4-64.4c28.1-28.1 73.7-28.1 101.8 0L474.3 189.1c28.1 28.1 28.1 73.7 0 101.8L283.9 481.4c-37.5 37.5-98.3 37.5-135.8 0L30.6 363.9c-37.5-37.5-37.5-98.3 0-135.8L134.1 124.7 36.7 27.3c-6.2-6.2-6.2-16.4 0-22.6zm208 230.6l-88-88L53.3 250.7C42.8 261.2 36.7 274.4 35 288l397 0 19.7-19.7c15.6-15.6 15.6-40.9 0-56.6L300.3 60.3c-15.6-15.6-40.9-15.6-56.6 0l-64.4 64.4 88 88c6.2 6.2 6.2 16.4 0 22.6s-16.4 6.2-22.6 0zM39.2 320c3.1 7.7 7.8 15 14.1 21.3L170.7 458.7c25 25 65.5 25 90.5 0L400 320 39.2 320zM544 448s0 0 0 0c0 0 0 0 0 0c0-.1-.1-1.2-.6-3.4c-.6-2.4-1.5-5.4-2.8-9.1c-2.7-7.4-6.8-16.2-11.7-25.8c-5.2-10.2-11.2-20.6-16.9-30.3c-5.8 9.7-11.7 20.1-16.9 30.3c-4.9 9.6-8.9 18.4-11.7 25.8c-1.4 3.7-2.3 6.7-2.8 9.1c-.5 2.2-.6 3.3-.6 3.4c0 0 0 0 0 0c0 17.7 14.3 32 32 32s32-14.3 32-32zm32 0c0 35.3-28.7 64-64 64s-64-28.7-64-64c0-25.2 32.6-79.6 51.2-108.7c6-9.4 19.5-9.4 25.5 0C543.4 368.4 576 422.8 576 448z\"/></svg>",
12410
+ "floppy_disk_light_full": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M160 128C142.3 128 128 142.3 128 160L128 480C128 497.7 142.3 512 160 512L480 512C497.7 512 512 497.7 512 480L512 237.3C512 228.8 508.6 220.7 502.6 214.7L425.4 137.4C422.7 134.7 419.5 132.5 416 130.9L416 240C416 257.7 401.7 272 384 272L224 272C206.3 272 192 257.7 192 240L192 128L160 128zM224 128L224 240L384 240L384 128L224 128zM96 160C96 124.7 124.7 96 160 96L402.7 96C419.7 96 436 102.7 448 114.7L525.3 192C537.3 204 544 220.3 544 237.3L544 480C544 515.3 515.3 544 480 544L160 544C124.7 544 96 515.3 96 480L96 160zM352 384C352 366.3 337.7 352 320 352C302.3 352 288 366.3 288 384C288 401.7 302.3 416 320 416C337.7 416 352 401.7 352 384zM256 384C256 348.7 284.7 320 320 320C355.3 320 384 348.7 384 384C384 419.3 355.3 448 320 448C284.7 448 256 419.3 256 384z\"/></svg>",
12394
12411
  "flower": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M200 0c-48.6 0-88 39.4-88 88c0 21.3 7.6 40.8 20.1 56c-12.6 15.2-20.1 34.7-20.1 56c0 48.6 39.4 88 88 88c14.4 0 28-3.5 40-9.6l0 118.2C200.8 331.5 129.5 288 48 288l-20 0c-15.5 0-28 12.5-28 28C0 424.2 87.8 512 196 512l44 0 16 0 16 0 44 0c108.2 0 196-87.8 196-196c0-15.5-12.5-28-28-28l-20 0c-81.5 0-152.8 43.5-192 108.6l0-118.2c12 6.1 25.6 9.6 40 9.6c48.6 0 88-39.4 88-88c0-21.3-7.6-40.8-20.1-56c12.6-15.2 20.1-34.7 20.1-56c0-48.6-39.4-88-88-88c-21.3 0-40.8 7.6-56 20.1C240.8 7.6 221.3 0 200 0zM144 88c0-30.9 25.1-56 56-56c17.6 0 33.3 8.1 43.6 20.8c3 3.8 7.6 5.9 12.4 5.9s9.4-2.2 12.4-5.9C278.7 40.1 294.4 32 312 32c30.9 0 56 25.1 56 56c0 17.6-8.1 33.3-20.8 43.6c-3.8 3-5.9 7.6-5.9 12.4s2.2 9.4 5.9 12.4c12.7 10.3 20.8 26 20.8 43.6c0 30.9-25.1 56-56 56c-17.6 0-33.3-8.1-43.6-20.8c-3-3.8-7.6-5.9-12.4-5.9s-9.4 2.2-12.4 5.9c-10.3 12.7-26 20.8-43.6 20.8c-30.9 0-56-25.1-56-56c0-17.6 8.1-33.3 20.8-43.6c3.8-3 5.9-7.6 5.9-12.4s-2.2-9.4-5.9-12.4C152.1 121.3 144 105.6 144 88zM32 320l16 0c95.1 0 174.1 69.2 189.3 160L196 480c-89.2 0-161.8-71.3-164-160zM480 320c-2.1 88.7-74.7 160-164 160l-41.3 0c15.2-90.8 94.2-160 189.3-160l16 0zM288 144a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z\"/></svg>",
12412
+ "folder_open_light_full": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M129.5 480C118.7 480 111 469.5 114.2 459.2L164.2 299.2C166.3 292.5 172.5 288 179.5 288L559 288C569.8 288 577.5 298.5 574.3 308.8L524.3 468.8C522.1 475.5 516 480 509 480L129.5 480zM256.2 512L509 512C530 512 548.6 498.4 554.8 478.3L604.8 318.3C614.5 287.4 591.4 256 559 256L179.6 256C158.6 256 140 269.6 133.8 289.7L96.2 409.6L96.2 160C96.2 142.3 110.5 128 128.2 128L266.9 128C273.8 128 280.6 130.2 286.1 134.4L324.5 163.2C335.6 171.5 349.1 176 362.9 176L480.2 176C497.9 176 512.2 190.3 512.2 208L544.2 208C544.2 172.7 515.5 144 480.2 144L362.9 144C356 144 349.2 141.8 343.7 137.6L305.3 108.8C294.2 100.5 280.8 96 266.9 96L128.2 96C92.9 96 64.2 124.7 64.2 160L64.2 448C64.2 483.3 92.9 512 128.2 512L256.2 512z\"/></svg>",
12395
12413
  "gauge_high_solid_full": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M64 320C64 178.6 178.6 64 320 64C461.4 64 576 178.6 576 320C576 461.4 461.4 576 320 576C178.6 576 64 461.4 64 320zM352 160C352 142.3 337.7 128 320 128C302.3 128 288 142.3 288 160C288 177.7 302.3 192 320 192C337.7 192 352 177.7 352 160zM320 480C355.3 480 384 451.3 384 416C384 399.8 378 384.9 368 373.7L437.5 234.8C443.4 222.9 438.6 208.5 426.8 202.6C415 196.7 400.5 201.5 394.6 213.3L325.1 352.2C323.4 352.1 321.7 352 320 352C284.7 352 256 380.7 256 416C256 451.3 284.7 480 320 480zM240 208C240 190.3 225.7 176 208 176C190.3 176 176 190.3 176 208C176 225.7 190.3 240 208 240C225.7 240 240 225.7 240 208zM160 352C177.7 352 192 337.7 192 320C192 302.3 177.7 288 160 288C142.3 288 128 302.3 128 320C128 337.7 142.3 352 160 352zM512 320C512 302.3 497.7 288 480 288C462.3 288 448 302.3 448 320C448 337.7 462.3 352 480 352C497.7 352 512 337.7 512 320z\"/></svg>",
12396
12414
  "gauge_low_solid_full": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M64 320C64 178.6 178.6 64 320 64C461.4 64 576 178.6 576 320C576 461.4 461.4 576 320 576C178.6 576 64 461.4 64 320zM352 160C352 142.3 337.7 128 320 128C302.3 128 288 142.3 288 160C288 177.7 302.3 192 320 192C337.7 192 352 177.7 352 160zM320 480C355.3 480 384 451.3 384 416C384 380.7 355.3 352 320 352C318.3 352 316.6 352.1 314.9 352.2L245.5 213.3C239.6 201.4 225.2 196.6 213.3 202.6C201.4 208.6 196.6 222.9 202.6 234.8L272 373.7C262 385 256 399.8 256 416C256 451.3 284.7 480 320 480zM192 320C192 302.3 177.7 288 160 288C142.3 288 128 302.3 128 320C128 337.7 142.3 352 160 352C177.7 352 192 337.7 192 320zM480 352C497.7 352 512 337.7 512 320C512 302.3 497.7 288 480 288C462.3 288 448 302.3 448 320C448 337.7 462.3 352 480 352zM464 208C464 190.3 449.7 176 432 176C414.3 176 400 190.3 400 208C400 225.7 414.3 240 432 240C449.7 240 464 225.7 464 208z\"/></svg>",
12397
12415
  "gauge_max_solid_full": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M64 320C64 178.6 178.6 64 320 64C461.4 64 576 178.6 576 320C576 461.4 461.4 576 320 576C178.6 576 64 461.4 64 320zM352 160C352 142.3 337.7 128 320 128C302.3 128 288 142.3 288 160C288 177.7 302.3 192 320 192C337.7 192 352 177.7 352 160zM320 480C355.3 480 384 451.3 384 416C384 412.6 383.7 409.3 383.2 406.1L492.3 340.6C503.7 333.8 507.3 319 500.5 307.7C493.7 296.4 478.9 292.6 467.6 299.5L358.5 364.9C347.8 356.8 334.4 352 320 352C284.7 352 256 380.7 256 416C256 451.3 284.7 480 320 480zM240 208C240 190.3 225.7 176 208 176C190.3 176 176 190.3 176 208C176 225.7 190.3 240 208 240C225.7 240 240 225.7 240 208zM160 352C177.7 352 192 337.7 192 320C192 302.3 177.7 288 160 288C142.3 288 128 302.3 128 320C128 337.7 142.3 352 160 352zM464 208C464 190.3 449.7 176 432 176C414.3 176 400 190.3 400 208C400 225.7 414.3 240 432 240C449.7 240 464 225.7 464 208z\"/></svg>",
@@ -12445,6 +12463,7 @@ const IconSvg = {
12445
12463
  "wand_magic_sparkles": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\"><path d=\"M458.3 34.9c3.1-3.1 8.2-3.1 11.3 0l39.4 39.4c3.1 3.1 3.1 8.2 0 11.3L388.7 206.1l-50.7-50.7L458.3 34.9zM66.9 426.3L315.3 177.9l50.7 50.7L117.7 477.1c-3.1 3.1-8.2 3.1-11.3 0L66.9 437.7c-3.1-3.1-3.1-8.2 0-11.3zM435.7 12.3L44.3 403.7c-15.6 15.6-15.6 40.9 0 56.6l39.4 39.4c15.6 15.6 40.9 15.6 56.6 0L531.7 108.3c15.6-15.6 15.6-40.9 0-56.6L492.3 12.3c-15.6-15.6-40.9-15.6-56.6 0zM128 80c0-8.8-7.2-16-16-16s-16 7.2-16 16l0 48-48 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l48 0 0 48c0 8.8 7.2 16 16 16s16-7.2 16-16l0-48 48 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-48 0 0-48zM464 320c-8.8 0-16 7.2-16 16l0 48-48 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l48 0 0 48c0 8.8 7.2 16 16 16s16-7.2 16-16l0-48 48 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-48 0 0-48c0-8.8-7.2-16-16-16zM252.2 16c0-6.7-5.4-12.2-12.2-12.2s-12.2 5.4-12.2 12.2l0 19.8-19.8 0c-6.7 0-12.2 5.4-12.2 12.2s5.4 12.2 12.2 12.2l19.8 0 0 19.8c0 6.7 5.4 12.2 12.2 12.2s12.2-5.4 12.2-12.2l0-19.8 19.8 0c6.7 0 12.2-5.4 12.2-12.2s-5.4-12.2-12.2-12.2l-19.8 0 0-19.8z\"/></svg>",
12446
12464
  "wifi_solid_full": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M320 160C229.1 160 146.8 196 86.3 254.6C73.6 266.9 53.3 266.6 41.1 253.9C28.9 241.2 29.1 220.9 41.8 208.7C113.7 138.9 211.9 96 320 96C428.1 96 526.3 138.9 598.3 208.7C611 221 611.3 241.3 599 253.9C586.7 266.5 566.4 266.9 553.8 254.6C493.2 196 410.9 160 320 160zM272 496C272 469.5 293.5 448 320 448C346.5 448 368 469.5 368 496C368 522.5 346.5 544 320 544C293.5 544 272 522.5 272 496zM200 390.2C188.3 403.5 168.1 404.7 154.8 393C141.5 381.3 140.3 361.1 152 347.8C193 301.4 253.1 272 320 272C386.9 272 447 301.4 488 347.8C499.7 361.1 498.4 381.3 485.2 393C472 404.7 451.7 403.4 440 390.2C410.6 356.9 367.8 336 320 336C272.2 336 229.4 356.9 200 390.2z\"/></svg>",
12447
12465
  "xmark_light": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\"><path d=\"M324.5 411.1c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6L214.6 256 347.1 123.5c6.2-6.2 6.2-16.4 0-22.6s-16.4-6.2-22.6 0L192 233.4 59.6 100.9c-6.2-6.2-16.4-6.2-22.6 0s-6.2 16.4 0 22.6L169.4 256 36.9 388.5c-6.2 6.2-6.2 16.4 0 22.6s16.4 6.2 22.6 0L192 278.6 324.5 411.1z\"/></svg>",
12466
+ "xmark_light_full": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M507.3 155.3C513.5 149.1 513.5 138.9 507.3 132.7C501.1 126.5 490.9 126.5 484.7 132.7L320 297.4L155.3 132.7C149.1 126.5 138.9 126.5 132.7 132.7C126.5 138.9 126.5 149.1 132.7 155.3L297.4 320L132.7 484.7C126.5 490.9 126.5 501.1 132.7 507.3C138.9 513.5 149.1 513.5 155.3 507.3L320 342.6L484.7 507.3C490.9 513.5 501.1 513.5 507.3 507.3C513.5 501.1 513.5 490.9 507.3 484.7L342.6 320L507.3 155.3z\"/></svg>",
12448
12467
  "xmark_regular": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\"><path d=\"M345 137c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-119 119L73 103c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l119 119L39 375c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l119-119L311 409c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-119-119L345 137z\"/></svg>"
12449
12468
  };
12450
12469
 
@@ -12861,7 +12880,7 @@ class GoogleTranslateService {
12861
12880
  return input;
12862
12881
  }
12863
12882
  const sourceLang = this._defaultLanguage.toLowerCase();
12864
- const targetLang = this._clientLanguage.toLowerCase();
12883
+ const targetLang = this._clientLanguage ? this._clientLanguage.toLowerCase() : sourceLang;
12865
12884
  const translationList = [input];
12866
12885
  // When we do not need a translation
12867
12886
  if (!input || (sourceLang === targetLang)) {
@@ -14726,6 +14745,108 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
14726
14745
  args: ['class.should-be-hidden']
14727
14746
  }] } });
14728
14747
 
14748
+ var PresetDialogMode;
14749
+ (function (PresetDialogMode) {
14750
+ PresetDialogMode[PresetDialogMode["SAVE"] = 0] = "SAVE";
14751
+ PresetDialogMode[PresetDialogMode["LOAD"] = 1] = "LOAD";
14752
+ })(PresetDialogMode || (PresetDialogMode = {}));
14753
+
14754
+ class ConfigurationPresetComponent {
14755
+ iconService;
14756
+ _appEventService;
14757
+ icons = IconEnum;
14758
+ isSaveLoadMenuOpen = false;
14759
+ showClass() {
14760
+ return true;
14761
+ }
14762
+ closeSaveLoadMenu() {
14763
+ this.isSaveLoadMenuOpen = false;
14764
+ }
14765
+ constructor(iconService, _appEventService) {
14766
+ this.iconService = iconService;
14767
+ this._appEventService = _appEventService;
14768
+ }
14769
+ toggleSaveLoadMenu(event) {
14770
+ event.stopPropagation();
14771
+ this.isSaveLoadMenuOpen = !this.isSaveLoadMenuOpen;
14772
+ }
14773
+ handleSavePresetClicked() {
14774
+ this.isSaveLoadMenuOpen = false;
14775
+ this._appEventService.changeConfigurationPresetDialogMode.next(PresetDialogMode.SAVE);
14776
+ }
14777
+ handleLoadPresetClicked() {
14778
+ this.isSaveLoadMenuOpen = false;
14779
+ this._appEventService.changeConfigurationPresetDialogMode.next(PresetDialogMode.LOAD);
14780
+ }
14781
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetComponent, deps: [{ token: IconCacheService }, { token: AppEventService }], target: i0.ɵɵFactoryTarget.Component });
14782
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: ConfigurationPresetComponent, isStandalone: false, selector: "co-configuration-preset", host: { listeners: { "document:click": "closeSaveLoadMenu()" }, properties: { "class.co-configuration-preset": "this.showClass" } }, ngImport: i0, template: `
14783
+ <div class="save-load-config-wrapper">
14784
+ <div class="open-save-load" (click)="toggleSaveLoadMenu($event)">
14785
+ <co-icon [iconData]="iconService.getIcon(icons.BarsLightFull)"></co-icon>
14786
+ </div>
14787
+ <div
14788
+ class="save-load-configuration-buttons"
14789
+ [class.is-open]="isSaveLoadMenuOpen"
14790
+ (click)="$event.stopPropagation()">
14791
+ <co-button
14792
+ class="preset-button save-preset-button"
14793
+ [iconData]="iconService.getIcon(icons.FloppyDiskLightFull)"
14794
+ [label]="'SAVE_CONFIGURATION' | localize"
14795
+ (onClick)="handleSavePresetClicked()">
14796
+ </co-button>
14797
+ <co-button
14798
+ class="preset-button load-preset-button"
14799
+ [iconData]="iconService.getIcon(icons.FolderOpenLightFull)"
14800
+ [label]="'LOAD_CONFIGURATION' | localize"
14801
+ (onClick)="handleLoadPresetClicked()">
14802
+ </co-button>
14803
+ </div>
14804
+ </div>
14805
+
14806
+
14807
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.ButtonComponent, selector: "co-button", inputs: ["label", "iconData", "iconDataRight", "isToggleButton", "isToggled", "hidden", "disabled"], outputs: ["onClick", "clickedWhileDisabled", "isToggledChange"] }, { kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
14808
+ }
14809
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetComponent, decorators: [{
14810
+ type: Component,
14811
+ args: [{
14812
+ selector: 'co-configuration-preset',
14813
+ template: `
14814
+ <div class="save-load-config-wrapper">
14815
+ <div class="open-save-load" (click)="toggleSaveLoadMenu($event)">
14816
+ <co-icon [iconData]="iconService.getIcon(icons.BarsLightFull)"></co-icon>
14817
+ </div>
14818
+ <div
14819
+ class="save-load-configuration-buttons"
14820
+ [class.is-open]="isSaveLoadMenuOpen"
14821
+ (click)="$event.stopPropagation()">
14822
+ <co-button
14823
+ class="preset-button save-preset-button"
14824
+ [iconData]="iconService.getIcon(icons.FloppyDiskLightFull)"
14825
+ [label]="'SAVE_CONFIGURATION' | localize"
14826
+ (onClick)="handleSavePresetClicked()">
14827
+ </co-button>
14828
+ <co-button
14829
+ class="preset-button load-preset-button"
14830
+ [iconData]="iconService.getIcon(icons.FolderOpenLightFull)"
14831
+ [label]="'LOAD_CONFIGURATION' | localize"
14832
+ (onClick)="handleLoadPresetClicked()">
14833
+ </co-button>
14834
+ </div>
14835
+ </div>
14836
+
14837
+
14838
+ `,
14839
+ encapsulation: ViewEncapsulation.None,
14840
+ standalone: false
14841
+ }]
14842
+ }], ctorParameters: () => [{ type: IconCacheService }, { type: AppEventService }], propDecorators: { showClass: [{
14843
+ type: HostBinding,
14844
+ args: ['class.co-configuration-preset']
14845
+ }], closeSaveLoadMenu: [{
14846
+ type: HostListener,
14847
+ args: ['document:click']
14848
+ }] } });
14849
+
14729
14850
  class SelectionsSummaryComponent {
14730
14851
  configuratorConnectorService;
14731
14852
  iconService;
@@ -14738,6 +14859,7 @@ class SelectionsSummaryComponent {
14738
14859
  canClose = true;
14739
14860
  answersTemplate;
14740
14861
  answerToShowFromSelectionText;
14862
+ showSaveAndLoadConfiguration;
14741
14863
  customDimensions = false;
14742
14864
  disableMouse = false;
14743
14865
  handledocumentMouseUp(event) {
@@ -14787,82 +14909,88 @@ class SelectionsSummaryComponent {
14787
14909
  this.selectionToCustomize = sel;
14788
14910
  }
14789
14911
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: SelectionsSummaryComponent, deps: [{ token: ConfiguratorConnectorService }, { token: IconCacheService }], target: i0.ɵɵFactoryTarget.Component });
14790
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: SelectionsSummaryComponent, isStandalone: false, selector: "co-selections-summary", inputs: { selections: "selections", showLabel: "showLabel", canClose: "canClose", answersTemplate: "answersTemplate", answerToShowFromSelectionText: "answerToShowFromSelectionText", customDimensions: "customDimensions" }, outputs: { closeClick: "closeClick", cancelAnswers: "cancelAnswers", selectSelection: "selectSelection", repeatSelection: "repeatSelection", deleteSelection: "deleteSelection" }, host: { listeners: { "document:mouseup": "handledocumentMouseUp($event)", "document:mousemove": "handleDocumentMouseDown($event)" }, properties: { "class.co-selections-summary": "this.showClass", "class.custom-dimensions": "this.customDimensions", "class.disable-mouse": "this.disableMouse" } }, ngImport: i0, template: `
14791
- @if (showLabel || canClose) {
14792
- <header class="drawer__header">
14793
- @if (showLabel) {
14794
- <h2 class="mat-title">{{ 'CONFIGURATION' | localize }}</h2>
14795
- }
14796
- @if (canClose) {
14797
- <button class="close-lite-selector" (click)="closeClick.emit()">
14798
- <co-icon [iconData]="iconService.getIcon(icons.Cross)"></co-icon>
14799
- </button>
14800
- }
14801
- </header>
14802
- }
14803
- @if (selections && selections.length > 0) {
14804
- <div class="selections-content small-scrollbar">
14805
- @for (sel of selections; track sel; let index = $index) {
14806
- <co-selections-summary-line
14807
- [selection]="sel"
14808
- [answersTemplate]="answersTemplate ? answersTemplate : undefined"
14809
- [answerToShowFromSelectionText]="answerToShowFromSelectionText"
14810
- [valutaSymbol]="valutaSymbol"
14811
- (summaryLineClick)="handleClick(sel)"
14812
- (summaryLineDelete)="handleDelete($event, sel)"
14813
- (summaryLineRepeat)="handleRepeat($event, sel)"
14814
- (customizeButtonClicked)="toggleElement(sel)"
14815
- ></co-selections-summary-line>
14816
- }
14817
- @if (showAsConfigured) {
14818
- <div class="sum">
14819
- <label [textContent]="'AS_CONFIGURED' | localize"></label><span class="total-price"></span>
14820
- <div class="price"> {{ configuratorConnectorService.totalPrice | priceDisplay }}</div>
14821
- </div>
14822
- }
14823
- </div>
14824
- }
14825
- `, isInline: true, dependencies: [{ kind: "component", type: SelectionsSummaryLineComponent, selector: "co-selections-summary-line", inputs: ["selection", "valutaSymbol", "answersTemplate", "answerToShowFromSelectionText"], outputs: ["customizeButtonClicked", "summaryLineClick", "summaryLineRepeat", "summaryLineDelete"] }, { kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: LocalizePipe, name: "localize" }, { kind: "pipe", type: i4.PriceDisplayPipe, name: "priceDisplay" }], encapsulation: i0.ViewEncapsulation.None });
14912
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: SelectionsSummaryComponent, isStandalone: false, selector: "co-selections-summary", inputs: { selections: "selections", showLabel: "showLabel", canClose: "canClose", answersTemplate: "answersTemplate", answerToShowFromSelectionText: "answerToShowFromSelectionText", showSaveAndLoadConfiguration: "showSaveAndLoadConfiguration", customDimensions: "customDimensions" }, outputs: { closeClick: "closeClick", cancelAnswers: "cancelAnswers", selectSelection: "selectSelection", repeatSelection: "repeatSelection", deleteSelection: "deleteSelection" }, host: { listeners: { "document:mouseup": "handledocumentMouseUp($event)", "document:mousemove": "handleDocumentMouseDown($event)" }, properties: { "class.co-selections-summary": "this.showClass", "class.custom-dimensions": "this.customDimensions", "class.disable-mouse": "this.disableMouse" } }, ngImport: i0, template: `
14913
+ @if (showLabel || canClose) {
14914
+ <header class="drawer__header">
14915
+ @if (showLabel) {
14916
+ <h2 class="mat-title">{{ 'CONFIGURATION' | localize }}</h2>
14917
+ }
14918
+ @if (canClose) {
14919
+ <button class="close-lite-selector" (click)="closeClick.emit()">
14920
+ <co-icon [iconData]="iconService.getIcon(icons.Cross)"></co-icon>
14921
+ </button>
14922
+ }
14923
+ </header>
14924
+ }
14925
+ @if (selections && selections.length > 0) {
14926
+ <div class="selections-content small-scrollbar">
14927
+ @for (sel of selections; track sel; let index = $index) {
14928
+ <co-selections-summary-line
14929
+ [selection]="sel"
14930
+ [answersTemplate]="answersTemplate ? answersTemplate : undefined"
14931
+ [answerToShowFromSelectionText]="answerToShowFromSelectionText"
14932
+ [valutaSymbol]="valutaSymbol"
14933
+ (summaryLineClick)="handleClick(sel)"
14934
+ (summaryLineDelete)="handleDelete($event, sel)"
14935
+ (summaryLineRepeat)="handleRepeat($event, sel)"
14936
+ (customizeButtonClicked)="toggleElement(sel)"
14937
+ ></co-selections-summary-line>
14938
+ }
14939
+ @if (showSaveAndLoadConfiguration) {
14940
+ <co-configuration-preset></co-configuration-preset>
14941
+ }
14942
+ @if (showAsConfigured) {
14943
+ <div class="sum">
14944
+ <label [textContent]="'AS_CONFIGURED' | localize"></label><span class="total-price"></span>
14945
+ <div class="price"> {{ configuratorConnectorService.totalPrice | priceDisplay }}</div>
14946
+ </div>
14947
+ }
14948
+ </div>
14949
+ }
14950
+ `, isInline: true, dependencies: [{ kind: "component", type: SelectionsSummaryLineComponent, selector: "co-selections-summary-line", inputs: ["selection", "valutaSymbol", "answersTemplate", "answerToShowFromSelectionText"], outputs: ["customizeButtonClicked", "summaryLineClick", "summaryLineRepeat", "summaryLineDelete"] }, { kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: ConfigurationPresetComponent, selector: "co-configuration-preset" }, { kind: "pipe", type: LocalizePipe, name: "localize" }, { kind: "pipe", type: i4.PriceDisplayPipe, name: "priceDisplay" }], encapsulation: i0.ViewEncapsulation.None });
14826
14951
  }
14827
14952
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: SelectionsSummaryComponent, decorators: [{
14828
14953
  type: Component,
14829
14954
  args: [{
14830
14955
  selector: 'co-selections-summary',
14831
14956
  template: `
14832
- @if (showLabel || canClose) {
14833
- <header class="drawer__header">
14834
- @if (showLabel) {
14835
- <h2 class="mat-title">{{ 'CONFIGURATION' | localize }}</h2>
14836
- }
14837
- @if (canClose) {
14838
- <button class="close-lite-selector" (click)="closeClick.emit()">
14839
- <co-icon [iconData]="iconService.getIcon(icons.Cross)"></co-icon>
14840
- </button>
14841
- }
14842
- </header>
14843
- }
14844
- @if (selections && selections.length > 0) {
14845
- <div class="selections-content small-scrollbar">
14846
- @for (sel of selections; track sel; let index = $index) {
14847
- <co-selections-summary-line
14848
- [selection]="sel"
14849
- [answersTemplate]="answersTemplate ? answersTemplate : undefined"
14850
- [answerToShowFromSelectionText]="answerToShowFromSelectionText"
14851
- [valutaSymbol]="valutaSymbol"
14852
- (summaryLineClick)="handleClick(sel)"
14853
- (summaryLineDelete)="handleDelete($event, sel)"
14854
- (summaryLineRepeat)="handleRepeat($event, sel)"
14855
- (customizeButtonClicked)="toggleElement(sel)"
14856
- ></co-selections-summary-line>
14857
- }
14858
- @if (showAsConfigured) {
14859
- <div class="sum">
14860
- <label [textContent]="'AS_CONFIGURED' | localize"></label><span class="total-price"></span>
14861
- <div class="price"> {{ configuratorConnectorService.totalPrice | priceDisplay }}</div>
14862
- </div>
14863
- }
14864
- </div>
14865
- }
14957
+ @if (showLabel || canClose) {
14958
+ <header class="drawer__header">
14959
+ @if (showLabel) {
14960
+ <h2 class="mat-title">{{ 'CONFIGURATION' | localize }}</h2>
14961
+ }
14962
+ @if (canClose) {
14963
+ <button class="close-lite-selector" (click)="closeClick.emit()">
14964
+ <co-icon [iconData]="iconService.getIcon(icons.Cross)"></co-icon>
14965
+ </button>
14966
+ }
14967
+ </header>
14968
+ }
14969
+ @if (selections && selections.length > 0) {
14970
+ <div class="selections-content small-scrollbar">
14971
+ @for (sel of selections; track sel; let index = $index) {
14972
+ <co-selections-summary-line
14973
+ [selection]="sel"
14974
+ [answersTemplate]="answersTemplate ? answersTemplate : undefined"
14975
+ [answerToShowFromSelectionText]="answerToShowFromSelectionText"
14976
+ [valutaSymbol]="valutaSymbol"
14977
+ (summaryLineClick)="handleClick(sel)"
14978
+ (summaryLineDelete)="handleDelete($event, sel)"
14979
+ (summaryLineRepeat)="handleRepeat($event, sel)"
14980
+ (customizeButtonClicked)="toggleElement(sel)"
14981
+ ></co-selections-summary-line>
14982
+ }
14983
+ @if (showSaveAndLoadConfiguration) {
14984
+ <co-configuration-preset></co-configuration-preset>
14985
+ }
14986
+ @if (showAsConfigured) {
14987
+ <div class="sum">
14988
+ <label [textContent]="'AS_CONFIGURED' | localize"></label><span class="total-price"></span>
14989
+ <div class="price"> {{ configuratorConnectorService.totalPrice | priceDisplay }}</div>
14990
+ </div>
14991
+ }
14992
+ </div>
14993
+ }
14866
14994
  `,
14867
14995
  encapsulation: ViewEncapsulation.None,
14868
14996
  standalone: false
@@ -14880,6 +15008,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
14880
15008
  type: Input
14881
15009
  }], answerToShowFromSelectionText: [{
14882
15010
  type: Input
15011
+ }], showSaveAndLoadConfiguration: [{
15012
+ type: Input
14883
15013
  }], customDimensions: [{
14884
15014
  type: HostBinding,
14885
15015
  args: ['class.custom-dimensions']
@@ -14939,6 +15069,7 @@ class LiteSelectorComponent {
14939
15069
  canClose = true;
14940
15070
  animateSlideout = true;
14941
15071
  customDimensions = false;
15072
+ showSaveAndLoadConfiguration;
14942
15073
  showChange = new EventEmitter();
14943
15074
  answerChosen = new EventEmitter();
14944
15075
  answerToShowFromSelectionText;
@@ -14991,7 +15122,7 @@ class LiteSelectorComponent {
14991
15122
  // this.iOne.getMoodImageForAnswerSelection(answerSelected.answer, false);
14992
15123
  }
14993
15124
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: LiteSelectorComponent, deps: [{ token: SwitchBuildFurnitureService }, { token: ConfiguratorConnectorService }, { token: ConfiguringService }], target: i0.ɵɵFactoryTarget.Component });
14994
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: LiteSelectorComponent, isStandalone: false, selector: "co-lite-selector", inputs: { showAnswers: "showAnswers", show: "show", showSelections: "showSelections", showLabel: "showLabel", canClose: "canClose", animateSlideout: "animateSlideout", customDimensions: "customDimensions" }, outputs: { showChange: "showChange", answerChosen: "answerChosen" }, host: { properties: { "class.co-lite-selector": "this.showClass", "class.custom-dimensions": "this.customDimensions" } }, viewQueries: [{ propertyName: "templateAnswers", first: true, predicate: ["templateAnswers"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: `
15125
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: LiteSelectorComponent, isStandalone: false, selector: "co-lite-selector", inputs: { showAnswers: "showAnswers", show: "show", showSelections: "showSelections", showLabel: "showLabel", canClose: "canClose", animateSlideout: "animateSlideout", customDimensions: "customDimensions", showSaveAndLoadConfiguration: "showSaveAndLoadConfiguration" }, outputs: { showChange: "showChange", answerChosen: "answerChosen" }, host: { properties: { "class.co-lite-selector": "this.showClass", "class.custom-dimensions": "this.customDimensions" } }, viewQueries: [{ propertyName: "templateAnswers", first: true, predicate: ["templateAnswers"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: `
14995
15126
  <ng-container>
14996
15127
  @if (showSelections && configuratorConnectorService.selectionsToDisplay.length > 0) {
14997
15128
  <co-selections-summary
@@ -15003,11 +15134,11 @@ class LiteSelectorComponent {
15003
15134
  [answersTemplate]="inlineAnswers ? templateAnswers : undefined"
15004
15135
  [answerToShowFromSelectionText]="answerToShowFromSelectionText"
15005
15136
  [selections]="configuratorConnectorService.selectionsToDisplay"
15137
+ [showSaveAndLoadConfiguration]="showSaveAndLoadConfiguration"
15006
15138
  (selectSelection)="onSelectionsSummarySelectSelection($event)"
15007
15139
  (repeatSelection)="onSelectionsSummarySelectSelection($event, false, true)"
15008
15140
  (deleteSelection)="onSelectionsSummaryDeleteSelection($event)"
15009
- (closeClick)="onCloseLiteSelectorButtonClick()"
15010
- >
15141
+ (closeClick)="onCloseLiteSelectorButtonClick()">
15011
15142
  </co-selections-summary>
15012
15143
  }
15013
15144
  @if (!inlineAnswers) {
@@ -15028,7 +15159,7 @@ class LiteSelectorComponent {
15028
15159
  (answerChosen)="onAnswersSlideoutAnswerChosen($event)"
15029
15160
  ></co-answers-slideout>
15030
15161
  </ng-template>
15031
- `, isInline: true, dependencies: [{ kind: "component", type: AnswersSlideoutComponent, selector: "co-answers-slideout", inputs: ["isShown", "question", "showTitle", "showFilter", "answers", "useSlideout", "customDimensions"], outputs: ["isShownChange", "answerChosen"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SelectionsSummaryComponent, selector: "co-selections-summary", inputs: ["selections", "showLabel", "canClose", "answersTemplate", "answerToShowFromSelectionText", "customDimensions"], outputs: ["closeClick", "cancelAnswers", "selectSelection", "repeatSelection", "deleteSelection"] }], animations: [
15162
+ `, isInline: true, dependencies: [{ kind: "component", type: AnswersSlideoutComponent, selector: "co-answers-slideout", inputs: ["isShown", "question", "showTitle", "showFilter", "answers", "useSlideout", "customDimensions"], outputs: ["isShownChange", "answerChosen"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SelectionsSummaryComponent, selector: "co-selections-summary", inputs: ["selections", "showLabel", "canClose", "answersTemplate", "answerToShowFromSelectionText", "showSaveAndLoadConfiguration", "customDimensions"], outputs: ["closeClick", "cancelAnswers", "selectSelection", "repeatSelection", "deleteSelection"] }], animations: [
15032
15163
  trigger('showSelections', [
15033
15164
  state('void', style({ 'transform': 'translateX(100%)', opacity: 0 })),
15034
15165
  state('*', style({ 'transform': 'translateX(0%)', opacity: 1 })),
@@ -15052,11 +15183,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15052
15183
  [answersTemplate]="inlineAnswers ? templateAnswers : undefined"
15053
15184
  [answerToShowFromSelectionText]="answerToShowFromSelectionText"
15054
15185
  [selections]="configuratorConnectorService.selectionsToDisplay"
15186
+ [showSaveAndLoadConfiguration]="showSaveAndLoadConfiguration"
15055
15187
  (selectSelection)="onSelectionsSummarySelectSelection($event)"
15056
15188
  (repeatSelection)="onSelectionsSummarySelectSelection($event, false, true)"
15057
15189
  (deleteSelection)="onSelectionsSummaryDeleteSelection($event)"
15058
- (closeClick)="onCloseLiteSelectorButtonClick()"
15059
- >
15190
+ (closeClick)="onCloseLiteSelectorButtonClick()">
15060
15191
  </co-selections-summary>
15061
15192
  }
15062
15193
  @if (!inlineAnswers) {
@@ -15111,6 +15242,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15111
15242
  args: ['class.custom-dimensions']
15112
15243
  }, {
15113
15244
  type: Input
15245
+ }], showSaveAndLoadConfiguration: [{
15246
+ type: Input
15114
15247
  }], showChange: [{
15115
15248
  type: Output
15116
15249
  }], answerChosen: [{
@@ -15139,6 +15272,7 @@ class ProductConfiguratorSelectorOptionTileComponent {
15139
15272
  icons = IconEnum;
15140
15273
  option;
15141
15274
  tileClass = 'small';
15275
+ noLabel = false;
15142
15276
  selectionClicked = new EventEmitter();
15143
15277
  constructor(configuratorConnectorService, iconService, settingsService) {
15144
15278
  this.configuratorConnectorService = configuratorConnectorService;
@@ -15149,7 +15283,7 @@ class ProductConfiguratorSelectorOptionTileComponent {
15149
15283
  this.selectionClicked.emit();
15150
15284
  }
15151
15285
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorOptionTileComponent, deps: [{ token: ConfiguratorConnectorService }, { token: IconCacheService }, { token: SettingsService }], target: i0.ɵɵFactoryTarget.Component });
15152
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ProductConfiguratorSelectorOptionTileComponent, isStandalone: false, selector: "co-product-configurator-selector-option-tile", inputs: { option: "option", tileClass: "tileClass" }, outputs: { selectionClicked: "selectionClicked" }, host: { properties: { "class.co-product-configurator-selector-option-tile": "this.showClass" } }, ngImport: i0, template: `
15286
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ProductConfiguratorSelectorOptionTileComponent, isStandalone: false, selector: "co-product-configurator-selector-option-tile", inputs: { option: "option", tileClass: "tileClass", noLabel: "noLabel" }, outputs: { selectionClicked: "selectionClicked" }, host: { properties: { "class.co-product-configurator-selector-option-tile": "this.showClass" } }, ngImport: i0, template: `
15153
15287
  <!-- When selected show checkmark -->
15154
15288
  <div
15155
15289
  class="configurator-selector-option-tile-container configurator-selector-option-tile-container-{{this.tileClass}}"
@@ -15173,14 +15307,16 @@ class ProductConfiguratorSelectorOptionTileComponent {
15173
15307
  }
15174
15308
  </div>
15175
15309
  <!-- Answer text -->
15176
- <div class="product-configurator-selector-option-tile-description">
15177
- @if (option.nodeText) {
15178
- <p [textContent]="option.nodeText | googleTranslate | async"></p>
15179
- }
15180
- @if (!option.nodeText) {
15181
- <p [textContent]="'Skip / Cancel' | googleTranslate | async"></p>
15310
+ @if (!noLabel) {
15311
+ <div class="product-configurator-selector-option-tile-description">
15312
+ @if (option.nodeText) {
15313
+ <p [textContent]="option.nodeText | googleTranslate | async"></p>
15314
+ }
15315
+ @if (!option.nodeText) {
15316
+ <p [textContent]="'Skip / Cancel' | googleTranslate | async"></p>
15317
+ }
15318
+ </div>
15182
15319
  }
15183
- </div>
15184
15320
  </div>
15185
15321
  `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: GoogleTranslatePipe, name: "googleTranslate" }], encapsulation: i0.ViewEncapsulation.None });
15186
15322
  }
@@ -15212,14 +15348,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15212
15348
  }
15213
15349
  </div>
15214
15350
  <!-- Answer text -->
15215
- <div class="product-configurator-selector-option-tile-description">
15216
- @if (option.nodeText) {
15217
- <p [textContent]="option.nodeText | googleTranslate | async"></p>
15218
- }
15219
- @if (!option.nodeText) {
15220
- <p [textContent]="'Skip / Cancel' | googleTranslate | async"></p>
15351
+ @if (!noLabel) {
15352
+ <div class="product-configurator-selector-option-tile-description">
15353
+ @if (option.nodeText) {
15354
+ <p [textContent]="option.nodeText | googleTranslate | async"></p>
15355
+ }
15356
+ @if (!option.nodeText) {
15357
+ <p [textContent]="'Skip / Cancel' | googleTranslate | async"></p>
15358
+ }
15359
+ </div>
15221
15360
  }
15222
- </div>
15223
15361
  </div>
15224
15362
  `,
15225
15363
  encapsulation: ViewEncapsulation.None,
@@ -15232,6 +15370,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15232
15370
  type: Input
15233
15371
  }], tileClass: [{
15234
15372
  type: Input
15373
+ }], noLabel: [{
15374
+ type: Input
15235
15375
  }], selectionClicked: [{
15236
15376
  type: Output
15237
15377
  }] } });
@@ -15498,13 +15638,24 @@ class ProductConfiguratorSelectorOptionComponent {
15498
15638
  selection;
15499
15639
  listOfChoices;
15500
15640
  markAsException;
15641
+ showGlobalAll = false;
15642
+ groupedSubShow = true;
15501
15643
  configurationDisplayOption = ConfigurationDisplayOption;
15502
15644
  selectionClass = '';
15503
15645
  showAllTiles = false;
15504
15646
  maxVisibleTiles = 10;
15505
- maxVisibleSmallTiles = 24;
15647
+ maxVisibleSmallTiles = 7;
15506
15648
  visibleAnswers = [];
15507
15649
  remainingTilesCount = 0;
15650
+ smallTileOptions = [
15651
+ ConfigurationDisplayOption.TileSmall,
15652
+ ConfigurationDisplayOption.SmallCircle,
15653
+ ConfigurationDisplayOption.SmallSquare
15654
+ ];
15655
+ largeTileOptions = [
15656
+ ConfigurationDisplayOption.TileLarge,
15657
+ ConfigurationDisplayOption.TileRounded
15658
+ ];
15508
15659
  constructor(configuratorConnectorService, settingsService, productConfiguratorService) {
15509
15660
  this.configuratorConnectorService = configuratorConnectorService;
15510
15661
  this.settingsService = settingsService;
@@ -15512,7 +15663,7 @@ class ProductConfiguratorSelectorOptionComponent {
15512
15663
  }
15513
15664
  ngOnInit() {
15514
15665
  if (this.selection && this.selection.displayOptionControl == null) {
15515
- this.selection.displayOptionControl = ConfigurationDisplayOption.Tab;
15666
+ this.selection.displayOptionControl = ConfigurationDisplayOption.TileLarge;
15516
15667
  }
15517
15668
  if (this.markAsException) {
15518
15669
  this.selectionClass = 'selection-exception selection-container-' + this.selection.displayOptionControl;
@@ -15528,8 +15679,23 @@ class ProductConfiguratorSelectorOptionComponent {
15528
15679
  this.configuratorConnectorService.getImageForAnswer(selectionCopy);
15529
15680
  this.listOfChoices.push(selectionCopy);
15530
15681
  }
15682
+ if (this.showGlobalAll) {
15683
+ this.showAllTiles = true;
15684
+ }
15531
15685
  this._calculateVisibleAnswers();
15532
15686
  }
15687
+ ngOnChanges(changes) {
15688
+ if (changes.showGlobalAll && !changes.showGlobalAll.firstChange) {
15689
+ this.showAllTiles = !!changes.showGlobalAll.currentValue;
15690
+ this._calculateVisibleAnswers();
15691
+ }
15692
+ if (changes.listOfChoices && !changes.listOfChoices.firstChange) {
15693
+ this._calculateVisibleAnswers();
15694
+ }
15695
+ if (changes.selection && !changes.selection.firstChange) {
15696
+ this._calculateVisibleAnswers();
15697
+ }
15698
+ }
15533
15699
  selectionClicked(answer) {
15534
15700
  this.productConfiguratorService.selectSelection.emit(answer);
15535
15701
  }
@@ -15541,23 +15707,39 @@ class ProductConfiguratorSelectorOptionComponent {
15541
15707
  this.showAllTiles = false;
15542
15708
  this._calculateVisibleAnswers();
15543
15709
  }
15710
+ getTileClass() {
15711
+ switch (this.selection.displayOptionControl) {
15712
+ case this.configurationDisplayOption.TileLarge:
15713
+ return 'large';
15714
+ case this.configurationDisplayOption.TileRounded:
15715
+ return 'rounded';
15716
+ case this.configurationDisplayOption.SmallCircle:
15717
+ return 'small-rounded';
15718
+ case this.configurationDisplayOption.SmallSquare:
15719
+ return 'small-square';
15720
+ default:
15721
+ return 'small';
15722
+ }
15723
+ }
15544
15724
  _calculateVisibleAnswers() {
15545
- if (this.selection.displayOptionControl === ConfigurationDisplayOption.TileLarge) {
15546
- if (this.showAllTiles) {
15547
- this.visibleAnswers = this.listOfChoices;
15548
- }
15549
- else {
15550
- this.visibleAnswers = this.listOfChoices.slice(0, this.maxVisibleTiles);
15551
- }
15725
+ if (this.largeTileOptions.includes(this.selection.displayOptionControl)) {
15726
+ const configuredMaxVisibleTiles = this.settingsService?.settings?.options?.maxVisibleTiles;
15727
+ if (configuredMaxVisibleTiles != null) {
15728
+ this.maxVisibleTiles = configuredMaxVisibleTiles;
15729
+ }
15730
+ this.visibleAnswers = this.showAllTiles
15731
+ ? this.listOfChoices
15732
+ : this.listOfChoices.slice(0, this.maxVisibleTiles);
15552
15733
  this.remainingTilesCount = Math.max(0, this.listOfChoices.length - this.maxVisibleTiles);
15553
15734
  }
15554
- else if (this.selection.displayOptionControl === ConfigurationDisplayOption.TileSmall) {
15555
- if (this.showAllTiles) {
15556
- this.visibleAnswers = this.listOfChoices;
15557
- }
15558
- else {
15559
- this.visibleAnswers = this.listOfChoices.slice(0, this.maxVisibleSmallTiles);
15735
+ else if (this.smallTileOptions.includes(this.selection.displayOptionControl)) {
15736
+ const configuredMaxVisibleTiles = this.settingsService?.settings?.options?.maxVisibleSmallTiles;
15737
+ if (configuredMaxVisibleTiles != null) {
15738
+ this.maxVisibleSmallTiles = configuredMaxVisibleTiles;
15560
15739
  }
15740
+ this.visibleAnswers = this.showAllTiles
15741
+ ? this.listOfChoices
15742
+ : this.listOfChoices.slice(0, this.maxVisibleSmallTiles);
15561
15743
  this.remainingTilesCount = Math.max(0, this.listOfChoices.length - this.maxVisibleSmallTiles);
15562
15744
  }
15563
15745
  else {
@@ -15566,11 +15748,11 @@ class ProductConfiguratorSelectorOptionComponent {
15566
15748
  }
15567
15749
  }
15568
15750
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorOptionComponent, deps: [{ token: ConfiguratorConnectorService }, { token: SettingsService }, { token: ProductConfiguratorService }], target: i0.ɵɵFactoryTarget.Component });
15569
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ProductConfiguratorSelectorOptionComponent, isStandalone: false, selector: "co-product-configurator-selector-option", inputs: { selection: "selection", listOfChoices: "listOfChoices", markAsException: "markAsException" }, host: { properties: { "class.co-product-configurator-selector-option": "this.showClass" } }, ngImport: i0, template: `
15751
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ProductConfiguratorSelectorOptionComponent, isStandalone: false, selector: "co-product-configurator-selector-option", inputs: { selection: "selection", listOfChoices: "listOfChoices", markAsException: "markAsException", showGlobalAll: "showGlobalAll", groupedSubShow: "groupedSubShow" }, host: { properties: { "class.co-product-configurator-selector-option": "this.showClass" } }, usesOnChanges: true, ngImport: i0, template: `
15570
15752
  <div class="selector-wrapper {{this.selectionClass}}">
15571
15753
  @if (this.selection.displayOptionControl !== configurationDisplayOption.DropDown
15572
- && this.selection.displayOptionControl !== configurationDisplayOption.TileLarge
15573
- && this.selection.displayOptionControl !== configurationDisplayOption.TileSmall) {
15754
+ && !this.largeTileOptions.includes(this.selection.displayOptionControl)
15755
+ && !this.smallTileOptions.includes(this.selection.displayOptionControl)) {
15574
15756
  @for (child of listOfChoices; track child) {
15575
15757
  <div class="selector-option-wrapper" [class.active]="child.selected ==='F'">
15576
15758
  @if (this.selection.displayOptionControl === configurationDisplayOption.Button) {
@@ -15592,18 +15774,25 @@ class ProductConfiguratorSelectorOptionComponent {
15592
15774
  (selectionClicked)="selectionClicked(child)">
15593
15775
  </co-product-configurator-selector-option-tile>
15594
15776
  }
15595
- @if (this.selection.displayOptionControl === configurationDisplayOption.Tab) {
15777
+ @if (this.selection.displayOptionControl === configurationDisplayOption.HorizontalTiles) {
15596
15778
  <co-product-configurator-selector-option-tile
15597
15779
  [option]="child"
15598
- [tileClass]="'small-rounded'"
15780
+ [tileClass]="'horizontal'"
15599
15781
  (selectionClicked)="selectionClicked(child)">
15600
15782
  </co-product-configurator-selector-option-tile>
15601
15783
  }
15602
- @if (this.selection.displayOptionControl === configurationDisplayOption.HorizontalTiles) {
15784
+ @if (this.selection.displayOptionControl === configurationDisplayOption.OnPage) {
15603
15785
  <co-product-configurator-selector-option-tile
15604
- [option]="child"
15605
- [tileClass]="'horizontal'"
15606
- (selectionClicked)="selectionClicked(child)">
15786
+ [option]="child"
15787
+ [tileClass]="'on-page'"
15788
+ (selectionClicked)="selectionClicked(child)">
15789
+ </co-product-configurator-selector-option-tile>
15790
+ }
15791
+ @if (this.selection.displayOptionControl === configurationDisplayOption.SlideOut) {
15792
+ <co-product-configurator-selector-option-tile
15793
+ [option]="child"
15794
+ [tileClass]="'slide-out'"
15795
+ (selectionClicked)="selectionClicked(child)">
15607
15796
  </co-product-configurator-selector-option-tile>
15608
15797
  }
15609
15798
  </div>
@@ -15611,13 +15800,14 @@ class ProductConfiguratorSelectorOptionComponent {
15611
15800
  }
15612
15801
 
15613
15802
  @if (
15614
- this.selection.displayOptionControl === configurationDisplayOption.TileLarge ||
15615
- this.selection.displayOptionControl === configurationDisplayOption.TileSmall) {
15803
+ this.largeTileOptions.includes(this.selection.displayOptionControl)
15804
+ || this.smallTileOptions.includes(this.selection.displayOptionControl)) {
15616
15805
  @for (child of visibleAnswers; track child) {
15617
15806
  <div class="selector-option-wrapper" [class.active]="child.selected ==='F'">
15618
15807
  <co-product-configurator-selector-option-tile
15619
15808
  [option]="child"
15620
- [tileClass]="this.selection.displayOptionControl === configurationDisplayOption.TileLarge ? 'large' : 'small'"
15809
+ [noLabel]="this.selection.displayOptionControl === configurationDisplayOption.SmallCircle || this.selection.displayOptionControl === configurationDisplayOption.SmallSquare"
15810
+ [tileClass]="getTileClass()"
15621
15811
  (selectionClicked)="selectionClicked(child)"
15622
15812
  ></co-product-configurator-selector-option-tile>
15623
15813
  </div>
@@ -15625,18 +15815,16 @@ class ProductConfiguratorSelectorOptionComponent {
15625
15815
  }
15626
15816
 
15627
15817
  @if (this.selection.displayOptionControl === configurationDisplayOption.DropDown) {
15628
- @if (this.selection.displayOptionControl === configurationDisplayOption.DropDown) {
15629
- <co-product-configurator-selector-option-dropdown
15630
- [options]="listOfChoices"
15631
- (selectionClicked)="selectionClicked($event)"
15632
- ></co-product-configurator-selector-option-dropdown>
15633
- }
15818
+ <co-product-configurator-selector-option-dropdown
15819
+ [options]="listOfChoices"
15820
+ (selectionClicked)="selectionClicked($event)"
15821
+ ></co-product-configurator-selector-option-dropdown>
15634
15822
  }
15635
15823
  </div>
15636
15824
 
15637
15825
  @if (
15638
- this.selection.displayOptionControl === configurationDisplayOption.TileLarge ||
15639
- this.selection.displayOptionControl === configurationDisplayOption.TileSmall) {
15826
+ (this.largeTileOptions.includes(this.selection.displayOptionControl) ||
15827
+ this.smallTileOptions.includes(this.selection.displayOptionControl)) && groupedSubShow) {
15640
15828
  @if (!showAllTiles && remainingTilesCount > 0) {
15641
15829
  <div class="show-more-container">
15642
15830
  <span (click)="showMore()">
@@ -15653,7 +15841,7 @@ class ProductConfiguratorSelectorOptionComponent {
15653
15841
  }
15654
15842
  }
15655
15843
 
15656
- `, isInline: true, dependencies: [{ kind: "component", type: ProductConfiguratorSelectorOptionTileComponent, selector: "co-product-configurator-selector-option-tile", inputs: ["option", "tileClass"], outputs: ["selectionClicked"] }, { kind: "component", type: ProductConfiguratorOptionCheckboxComponent, selector: "co-product-configurator-option-checkbox", inputs: ["option"], outputs: ["selectionClicked"] }, { kind: "component", type: ProductConfiguratorSelectorOptionButtonComponent, selector: "co-product-configurator-selector-option-button", inputs: ["option"], outputs: ["selectionClicked"] }, { kind: "component", type: ProductConfiguratorSelectorOptionDropDownComponent, selector: "co-product-configurator-selector-option-dropdown", inputs: ["options", "tileClass"], outputs: ["selectionClicked"] }, { kind: "pipe", type: LocalizePipe, name: "localize" }], animations: [
15844
+ `, isInline: true, dependencies: [{ kind: "component", type: ProductConfiguratorSelectorOptionTileComponent, selector: "co-product-configurator-selector-option-tile", inputs: ["option", "tileClass", "noLabel"], outputs: ["selectionClicked"] }, { kind: "component", type: ProductConfiguratorOptionCheckboxComponent, selector: "co-product-configurator-option-checkbox", inputs: ["option"], outputs: ["selectionClicked"] }, { kind: "component", type: ProductConfiguratorSelectorOptionButtonComponent, selector: "co-product-configurator-selector-option-button", inputs: ["option"], outputs: ["selectionClicked"] }, { kind: "component", type: ProductConfiguratorSelectorOptionDropDownComponent, selector: "co-product-configurator-selector-option-dropdown", inputs: ["options", "tileClass"], outputs: ["selectionClicked"] }, { kind: "pipe", type: LocalizePipe, name: "localize" }], animations: [
15657
15845
  trigger('showSelections', [
15658
15846
  state('void', style({ 'transform': 'translateX(100%)', opacity: 0 })),
15659
15847
  state('*', style({ 'transform': 'translateX(0%)', opacity: 1 })),
@@ -15668,8 +15856,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15668
15856
  template: `
15669
15857
  <div class="selector-wrapper {{this.selectionClass}}">
15670
15858
  @if (this.selection.displayOptionControl !== configurationDisplayOption.DropDown
15671
- && this.selection.displayOptionControl !== configurationDisplayOption.TileLarge
15672
- && this.selection.displayOptionControl !== configurationDisplayOption.TileSmall) {
15859
+ && !this.largeTileOptions.includes(this.selection.displayOptionControl)
15860
+ && !this.smallTileOptions.includes(this.selection.displayOptionControl)) {
15673
15861
  @for (child of listOfChoices; track child) {
15674
15862
  <div class="selector-option-wrapper" [class.active]="child.selected ==='F'">
15675
15863
  @if (this.selection.displayOptionControl === configurationDisplayOption.Button) {
@@ -15691,18 +15879,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15691
15879
  (selectionClicked)="selectionClicked(child)">
15692
15880
  </co-product-configurator-selector-option-tile>
15693
15881
  }
15694
- @if (this.selection.displayOptionControl === configurationDisplayOption.Tab) {
15882
+ @if (this.selection.displayOptionControl === configurationDisplayOption.HorizontalTiles) {
15695
15883
  <co-product-configurator-selector-option-tile
15696
15884
  [option]="child"
15697
- [tileClass]="'small-rounded'"
15885
+ [tileClass]="'horizontal'"
15698
15886
  (selectionClicked)="selectionClicked(child)">
15699
15887
  </co-product-configurator-selector-option-tile>
15700
15888
  }
15701
- @if (this.selection.displayOptionControl === configurationDisplayOption.HorizontalTiles) {
15889
+ @if (this.selection.displayOptionControl === configurationDisplayOption.OnPage) {
15702
15890
  <co-product-configurator-selector-option-tile
15703
- [option]="child"
15704
- [tileClass]="'horizontal'"
15705
- (selectionClicked)="selectionClicked(child)">
15891
+ [option]="child"
15892
+ [tileClass]="'on-page'"
15893
+ (selectionClicked)="selectionClicked(child)">
15894
+ </co-product-configurator-selector-option-tile>
15895
+ }
15896
+ @if (this.selection.displayOptionControl === configurationDisplayOption.SlideOut) {
15897
+ <co-product-configurator-selector-option-tile
15898
+ [option]="child"
15899
+ [tileClass]="'slide-out'"
15900
+ (selectionClicked)="selectionClicked(child)">
15706
15901
  </co-product-configurator-selector-option-tile>
15707
15902
  }
15708
15903
  </div>
@@ -15710,13 +15905,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15710
15905
  }
15711
15906
 
15712
15907
  @if (
15713
- this.selection.displayOptionControl === configurationDisplayOption.TileLarge ||
15714
- this.selection.displayOptionControl === configurationDisplayOption.TileSmall) {
15908
+ this.largeTileOptions.includes(this.selection.displayOptionControl)
15909
+ || this.smallTileOptions.includes(this.selection.displayOptionControl)) {
15715
15910
  @for (child of visibleAnswers; track child) {
15716
15911
  <div class="selector-option-wrapper" [class.active]="child.selected ==='F'">
15717
15912
  <co-product-configurator-selector-option-tile
15718
15913
  [option]="child"
15719
- [tileClass]="this.selection.displayOptionControl === configurationDisplayOption.TileLarge ? 'large' : 'small'"
15914
+ [noLabel]="this.selection.displayOptionControl === configurationDisplayOption.SmallCircle || this.selection.displayOptionControl === configurationDisplayOption.SmallSquare"
15915
+ [tileClass]="getTileClass()"
15720
15916
  (selectionClicked)="selectionClicked(child)"
15721
15917
  ></co-product-configurator-selector-option-tile>
15722
15918
  </div>
@@ -15724,18 +15920,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15724
15920
  }
15725
15921
 
15726
15922
  @if (this.selection.displayOptionControl === configurationDisplayOption.DropDown) {
15727
- @if (this.selection.displayOptionControl === configurationDisplayOption.DropDown) {
15728
- <co-product-configurator-selector-option-dropdown
15729
- [options]="listOfChoices"
15730
- (selectionClicked)="selectionClicked($event)"
15731
- ></co-product-configurator-selector-option-dropdown>
15732
- }
15923
+ <co-product-configurator-selector-option-dropdown
15924
+ [options]="listOfChoices"
15925
+ (selectionClicked)="selectionClicked($event)"
15926
+ ></co-product-configurator-selector-option-dropdown>
15733
15927
  }
15734
15928
  </div>
15735
15929
 
15736
15930
  @if (
15737
- this.selection.displayOptionControl === configurationDisplayOption.TileLarge ||
15738
- this.selection.displayOptionControl === configurationDisplayOption.TileSmall) {
15931
+ (this.largeTileOptions.includes(this.selection.displayOptionControl) ||
15932
+ this.smallTileOptions.includes(this.selection.displayOptionControl)) && groupedSubShow) {
15739
15933
  @if (!showAllTiles && remainingTilesCount > 0) {
15740
15934
  <div class="show-more-container">
15741
15935
  <span (click)="showMore()">
@@ -15772,25 +15966,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15772
15966
  type: Input
15773
15967
  }], markAsException: [{
15774
15968
  type: Input
15969
+ }], showGlobalAll: [{
15970
+ type: Input
15971
+ }], groupedSubShow: [{
15972
+ type: Input
15775
15973
  }] } });
15776
15974
 
15777
15975
  class ProductConfiguratorSelectorComponent {
15778
15976
  configuratorConnectorService;
15779
15977
  settingsService;
15780
15978
  iconService;
15781
- showClass() {
15782
- return true;
15783
- }
15784
- icons = IconEnum;
15785
- exceptionContainer;
15786
15979
  get hostClasses() {
15787
- const classes = [];
15788
- classes.push(`treelevel-${this.treeLevelIndex}`);
15789
- if (this.treeLevelIndex === 2 && !this.isActive) {
15790
- classes.push('hidden');
15980
+ const classes = [
15981
+ 'co-product-configurator-selector',
15982
+ `treelevel-${this.treeLevelIndex}`
15983
+ ];
15984
+ if (!this._shouldBeVisible()) {
15985
+ classes.push('hidden-frontend');
15791
15986
  }
15792
15987
  return classes.join(' ');
15793
15988
  }
15989
+ icons = IconEnum;
15990
+ exceptionContainer;
15794
15991
  selection;
15795
15992
  options;
15796
15993
  lastNodeWithChildren;
@@ -15798,13 +15995,37 @@ class ProductConfiguratorSelectorComponent {
15798
15995
  treeLevelIndex = 1;
15799
15996
  isActive = true;
15800
15997
  markAsException = false;
15998
+ showAll = false;
15999
+ suppressSubShowMore = false;
16000
+ useGroupedParentVisibility = false;
15801
16001
  activate = new EventEmitter();
15802
- get selectionIndexText() {
15803
- return this.selectionIndex + '. ';
15804
- }
15805
16002
  selectionClass = '';
15806
16003
  listOfChoices = [];
15807
16004
  activeChildIndex = 0;
16005
+ localShowAll = false;
16006
+ get selectionIndexText() {
16007
+ return this.selectionIndex + '. ';
16008
+ }
16009
+ get expandButtonText() {
16010
+ if (this.getChildShowAll()) {
16011
+ return 'VIEW_LESS';
16012
+ }
16013
+ return this.groupedRemainingTilesCount > 0
16014
+ ? `SHOW_ALL`
16015
+ : 'SHOW_ALL';
16016
+ }
16017
+ get suppressSubShowMoreForChildren() {
16018
+ return this.suppressSubShowMore || this.isGroupedSection();
16019
+ }
16020
+ get groupedRemainingTilesCount() {
16021
+ if (!this.isGroupedSection() || this.getChildShowAll()) {
16022
+ return 0;
16023
+ }
16024
+ return this._countGroupedTilesToReveal(this.options);
16025
+ }
16026
+ get useGroupedVisibilityForChildren() {
16027
+ return this.useGroupedParentVisibility || this.isGroupedSection();
16028
+ }
15808
16029
  constructor(configuratorConnectorService, settingsService, iconService) {
15809
16030
  this.configuratorConnectorService = configuratorConnectorService;
15810
16031
  this.settingsService = settingsService;
@@ -15826,6 +16047,15 @@ class ProductConfiguratorSelectorComponent {
15826
16047
  if (this.markAsException) {
15827
16048
  this.showAndScroll();
15828
16049
  }
16050
+ this._setActiveChildIndexFromSelection();
16051
+ }
16052
+ ngOnChanges(changes) {
16053
+ if (changes.options && !changes.options.firstChange) {
16054
+ this._setActiveChildIndexFromSelection();
16055
+ }
16056
+ if (changes.showAll && !changes.showAll.firstChange) {
16057
+ this._setActiveChildIndexFromSelection();
16058
+ }
15829
16059
  }
15830
16060
  showAndScroll() {
15831
16061
  setTimeout(() => {
@@ -15835,8 +16065,128 @@ class ProductConfiguratorSelectorComponent {
15835
16065
  onSubHeaderClick() {
15836
16066
  this.activate.emit();
15837
16067
  }
16068
+ onShowAllClick() {
16069
+ this.localShowAll = !this.localShowAll;
16070
+ }
16071
+ getIsChildVisible(index) {
16072
+ if (!this.useGroupedVisibilityForChildren) {
16073
+ return true;
16074
+ }
16075
+ if (this.getChildShowAll()) {
16076
+ return true;
16077
+ }
16078
+ return index === this.activeChildIndex;
16079
+ }
16080
+ isGroupedSection() {
16081
+ return this.treeLevelIndex === 1
16082
+ && !this.lastNodeWithChildren
16083
+ && this.settingsService.settings.options.groupedShowAllBtn
16084
+ && Array.isArray(this.options)
16085
+ && this.options.length > 1;
16086
+ }
16087
+ shouldShowExpandButton() {
16088
+ return this.isGroupedSection();
16089
+ }
16090
+ getChildShowAll() {
16091
+ return this.showAll || this.localShowAll;
16092
+ }
16093
+ _shouldBeVisible() {
16094
+ if (!this.useGroupedVisibilityForChildren) {
16095
+ return true;
16096
+ }
16097
+ if (this.getChildShowAll()) {
16098
+ return true;
16099
+ }
16100
+ return this.isActive;
16101
+ }
16102
+ _setActiveChildIndexFromSelection() {
16103
+ if (!Array.isArray(this.options) || this.options.length === 0) {
16104
+ this.activeChildIndex = 0;
16105
+ return;
16106
+ }
16107
+ const selectedIndex = this.options.findIndex(option => this._hasSelectedOption(option));
16108
+ this.activeChildIndex = selectedIndex >= 0 ? selectedIndex : 0;
16109
+ }
16110
+ _hasSelectedOption(option) {
16111
+ if (!option) {
16112
+ return false;
16113
+ }
16114
+ if (option.selector && option.selector.selected === 'F') {
16115
+ return true;
16116
+ }
16117
+ if (!Array.isArray(option.selectorOptions) || option.selectorOptions.length === 0) {
16118
+ return false;
16119
+ }
16120
+ return option.selectorOptions.some(childOption => this._hasSelectedOption(childOption));
16121
+ }
16122
+ _countRemainingTiles(options) {
16123
+ if (!Array.isArray(options) || options.length === 0) {
16124
+ return 0;
16125
+ }
16126
+ let total = 0;
16127
+ for (const option of options) {
16128
+ if (!option) {
16129
+ continue;
16130
+ }
16131
+ if (option.lastNodeWithChildren) {
16132
+ total += this._remainingTilesForLeaf(option);
16133
+ }
16134
+ else if (Array.isArray(option.selectorOptions)) {
16135
+ total += this._countRemainingTiles(option.selectorOptions);
16136
+ }
16137
+ }
16138
+ return total;
16139
+ }
16140
+ _countGroupedTilesToReveal(options) {
16141
+ if (!Array.isArray(options) || options.length === 0) {
16142
+ return 0;
16143
+ }
16144
+ let total = 0;
16145
+ options.forEach((option, index) => {
16146
+ if (index === this.activeChildIndex) {
16147
+ total += this._countRemainingTiles([option]);
16148
+ }
16149
+ else {
16150
+ total += this._countAllTiles(option);
16151
+ }
16152
+ });
16153
+ return total;
16154
+ }
16155
+ _countAllTiles(option) {
16156
+ if (!option) {
16157
+ return 0;
16158
+ }
16159
+ if (option.lastNodeWithChildren) {
16160
+ return Array.isArray(option.selectorOptions)
16161
+ ? option.selectorOptions.length
16162
+ : 0;
16163
+ }
16164
+ if (!Array.isArray(option.selectorOptions)) {
16165
+ return 0;
16166
+ }
16167
+ return option.selectorOptions.reduce((total, childOption) => total + this._countAllTiles(childOption), 0);
16168
+ }
16169
+ _remainingTilesForLeaf(option) {
16170
+ if (!option?.selectorOptions || !option.selector) {
16171
+ return 0;
16172
+ }
16173
+ const displayOption = option.selector.displayOptionControl;
16174
+ const count = option.selectorOptions.length;
16175
+ if (displayOption === ConfigurationDisplayOption.TileLarge
16176
+ || displayOption === ConfigurationDisplayOption.TileRounded) {
16177
+ const maxVisibleTiles = this.settingsService?.settings?.options?.maxVisibleTiles ?? 10;
16178
+ return Math.max(0, count - maxVisibleTiles);
16179
+ }
16180
+ if (displayOption === ConfigurationDisplayOption.TileSmall
16181
+ || displayOption === ConfigurationDisplayOption.SmallCircle
16182
+ || displayOption === ConfigurationDisplayOption.SmallSquare) {
16183
+ const maxVisibleSmallTiles = this.settingsService?.settings?.options?.maxVisibleSmallTiles ?? 24;
16184
+ return Math.max(0, count - maxVisibleSmallTiles);
16185
+ }
16186
+ return 0;
16187
+ }
15838
16188
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorComponent, deps: [{ token: ConfiguratorConnectorService }, { token: SettingsService }, { token: IconCacheService }], target: i0.ɵɵFactoryTarget.Component });
15839
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ProductConfiguratorSelectorComponent, isStandalone: false, selector: "co-product-configurator-selector", inputs: { selection: "selection", options: "options", lastNodeWithChildren: "lastNodeWithChildren", selectionIndex: "selectionIndex", treeLevelIndex: "treeLevelIndex", isActive: "isActive", markAsException: "markAsException" }, outputs: { activate: "activate" }, host: { properties: { "class.co-product-configurator-selector": "this.showClass", "class": "this.hostClasses" } }, viewQueries: [{ propertyName: "exceptionContainer", first: true, predicate: ["exceptionContainer"], descendants: true }], ngImport: i0, template: `
16189
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ProductConfiguratorSelectorComponent, isStandalone: false, selector: "co-product-configurator-selector", inputs: { selection: "selection", options: "options", lastNodeWithChildren: "lastNodeWithChildren", selectionIndex: "selectionIndex", treeLevelIndex: "treeLevelIndex", isActive: "isActive", markAsException: "markAsException", showAll: "showAll", suppressSubShowMore: "suppressSubShowMore", useGroupedParentVisibility: "useGroupedParentVisibility" }, outputs: { activate: "activate" }, host: { properties: { "class": "this.hostClasses" } }, viewQueries: [{ propertyName: "exceptionContainer", first: true, predicate: ["exceptionContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
15840
16190
  <div class="selector-container">
15841
16191
  <!--
15842
16192
  Based on the threeLevel and the length op options we got a couple of flavours
@@ -15885,7 +16235,9 @@ class ProductConfiguratorSelectorComponent {
15885
16235
  <co-product-configurator-selector-option
15886
16236
  [selection]="selection"
15887
16237
  [listOfChoices]="listOfChoices"
15888
- [markAsException]="markAsException">
16238
+ [groupedSubShow]="!suppressSubShowMoreForChildren"
16239
+ [markAsException]="markAsException"
16240
+ [showGlobalAll]="getChildShowAll()">
15889
16241
  </co-product-configurator-selector-option>
15890
16242
  }
15891
16243
  </div>
@@ -15898,13 +16250,29 @@ class ProductConfiguratorSelectorComponent {
15898
16250
  [lastNodeWithChildren]="displaySelection.lastNodeWithChildren"
15899
16251
  [selectionIndex]="index + 1"
15900
16252
  [treeLevelIndex]="treeLevelIndex + 1"
15901
- [isActive]="treeLevelIndex !== 1 || index === activeChildIndex"
16253
+ [showAll]="getChildShowAll()"
16254
+ [isActive]="getIsChildVisible(index)"
16255
+ [suppressSubShowMore]="suppressSubShowMoreForChildren"
16256
+ [useGroupedParentVisibility]="useGroupedVisibilityForChildren"
15902
16257
  [markAsException]="displaySelection.markForExceptionNotification"
15903
16258
  (activate)="activeChildIndex = index">
15904
16259
  </co-product-configurator-selector>
15905
16260
  }
15906
16261
  }
15907
- `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: ProductConfiguratorSelectorOptionComponent, selector: "co-product-configurator-selector-option", inputs: ["selection", "listOfChoices", "markAsException"] }, { kind: "component", type: ProductConfiguratorSelectorComponent, selector: "co-product-configurator-selector", inputs: ["selection", "options", "lastNodeWithChildren", "selectionIndex", "treeLevelIndex", "isActive", "markAsException"], outputs: ["activate"] }, { kind: "pipe", type: LocalizePipe, name: "localize" }, { kind: "pipe", type: GoogleTranslatePipe, name: "googleTranslate" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }], animations: [
16262
+ @if (shouldShowExpandButton()) {
16263
+ <div class="show-more-container" (click)="onShowAllClick()">
16264
+ <span class="show-all-button show-more-text-link"
16265
+ [textContent]="expandButtonText | localize">
16266
+ </span>
16267
+
16268
+ @if (this.groupedRemainingTilesCount > 0) {
16269
+ <span class="show-all-button show-more-text-link counter"
16270
+ [textContent]="'(' + this.groupedRemainingTilesCount + ')'">
16271
+ </span>
16272
+ }
16273
+ </div>
16274
+ }
16275
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: ProductConfiguratorSelectorOptionComponent, selector: "co-product-configurator-selector-option", inputs: ["selection", "listOfChoices", "markAsException", "showGlobalAll", "groupedSubShow"] }, { kind: "component", type: ProductConfiguratorSelectorComponent, selector: "co-product-configurator-selector", inputs: ["selection", "options", "lastNodeWithChildren", "selectionIndex", "treeLevelIndex", "isActive", "markAsException", "showAll", "suppressSubShowMore", "useGroupedParentVisibility"], outputs: ["activate"] }, { kind: "pipe", type: LocalizePipe, name: "localize" }, { kind: "pipe", type: GoogleTranslatePipe, name: "googleTranslate" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }], animations: [
15908
16276
  trigger('showSelections', [
15909
16277
  state('void', style({ 'transform': 'translateX(100%)', opacity: 0 })),
15910
16278
  state('*', style({ 'transform': 'translateX(0%)', opacity: 1 })),
@@ -15965,7 +16333,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15965
16333
  <co-product-configurator-selector-option
15966
16334
  [selection]="selection"
15967
16335
  [listOfChoices]="listOfChoices"
15968
- [markAsException]="markAsException">
16336
+ [groupedSubShow]="!suppressSubShowMoreForChildren"
16337
+ [markAsException]="markAsException"
16338
+ [showGlobalAll]="getChildShowAll()">
15969
16339
  </co-product-configurator-selector-option>
15970
16340
  }
15971
16341
  </div>
@@ -15978,12 +16348,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15978
16348
  [lastNodeWithChildren]="displaySelection.lastNodeWithChildren"
15979
16349
  [selectionIndex]="index + 1"
15980
16350
  [treeLevelIndex]="treeLevelIndex + 1"
15981
- [isActive]="treeLevelIndex !== 1 || index === activeChildIndex"
16351
+ [showAll]="getChildShowAll()"
16352
+ [isActive]="getIsChildVisible(index)"
16353
+ [suppressSubShowMore]="suppressSubShowMoreForChildren"
16354
+ [useGroupedParentVisibility]="useGroupedVisibilityForChildren"
15982
16355
  [markAsException]="displaySelection.markForExceptionNotification"
15983
16356
  (activate)="activeChildIndex = index">
15984
16357
  </co-product-configurator-selector>
15985
16358
  }
15986
16359
  }
16360
+ @if (shouldShowExpandButton()) {
16361
+ <div class="show-more-container" (click)="onShowAllClick()">
16362
+ <span class="show-all-button show-more-text-link"
16363
+ [textContent]="expandButtonText | localize">
16364
+ </span>
16365
+
16366
+ @if (this.groupedRemainingTilesCount > 0) {
16367
+ <span class="show-all-button show-more-text-link counter"
16368
+ [textContent]="'(' + this.groupedRemainingTilesCount + ')'">
16369
+ </span>
16370
+ }
16371
+ </div>
16372
+ }
15987
16373
  `,
15988
16374
  encapsulation: ViewEncapsulation.None,
15989
16375
  animations: [
@@ -15995,15 +16381,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15995
16381
  ],
15996
16382
  standalone: false
15997
16383
  }]
15998
- }], ctorParameters: () => [{ type: ConfiguratorConnectorService }, { type: SettingsService }, { type: IconCacheService }], propDecorators: { showClass: [{
16384
+ }], ctorParameters: () => [{ type: ConfiguratorConnectorService }, { type: SettingsService }, { type: IconCacheService }], propDecorators: { hostClasses: [{
15999
16385
  type: HostBinding,
16000
- args: ['class.co-product-configurator-selector']
16386
+ args: ['class']
16001
16387
  }], exceptionContainer: [{
16002
16388
  type: ViewChild,
16003
16389
  args: ['exceptionContainer']
16004
- }], hostClasses: [{
16005
- type: HostBinding,
16006
- args: ['class']
16007
16390
  }], selection: [{
16008
16391
  type: Input
16009
16392
  }], options: [{
@@ -16018,6 +16401,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
16018
16401
  type: Input
16019
16402
  }], markAsException: [{
16020
16403
  type: Input
16404
+ }], showAll: [{
16405
+ type: Input
16406
+ }], suppressSubShowMore: [{
16407
+ type: Input
16408
+ }], useGroupedParentVisibility: [{
16409
+ type: Input
16021
16410
  }], activate: [{
16022
16411
  type: Output
16023
16412
  }] } });
@@ -16050,6 +16439,7 @@ class ProductConfiguratorComponent {
16050
16439
  showLabel = true;
16051
16440
  canClose = true;
16052
16441
  customDimensions = false;
16442
+ showSaveAndLoadConfiguration;
16053
16443
  showChange = new EventEmitter();
16054
16444
  answerChosen = new EventEmitter();
16055
16445
  valutaSymbol = '€'; // TODO this should be a setting
@@ -16103,7 +16493,7 @@ class ProductConfiguratorComponent {
16103
16493
  this.showChange.emit(false);
16104
16494
  }
16105
16495
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorComponent, deps: [{ token: ConfiguratorConnectorService }, { token: SwitchBuildFurnitureService }, { token: SettingsService }, { token: ProductConfiguratorService }, { token: IconCacheService }, { token: i1.DomSanitizer }, { token: ConfiguringService }], target: i0.ɵɵFactoryTarget.Component });
16106
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ProductConfiguratorComponent, isStandalone: false, selector: "co-product-configurator", inputs: { show: "show", showHeaderInformation: "showHeaderInformation", showSelections: "showSelections", showLabel: "showLabel", canClose: "canClose", customDimensions: "customDimensions" }, outputs: { showChange: "showChange", answerChosen: "answerChosen" }, host: { properties: { "class.co-product-configurator": "this.showClass" } }, ngImport: i0, template: `
16496
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ProductConfiguratorComponent, isStandalone: false, selector: "co-product-configurator", inputs: { show: "show", showHeaderInformation: "showHeaderInformation", showSelections: "showSelections", showLabel: "showLabel", canClose: "canClose", customDimensions: "customDimensions", showSaveAndLoadConfiguration: "showSaveAndLoadConfiguration" }, outputs: { showChange: "showChange", answerChosen: "answerChosen" }, host: { properties: { "class.co-product-configurator": "this.showClass" } }, ngImport: i0, template: `
16107
16497
  @if (show) {
16108
16498
  <div class="product-configurator-container">
16109
16499
  @if (showHeaderInformation) {
@@ -16112,11 +16502,16 @@ class ProductConfiguratorComponent {
16112
16502
  <h2 class="product-configurator-header-text" [textContent]="article.name"></h2>
16113
16503
  <p class="product-configurator-text" [innerHTML]="safeDescription"></p>
16114
16504
  </div>
16115
- @if (canClose) {
16116
- <div class="product-configurator-close" (click)="handleCloseClick()">
16117
- <co-icon [iconData]="iconService.getIcon(icons.Cross)"></co-icon>
16118
- </div>
16119
- }
16505
+ <div class="product-configurator-header-actions">
16506
+ @if (showSaveAndLoadConfiguration) {
16507
+ <co-configuration-preset></co-configuration-preset>
16508
+ }
16509
+ @if (canClose) {
16510
+ <div class="product-configurator-close" (click)="handleCloseClick()">
16511
+ <co-icon [iconData]="iconService.getIcon(icons.XmarkLightFull)"></co-icon>
16512
+ </div>
16513
+ }
16514
+ </div>
16120
16515
  </div>
16121
16516
  }
16122
16517
  <div class="product-configurator-details" #scrollcontainer>
@@ -16144,7 +16539,7 @@ class ProductConfiguratorComponent {
16144
16539
  }
16145
16540
  </div>
16146
16541
  }
16147
- `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: ProductConfiguratorSelectorComponent, selector: "co-product-configurator-selector", inputs: ["selection", "options", "lastNodeWithChildren", "selectionIndex", "treeLevelIndex", "isActive", "markAsException"], outputs: ["activate"] }, { kind: "pipe", type: i4.PriceDisplayPipe, name: "priceDisplay" }, { kind: "pipe", type: LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
16542
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: ProductConfiguratorSelectorComponent, selector: "co-product-configurator-selector", inputs: ["selection", "options", "lastNodeWithChildren", "selectionIndex", "treeLevelIndex", "isActive", "markAsException", "showAll", "suppressSubShowMore", "useGroupedParentVisibility"], outputs: ["activate"] }, { kind: "component", type: ConfigurationPresetComponent, selector: "co-configuration-preset" }, { kind: "pipe", type: i4.PriceDisplayPipe, name: "priceDisplay" }, { kind: "pipe", type: LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
16148
16543
  }
16149
16544
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorComponent, decorators: [{
16150
16545
  type: Component,
@@ -16159,11 +16554,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
16159
16554
  <h2 class="product-configurator-header-text" [textContent]="article.name"></h2>
16160
16555
  <p class="product-configurator-text" [innerHTML]="safeDescription"></p>
16161
16556
  </div>
16162
- @if (canClose) {
16163
- <div class="product-configurator-close" (click)="handleCloseClick()">
16164
- <co-icon [iconData]="iconService.getIcon(icons.Cross)"></co-icon>
16165
- </div>
16166
- }
16557
+ <div class="product-configurator-header-actions">
16558
+ @if (showSaveAndLoadConfiguration) {
16559
+ <co-configuration-preset></co-configuration-preset>
16560
+ }
16561
+ @if (canClose) {
16562
+ <div class="product-configurator-close" (click)="handleCloseClick()">
16563
+ <co-icon [iconData]="iconService.getIcon(icons.XmarkLightFull)"></co-icon>
16564
+ </div>
16565
+ }
16566
+ </div>
16167
16567
  </div>
16168
16568
  }
16169
16569
  <div class="product-configurator-details" #scrollcontainer>
@@ -16210,12 +16610,225 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
16210
16610
  type: Input
16211
16611
  }], customDimensions: [{
16212
16612
  type: Input
16613
+ }], showSaveAndLoadConfiguration: [{
16614
+ type: Input
16213
16615
  }], showChange: [{
16214
16616
  type: Output
16215
16617
  }], answerChosen: [{
16216
16618
  type: Output
16217
16619
  }] } });
16218
16620
 
16621
+ class ConfigurationPresetDialogComponent {
16622
+ iconService;
16623
+ _configuringService;
16624
+ _configuratorConnectorService;
16625
+ _dictionaryService;
16626
+ _appEventService;
16627
+ icons = IconEnum;
16628
+ presetDialogMode = PresetDialogMode;
16629
+ showClass() {
16630
+ return true;
16631
+ }
16632
+ showDialog = false;
16633
+ instanceIdInput;
16634
+ dialogMode = PresetDialogMode.SAVE;
16635
+ showValidationErrors = false;
16636
+ validationError;
16637
+ _subs = [];
16638
+ constructor(iconService, _configuringService, _configuratorConnectorService, _dictionaryService, _appEventService) {
16639
+ this.iconService = iconService;
16640
+ this._configuringService = _configuringService;
16641
+ this._configuratorConnectorService = _configuratorConnectorService;
16642
+ this._dictionaryService = _dictionaryService;
16643
+ this._appEventService = _appEventService;
16644
+ this._subs.push(this._appEventService.changeConfigurationPresetDialogMode.subscribe((mode) => {
16645
+ this.handleOpenDialog(mode);
16646
+ }));
16647
+ }
16648
+ ngOnDestroy() {
16649
+ this._subs.forEach((sub) => sub.unsubscribe());
16650
+ }
16651
+ handleOpenDialog(mode) {
16652
+ if (mode === PresetDialogMode.SAVE) {
16653
+ const instanceId = this._configuringService.buildResult.instanceId;
16654
+ this._configuratorConnectorService.storePreset(instanceId).then((response) => {
16655
+ if (response && response.validationResult && response.validationResult.success) {
16656
+ this.instanceIdInput = response.resultObject;
16657
+ this.dialogMode = mode;
16658
+ this.showDialog = true;
16659
+ }
16660
+ });
16661
+ }
16662
+ else if (mode === PresetDialogMode.LOAD) {
16663
+ this.dialogMode = mode;
16664
+ this.showDialog = true;
16665
+ }
16666
+ }
16667
+ handleCloseClick() {
16668
+ this.showDialog = false;
16669
+ }
16670
+ handleCopySuccess() {
16671
+ this.instanceIdInput = this._dictionaryService.get('COPIED');
16672
+ }
16673
+ loadConfiguration() {
16674
+ const goodId = +this._configuringService.buildResult.goodId;
16675
+ this._configuratorConnectorService.initForPreset(this.instanceIdInput, goodId).then((response) => {
16676
+ if (response && response.validationResult && response.validationResult.success) {
16677
+ this.showDialog = false;
16678
+ const resultObject = this._configuringService.buildResult;
16679
+ resultObject.instanceId = response.resultObject;
16680
+ this._configuringService.configure(resultObject);
16681
+ }
16682
+ else {
16683
+ // error, shit not found
16684
+ if (response.validationResult && response.validationResult.messages && response.validationResult.messages.length > 0) {
16685
+ const firstMessage = response.validationResult.messages[0].message;
16686
+ this.showValidationErrors = true;
16687
+ this.validationError = firstMessage;
16688
+ }
16689
+ }
16690
+ });
16691
+ }
16692
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetDialogComponent, deps: [{ token: IconCacheService }, { token: ConfiguringService }, { token: ConfiguratorConnectorService }, { token: DictionaryService }, { token: AppEventService }], target: i0.ɵɵFactoryTarget.Component });
16693
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ConfigurationPresetDialogComponent, isStandalone: false, selector: "co-configuration-preset-dialog", host: { properties: { "class.co-configuration-preset-dialog": "this.showClass" } }, ngImport: i0, template: `
16694
+ @if (showDialog) {
16695
+ <div class="configuration-preset-dialog">
16696
+ <div class="configuration-preset-dialog-container">
16697
+ <div class="configuration-preset-dialog-container-header">
16698
+ @if (dialogMode === presetDialogMode.SAVE) {
16699
+ <co-icon [iconData]="iconService.getIcon(icons.FloppyDiskLightFull)"></co-icon>
16700
+ <h3 [textContent]="'SAVE_CONFIGURATION' | localize"></h3>
16701
+ } @else if (dialogMode === presetDialogMode.LOAD) {
16702
+ <co-icon [iconData]="iconService.getIcon(icons.FolderOpenLightFull)"></co-icon>
16703
+ <h3 [textContent]="'LOAD_CONFIGURATION' | localize"></h3>
16704
+ }
16705
+ </div>
16706
+ <div class="configuration-preset-dialog-container-body">
16707
+ @if (dialogMode === presetDialogMode.SAVE) {
16708
+ <div class="save-success">
16709
+ <p class="save-success-text" [textContent]="instanceIdInput"></p>
16710
+ <co-button
16711
+ class="save-success-button"
16712
+ [cdkCopyToClipboard]="instanceIdInput"
16713
+ [iconData]="iconService.getIcon(icons.CopyRegularFull)"
16714
+ (onClick)="handleCopySuccess()">
16715
+ </co-button>
16716
+ </div>
16717
+ } @else if (dialogMode === presetDialogMode.LOAD) {
16718
+ <co-input-text
16719
+ [placeholder]="'CONFIGURATION_CODE' | localize"
16720
+ [(model)]="instanceIdInput"
16721
+ ></co-input-text>
16722
+
16723
+ @if (showValidationErrors) {
16724
+ <div class="validation-error">
16725
+ <p [textContent]="validationError"></p>
16726
+ </div>
16727
+ }
16728
+ }
16729
+ </div>
16730
+ <div class="configuration-preset-dialog-container-footer">
16731
+ @if (dialogMode === presetDialogMode.LOAD) {
16732
+ <co-button
16733
+ class="button-as-link"
16734
+ [label]="'CANCEL' | localize"
16735
+ (onClick)="handleCloseClick()"
16736
+ ></co-button>
16737
+ }
16738
+ @if (dialogMode === presetDialogMode.SAVE) {
16739
+ <co-button
16740
+ class="save-preset-button"
16741
+ [label]="'OK' | localize"
16742
+ (onClick)="handleCloseClick()">
16743
+ </co-button>
16744
+ } @else if (dialogMode === presetDialogMode.LOAD) {
16745
+ <co-button
16746
+ class="open-preset-button"
16747
+ [label]="'OPEN' | localize"
16748
+ (onClick)="loadConfiguration()">
16749
+ </co-button>
16750
+ }
16751
+ </div>
16752
+ </div>
16753
+ </div>
16754
+ }
16755
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.ButtonComponent, selector: "co-button", inputs: ["label", "iconData", "iconDataRight", "isToggleButton", "isToggled", "hidden", "disabled"], outputs: ["onClick", "clickedWhileDisabled", "isToggledChange"] }, { kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: i4.InputTextComponent, selector: "co-input-text", inputs: ["useContent", "placeholder", "align", "type", "formatPipe", "min", "max", "pattern", "digitsOnly", "excludePlusMinus", "showClearButton", "keyDownWhiteList", "showPlaceholderOnFocus", "leftIcon", "rightIcon", "leftIconData", "rightIconData", "selectOnFocus", "emptyPlace", "firstDayOfWeek", "noStyle", "hideArrowButtons", "model"], outputs: ["leftIconClick", "leftIconMouseDown", "leftIconMouseUp", "rightIconClick", "rightIconMouseDown", "rightIconMouseUp", "clearIconClick", "isFocused"] }, { kind: "directive", type: i7.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "pipe", type: LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
16756
+ }
16757
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetDialogComponent, decorators: [{
16758
+ type: Component,
16759
+ args: [{
16760
+ selector: 'co-configuration-preset-dialog',
16761
+ template: `
16762
+ @if (showDialog) {
16763
+ <div class="configuration-preset-dialog">
16764
+ <div class="configuration-preset-dialog-container">
16765
+ <div class="configuration-preset-dialog-container-header">
16766
+ @if (dialogMode === presetDialogMode.SAVE) {
16767
+ <co-icon [iconData]="iconService.getIcon(icons.FloppyDiskLightFull)"></co-icon>
16768
+ <h3 [textContent]="'SAVE_CONFIGURATION' | localize"></h3>
16769
+ } @else if (dialogMode === presetDialogMode.LOAD) {
16770
+ <co-icon [iconData]="iconService.getIcon(icons.FolderOpenLightFull)"></co-icon>
16771
+ <h3 [textContent]="'LOAD_CONFIGURATION' | localize"></h3>
16772
+ }
16773
+ </div>
16774
+ <div class="configuration-preset-dialog-container-body">
16775
+ @if (dialogMode === presetDialogMode.SAVE) {
16776
+ <div class="save-success">
16777
+ <p class="save-success-text" [textContent]="instanceIdInput"></p>
16778
+ <co-button
16779
+ class="save-success-button"
16780
+ [cdkCopyToClipboard]="instanceIdInput"
16781
+ [iconData]="iconService.getIcon(icons.CopyRegularFull)"
16782
+ (onClick)="handleCopySuccess()">
16783
+ </co-button>
16784
+ </div>
16785
+ } @else if (dialogMode === presetDialogMode.LOAD) {
16786
+ <co-input-text
16787
+ [placeholder]="'CONFIGURATION_CODE' | localize"
16788
+ [(model)]="instanceIdInput"
16789
+ ></co-input-text>
16790
+
16791
+ @if (showValidationErrors) {
16792
+ <div class="validation-error">
16793
+ <p [textContent]="validationError"></p>
16794
+ </div>
16795
+ }
16796
+ }
16797
+ </div>
16798
+ <div class="configuration-preset-dialog-container-footer">
16799
+ @if (dialogMode === presetDialogMode.LOAD) {
16800
+ <co-button
16801
+ class="button-as-link"
16802
+ [label]="'CANCEL' | localize"
16803
+ (onClick)="handleCloseClick()"
16804
+ ></co-button>
16805
+ }
16806
+ @if (dialogMode === presetDialogMode.SAVE) {
16807
+ <co-button
16808
+ class="save-preset-button"
16809
+ [label]="'OK' | localize"
16810
+ (onClick)="handleCloseClick()">
16811
+ </co-button>
16812
+ } @else if (dialogMode === presetDialogMode.LOAD) {
16813
+ <co-button
16814
+ class="open-preset-button"
16815
+ [label]="'OPEN' | localize"
16816
+ (onClick)="loadConfiguration()">
16817
+ </co-button>
16818
+ }
16819
+ </div>
16820
+ </div>
16821
+ </div>
16822
+ }
16823
+ `,
16824
+ encapsulation: ViewEncapsulation.None,
16825
+ standalone: false
16826
+ }]
16827
+ }], ctorParameters: () => [{ type: IconCacheService }, { type: ConfiguringService }, { type: ConfiguratorConnectorService }, { type: DictionaryService }, { type: AppEventService }], propDecorators: { showClass: [{
16828
+ type: HostBinding,
16829
+ args: ['class.co-configuration-preset-dialog']
16830
+ }] } });
16831
+
16219
16832
  class ThreedselectorComponent {
16220
16833
  _appEventService;
16221
16834
  _buildFurnitureService;
@@ -16229,6 +16842,7 @@ class ThreedselectorComponent {
16229
16842
  canCloseConfigurator = true;
16230
16843
  animateSlideout = true;
16231
16844
  showHeaderInformation = true;
16845
+ showSaveAndLoadConfiguration;
16232
16846
  buildFinished = new EventEmitter();
16233
16847
  showChange = new EventEmitter();
16234
16848
  showElementToolbar = false;
@@ -16291,29 +16905,34 @@ class ThreedselectorComponent {
16291
16905
  }
16292
16906
  }
16293
16907
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ThreedselectorComponent, deps: [{ token: AppEventService }, { token: SwitchBuildFurnitureService }, { token: ConfiguringService }, { token: ConfiguratorService }], target: i0.ɵɵFactoryTarget.Component });
16294
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ThreedselectorComponent, isStandalone: false, selector: "co-threedselector", inputs: { selections: "selections", canCloseConfigurator: "canCloseConfigurator", animateSlideout: "animateSlideout", showHeaderInformation: "showHeaderInformation" }, outputs: { customizeButtonClicked: "customizeButtonClicked", buildFinished: "buildFinished", showChange: "showChange" }, host: { properties: { "class.co-threedselector": "this.showClass" } }, ngImport: i0, template: `
16295
- @if (!showFullConfiguration) {
16296
- <co-lite-selector
16297
- class="floating"
16298
- [showSelections]="showTemplate"
16299
- [showAnswers]="showTemplate"
16300
- [animateSlideout]="animateSlideout"
16301
- [canClose]="canCloseConfigurator"
16302
- (showChange)="handleShowChangeSelector($event)">
16303
- </co-lite-selector>
16304
- }
16305
-
16306
- @if (showFullConfiguration) {
16307
- <co-product-configurator
16308
- class="floating"
16309
- [show]="showTemplate"
16310
- [showSelections]="showSelections"
16311
- [canClose]="canCloseConfigurator"
16312
- [showHeaderInformation]="showHeaderInformation"
16313
- (showChange)="handleShowChangeSelector($event)">
16314
- </co-product-configurator>
16315
- }
16316
- `, isInline: true, dependencies: [{ kind: "component", type: LiteSelectorComponent, selector: "co-lite-selector", inputs: ["showAnswers", "show", "showSelections", "showLabel", "canClose", "animateSlideout", "customDimensions"], outputs: ["showChange", "answerChosen"] }, { kind: "component", type: ProductConfiguratorComponent, selector: "co-product-configurator", inputs: ["show", "showHeaderInformation", "showSelections", "showLabel", "canClose", "customDimensions"], outputs: ["showChange", "answerChosen"] }], animations: [
16908
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ThreedselectorComponent, isStandalone: false, selector: "co-threedselector", inputs: { selections: "selections", canCloseConfigurator: "canCloseConfigurator", animateSlideout: "animateSlideout", showHeaderInformation: "showHeaderInformation", showSaveAndLoadConfiguration: "showSaveAndLoadConfiguration" }, outputs: { customizeButtonClicked: "customizeButtonClicked", buildFinished: "buildFinished", showChange: "showChange" }, host: { properties: { "class.co-threedselector": "this.showClass" } }, ngImport: i0, template: `
16909
+ @if (!showFullConfiguration) {
16910
+ <co-lite-selector
16911
+ class="floating"
16912
+ [showSelections]="showTemplate"
16913
+ [showAnswers]="showTemplate"
16914
+ [animateSlideout]="animateSlideout"
16915
+ [canClose]="canCloseConfigurator"
16916
+ [showSaveAndLoadConfiguration]="showSaveAndLoadConfiguration"
16917
+ (showChange)="handleShowChangeSelector($event)">
16918
+ </co-lite-selector>
16919
+ }
16920
+
16921
+ @if (showFullConfiguration) {
16922
+ <co-product-configurator
16923
+ class="floating"
16924
+ [show]="showTemplate"
16925
+ [showSelections]="showSelections"
16926
+ [canClose]="canCloseConfigurator"
16927
+ [showHeaderInformation]="showHeaderInformation"
16928
+ [showSaveAndLoadConfiguration]="showSaveAndLoadConfiguration"
16929
+ (showChange)="handleShowChangeSelector($event)">
16930
+ </co-product-configurator>
16931
+ }
16932
+ @if (showSaveAndLoadConfiguration) {
16933
+ <co-configuration-preset-dialog></co-configuration-preset-dialog>
16934
+ }
16935
+ `, isInline: true, dependencies: [{ kind: "component", type: LiteSelectorComponent, selector: "co-lite-selector", inputs: ["showAnswers", "show", "showSelections", "showLabel", "canClose", "animateSlideout", "customDimensions", "showSaveAndLoadConfiguration"], outputs: ["showChange", "answerChosen"] }, { kind: "component", type: ProductConfiguratorComponent, selector: "co-product-configurator", inputs: ["show", "showHeaderInformation", "showSelections", "showLabel", "canClose", "customDimensions", "showSaveAndLoadConfiguration"], outputs: ["showChange", "answerChosen"] }, { kind: "component", type: ConfigurationPresetDialogComponent, selector: "co-configuration-preset-dialog" }], animations: [
16317
16936
  trigger('showElementToolbar', [
16318
16937
  state('void', style({ opacity: 0 })),
16319
16938
  state('*', style({ opacity: 1 })),
@@ -16326,27 +16945,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
16326
16945
  args: [{
16327
16946
  selector: 'co-threedselector',
16328
16947
  template: `
16329
- @if (!showFullConfiguration) {
16330
- <co-lite-selector
16331
- class="floating"
16332
- [showSelections]="showTemplate"
16333
- [showAnswers]="showTemplate"
16334
- [animateSlideout]="animateSlideout"
16335
- [canClose]="canCloseConfigurator"
16336
- (showChange)="handleShowChangeSelector($event)">
16337
- </co-lite-selector>
16338
- }
16339
-
16340
- @if (showFullConfiguration) {
16341
- <co-product-configurator
16342
- class="floating"
16343
- [show]="showTemplate"
16344
- [showSelections]="showSelections"
16345
- [canClose]="canCloseConfigurator"
16346
- [showHeaderInformation]="showHeaderInformation"
16347
- (showChange)="handleShowChangeSelector($event)">
16348
- </co-product-configurator>
16349
- }
16948
+ @if (!showFullConfiguration) {
16949
+ <co-lite-selector
16950
+ class="floating"
16951
+ [showSelections]="showTemplate"
16952
+ [showAnswers]="showTemplate"
16953
+ [animateSlideout]="animateSlideout"
16954
+ [canClose]="canCloseConfigurator"
16955
+ [showSaveAndLoadConfiguration]="showSaveAndLoadConfiguration"
16956
+ (showChange)="handleShowChangeSelector($event)">
16957
+ </co-lite-selector>
16958
+ }
16959
+
16960
+ @if (showFullConfiguration) {
16961
+ <co-product-configurator
16962
+ class="floating"
16963
+ [show]="showTemplate"
16964
+ [showSelections]="showSelections"
16965
+ [canClose]="canCloseConfigurator"
16966
+ [showHeaderInformation]="showHeaderInformation"
16967
+ [showSaveAndLoadConfiguration]="showSaveAndLoadConfiguration"
16968
+ (showChange)="handleShowChangeSelector($event)">
16969
+ </co-product-configurator>
16970
+ }
16971
+ @if (showSaveAndLoadConfiguration) {
16972
+ <co-configuration-preset-dialog></co-configuration-preset-dialog>
16973
+ }
16350
16974
  `,
16351
16975
  encapsulation: ViewEncapsulation.None,
16352
16976
  animations: [
@@ -16371,6 +16995,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
16371
16995
  type: Input
16372
16996
  }], showHeaderInformation: [{
16373
16997
  type: Input
16998
+ }], showSaveAndLoadConfiguration: [{
16999
+ type: Input
16374
17000
  }], buildFinished: [{
16375
17001
  type: Output
16376
17002
  }], showChange: [{
@@ -16392,6 +17018,7 @@ class ConfiguratorComponent {
16392
17018
  canCloseConfigurator = true;
16393
17019
  animateSlideout = true;
16394
17020
  showHeaderInformation = true;
17021
+ showSaveAndLoadConfiguration;
16395
17022
  buildResult = new EventEmitter();
16396
17023
  // TODO
16397
17024
  isLoading = new EventEmitter();
@@ -16444,54 +17071,56 @@ class ConfiguratorComponent {
16444
17071
  }
16445
17072
  }
16446
17073
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfiguratorComponent, deps: [{ token: SettingsService }, { token: LoaderService }, { token: AppEventService }, { token: ConfiguringService }], target: i0.ɵɵFactoryTarget.Component });
16447
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ConfiguratorComponent, isStandalone: false, selector: "co-configurator", inputs: { showLoader: "showLoader", showProgressBar: "showProgressBar", showErrorMessages: "showErrorMessages", outputErrorMessages: "outputErrorMessages", canCloseConfigurator: "canCloseConfigurator", animateSlideout: "animateSlideout", showHeaderInformation: "showHeaderInformation" }, outputs: { buildResult: "buildResult", isLoading: "isLoading", updateProgressBar: "updateProgressBar", errorMessages: "errorMessages", showChange: "showChange" }, host: { properties: { "class.co-configurator": "this.showClass" } }, ngImport: i0, template: `
16448
- @if (showProgressBar) {
16449
- <co-progress-bar></co-progress-bar>
16450
- }
16451
- @if (showLoader) {
16452
- <co-configurator-loader [show]="loaderService.showLoader"></co-configurator-loader>
16453
- }
16454
- @if (showErrorMessages && resultHasErrors && showErrorDiagram) {
16455
- <co-configurator-error-dialog
16456
- [errorMessages]="configurationResultObject.errorMessages"
16457
- (closeErrorDialoag)="handleCloseErrorDialog()"
16458
- ></co-configurator-error-dialog>
16459
- }
17074
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ConfiguratorComponent, isStandalone: false, selector: "co-configurator", inputs: { showLoader: "showLoader", showProgressBar: "showProgressBar", showErrorMessages: "showErrorMessages", outputErrorMessages: "outputErrorMessages", canCloseConfigurator: "canCloseConfigurator", animateSlideout: "animateSlideout", showHeaderInformation: "showHeaderInformation", showSaveAndLoadConfiguration: "showSaveAndLoadConfiguration" }, outputs: { buildResult: "buildResult", isLoading: "isLoading", updateProgressBar: "updateProgressBar", errorMessages: "errorMessages", showChange: "showChange" }, host: { properties: { "class.co-configurator": "this.showClass" } }, ngImport: i0, template: `
17075
+ @if (showProgressBar) {
17076
+ <co-progress-bar></co-progress-bar>
17077
+ }
17078
+ @if (showLoader) {
17079
+ <co-configurator-loader [show]="loaderService.showLoader"></co-configurator-loader>
17080
+ }
17081
+ @if (showErrorMessages && resultHasErrors && showErrorDiagram) {
17082
+ <co-configurator-error-dialog
17083
+ [errorMessages]="configurationResultObject.errorMessages"
17084
+ (closeErrorDialoag)="handleCloseErrorDialog()"
17085
+ ></co-configurator-error-dialog>
17086
+ }
16460
17087
 
16461
- <co-threedselector
16462
- [canCloseConfigurator]="canCloseConfigurator"
16463
- [animateSlideout]="animateSlideout"
16464
- [showHeaderInformation]="showHeaderInformation"
16465
- (buildFinished)="handleBuildFinished($event)"
16466
- (showChange)="handleShowChange($event)">
16467
- </co-threedselector>
16468
- `, isInline: true, dependencies: [{ kind: "component", type: ProgressBarComponent, selector: "co-progress-bar" }, { kind: "component", type: ConfiguratorLoaderComponent, selector: "co-configurator-loader", inputs: ["show"] }, { kind: "component", type: ConfiguratorErrorDialogComponent, selector: "co-configurator-error-dialog", inputs: ["errorMessages"], outputs: ["closeErrorDialoag"] }, { kind: "component", type: ThreedselectorComponent, selector: "co-threedselector", inputs: ["selections", "canCloseConfigurator", "animateSlideout", "showHeaderInformation"], outputs: ["customizeButtonClicked", "buildFinished", "showChange"] }], encapsulation: i0.ViewEncapsulation.None });
17088
+ <co-threedselector
17089
+ [canCloseConfigurator]="canCloseConfigurator"
17090
+ [animateSlideout]="animateSlideout"
17091
+ [showHeaderInformation]="showHeaderInformation"
17092
+ [showSaveAndLoadConfiguration]="showSaveAndLoadConfiguration"
17093
+ (buildFinished)="handleBuildFinished($event)"
17094
+ (showChange)="handleShowChange($event)">
17095
+ </co-threedselector>
17096
+ `, isInline: true, dependencies: [{ kind: "component", type: ProgressBarComponent, selector: "co-progress-bar" }, { kind: "component", type: ConfiguratorLoaderComponent, selector: "co-configurator-loader", inputs: ["show"] }, { kind: "component", type: ConfiguratorErrorDialogComponent, selector: "co-configurator-error-dialog", inputs: ["errorMessages"], outputs: ["closeErrorDialoag"] }, { kind: "component", type: ThreedselectorComponent, selector: "co-threedselector", inputs: ["selections", "canCloseConfigurator", "animateSlideout", "showHeaderInformation", "showSaveAndLoadConfiguration"], outputs: ["customizeButtonClicked", "buildFinished", "showChange"] }], encapsulation: i0.ViewEncapsulation.None });
16469
17097
  }
16470
17098
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfiguratorComponent, decorators: [{
16471
17099
  type: Component,
16472
17100
  args: [{
16473
17101
  selector: 'co-configurator',
16474
17102
  template: `
16475
- @if (showProgressBar) {
16476
- <co-progress-bar></co-progress-bar>
16477
- }
16478
- @if (showLoader) {
16479
- <co-configurator-loader [show]="loaderService.showLoader"></co-configurator-loader>
16480
- }
16481
- @if (showErrorMessages && resultHasErrors && showErrorDiagram) {
16482
- <co-configurator-error-dialog
16483
- [errorMessages]="configurationResultObject.errorMessages"
16484
- (closeErrorDialoag)="handleCloseErrorDialog()"
16485
- ></co-configurator-error-dialog>
16486
- }
17103
+ @if (showProgressBar) {
17104
+ <co-progress-bar></co-progress-bar>
17105
+ }
17106
+ @if (showLoader) {
17107
+ <co-configurator-loader [show]="loaderService.showLoader"></co-configurator-loader>
17108
+ }
17109
+ @if (showErrorMessages && resultHasErrors && showErrorDiagram) {
17110
+ <co-configurator-error-dialog
17111
+ [errorMessages]="configurationResultObject.errorMessages"
17112
+ (closeErrorDialoag)="handleCloseErrorDialog()"
17113
+ ></co-configurator-error-dialog>
17114
+ }
16487
17115
 
16488
- <co-threedselector
16489
- [canCloseConfigurator]="canCloseConfigurator"
16490
- [animateSlideout]="animateSlideout"
16491
- [showHeaderInformation]="showHeaderInformation"
16492
- (buildFinished)="handleBuildFinished($event)"
16493
- (showChange)="handleShowChange($event)">
16494
- </co-threedselector>
17116
+ <co-threedselector
17117
+ [canCloseConfigurator]="canCloseConfigurator"
17118
+ [animateSlideout]="animateSlideout"
17119
+ [showHeaderInformation]="showHeaderInformation"
17120
+ [showSaveAndLoadConfiguration]="showSaveAndLoadConfiguration"
17121
+ (buildFinished)="handleBuildFinished($event)"
17122
+ (showChange)="handleShowChange($event)">
17123
+ </co-threedselector>
16495
17124
  `,
16496
17125
  encapsulation: ViewEncapsulation.None,
16497
17126
  standalone: false
@@ -16513,6 +17142,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
16513
17142
  type: Input
16514
17143
  }], showHeaderInformation: [{
16515
17144
  type: Input
17145
+ }], showSaveAndLoadConfiguration: [{
17146
+ type: Input
16516
17147
  }], buildResult: [{
16517
17148
  type: Output
16518
17149
  }], isLoading: [{
@@ -17390,6 +18021,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
17390
18021
  }]
17391
18022
  }] });
17392
18023
 
18024
+ class ConfigurationPresetModule {
18025
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
18026
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetModule, declarations: [ConfigurationPresetComponent], imports: [PipesModule,
18027
+ ButtonModule,
18028
+ IconModule,
18029
+ InputTextModule,
18030
+ CdkCopyToClipboard], exports: [ConfigurationPresetComponent] });
18031
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetModule, imports: [PipesModule,
18032
+ ButtonModule,
18033
+ IconModule,
18034
+ InputTextModule] });
18035
+ }
18036
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetModule, decorators: [{
18037
+ type: NgModule,
18038
+ args: [{
18039
+ imports: [
18040
+ PipesModule,
18041
+ ButtonModule,
18042
+ IconModule,
18043
+ InputTextModule,
18044
+ CdkCopyToClipboard
18045
+ ],
18046
+ declarations: [
18047
+ ConfigurationPresetComponent
18048
+ ],
18049
+ exports: [
18050
+ ConfigurationPresetComponent
18051
+ ]
18052
+ }]
18053
+ }] });
18054
+
17393
18055
  class SelectionsSummaryModule {
17394
18056
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: SelectionsSummaryModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
17395
18057
  static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.18", ngImport: i0, type: SelectionsSummaryModule, declarations: [SelectionsSummaryComponent], imports: [CoSummaryLineModule,
@@ -17397,13 +18059,15 @@ class SelectionsSummaryModule {
17397
18059
  PipesModule,
17398
18060
  PriceDisplayPipeModule,
17399
18061
  SelectionsSummaryLineModule,
17400
- IconModule], exports: [SelectionsSummaryComponent] });
18062
+ IconModule,
18063
+ ConfigurationPresetModule], exports: [SelectionsSummaryComponent] });
17401
18064
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: SelectionsSummaryModule, imports: [CoSummaryLineModule,
17402
18065
  CommonModule,
17403
18066
  PipesModule,
17404
18067
  PriceDisplayPipeModule,
17405
18068
  SelectionsSummaryLineModule,
17406
- IconModule] });
18069
+ IconModule,
18070
+ ConfigurationPresetModule] });
17407
18071
  }
17408
18072
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: SelectionsSummaryModule, decorators: [{
17409
18073
  type: NgModule,
@@ -17414,7 +18078,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
17414
18078
  PipesModule,
17415
18079
  PriceDisplayPipeModule,
17416
18080
  SelectionsSummaryLineModule,
17417
- IconModule
18081
+ IconModule,
18082
+ ConfigurationPresetModule
17418
18083
  ],
17419
18084
  declarations: [
17420
18085
  SelectionsSummaryComponent,
@@ -17625,7 +18290,8 @@ class ProductConfiguratorModule {
17625
18290
  PipesModule,
17626
18291
  IconModule,
17627
18292
  TooltipDirectiveModule,
17628
- ProductConfiguratorSelectorModule], exports: [ProductConfiguratorComponent] });
18293
+ ProductConfiguratorSelectorModule,
18294
+ ConfigurationPresetModule], exports: [ProductConfiguratorComponent] });
17629
18295
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorModule, imports: [CommonModule,
17630
18296
  MatIconModule,
17631
18297
  MatButtonModule,
@@ -17638,7 +18304,8 @@ class ProductConfiguratorModule {
17638
18304
  PipesModule,
17639
18305
  IconModule,
17640
18306
  TooltipDirectiveModule,
17641
- ProductConfiguratorSelectorModule] });
18307
+ ProductConfiguratorSelectorModule,
18308
+ ConfigurationPresetModule] });
17642
18309
  }
17643
18310
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorModule, decorators: [{
17644
18311
  type: NgModule,
@@ -17656,7 +18323,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
17656
18323
  PipesModule,
17657
18324
  IconModule,
17658
18325
  TooltipDirectiveModule,
17659
- ProductConfiguratorSelectorModule
18326
+ ProductConfiguratorSelectorModule,
18327
+ ConfigurationPresetModule
17660
18328
  ],
17661
18329
  schemas: [
17662
18330
  NO_ERRORS_SCHEMA
@@ -17670,14 +18338,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
17670
18338
  }]
17671
18339
  }] });
17672
18340
 
18341
+ class ConfigurationPresetDialogModule {
18342
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetDialogModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
18343
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetDialogModule, declarations: [ConfigurationPresetDialogComponent], imports: [PipesModule,
18344
+ ButtonModule,
18345
+ IconModule,
18346
+ InputTextModule,
18347
+ CdkCopyToClipboard], exports: [ConfigurationPresetDialogComponent] });
18348
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetDialogModule, imports: [PipesModule,
18349
+ ButtonModule,
18350
+ IconModule,
18351
+ InputTextModule] });
18352
+ }
18353
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetDialogModule, decorators: [{
18354
+ type: NgModule,
18355
+ args: [{
18356
+ imports: [
18357
+ PipesModule,
18358
+ ButtonModule,
18359
+ IconModule,
18360
+ InputTextModule,
18361
+ CdkCopyToClipboard
18362
+ ],
18363
+ declarations: [
18364
+ ConfigurationPresetDialogComponent
18365
+ ],
18366
+ exports: [
18367
+ ConfigurationPresetDialogComponent
18368
+ ]
18369
+ }]
18370
+ }] });
18371
+
17673
18372
  class ThreedselectorModule {
17674
18373
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ThreedselectorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
17675
18374
  static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.18", ngImport: i0, type: ThreedselectorModule, declarations: [ThreedselectorComponent], imports: [LiteSelectorModule,
17676
18375
  ProductConfiguratorModule,
17677
- CommonModule], exports: [ThreedselectorComponent] });
18376
+ CommonModule,
18377
+ ConfigurationPresetDialogModule], exports: [ThreedselectorComponent] });
17678
18378
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ThreedselectorModule, imports: [LiteSelectorModule,
17679
18379
  ProductConfiguratorModule,
17680
- CommonModule] });
18380
+ CommonModule,
18381
+ ConfigurationPresetDialogModule] });
17681
18382
  }
17682
18383
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ThreedselectorModule, decorators: [{
17683
18384
  type: NgModule,
@@ -17685,7 +18386,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
17685
18386
  imports: [
17686
18387
  LiteSelectorModule,
17687
18388
  ProductConfiguratorModule,
17688
- CommonModule
18389
+ CommonModule,
18390
+ ConfigurationPresetDialogModule
17689
18391
  ],
17690
18392
  declarations: [
17691
18393
  ThreedselectorComponent