@colijnit/configurator 262.1.9 → 262.1.11

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 (45) hide show
  1. package/fesm2022/colijnit-configurator.mjs +2402 -758
  2. package/fesm2022/colijnit-configurator.mjs.map +1 -1
  3. package/index.d.ts +319 -67
  4. package/lib/components/answer-info-dialog/style/_theme.scss +3 -3
  5. package/lib/components/answers-slideout/style/_layout.scss +10 -10
  6. package/lib/components/configuration-preset/style/_layout.scss +1 -1
  7. package/lib/components/configuration-preset/style/_theme.scss +2 -2
  8. package/lib/components/configuration-preset-dialog/style/_theme.scss +7 -7
  9. package/lib/components/configurator-dialog/style/_theme.scss +5 -5
  10. package/lib/components/configurator-scene/style/_layout.scss +1 -0
  11. package/lib/components/element-buttons/style/_layout.scss +13 -12
  12. package/lib/components/element-buttons/style/_material-definition.scss +9 -0
  13. package/lib/components/element-buttons/style/_theme.scss +15 -7
  14. package/lib/components/element-toolbar/style/_layout.scss +30 -4
  15. package/lib/components/element-toolbar/style/_material-definition.scss +3 -1
  16. package/lib/components/element-toolbar/style/_theme.scss +13 -12
  17. package/lib/components/product-configurator/style/_layout.scss +18 -7
  18. package/lib/components/product-configurator/style/_theme.scss +3 -3
  19. package/lib/components/product-configurator-grouped-repeatable-options/style/_layout.scss +74 -0
  20. package/lib/components/product-configurator-grouped-repeatable-options/style/_material-definition.scss +12 -0
  21. package/lib/components/product-configurator-grouped-repeatable-options/style/_theme.scss +75 -0
  22. package/lib/components/product-configurator-grouped-repeatable-options/style/material.scss +3 -0
  23. package/lib/components/product-configurator-repeat-buttons/style/_layout.scss +24 -0
  24. package/lib/components/product-configurator-repeat-buttons/style/_material-definition.scss +3 -0
  25. package/lib/components/product-configurator-repeat-buttons/style/_theme.scss +24 -0
  26. package/lib/components/product-configurator-repeat-buttons/style/material.scss +3 -0
  27. package/lib/components/product-configurator-selector/style/_layout.scss +36 -3
  28. package/lib/components/product-configurator-selector/style/_theme.scss +41 -22
  29. package/lib/components/product-configurator-selector-child-article/style/_layout.scss +40 -0
  30. package/lib/components/product-configurator-selector-child-article/style/_material-definition.scss +3 -0
  31. package/lib/components/product-configurator-selector-child-article/style/_theme.scss +29 -0
  32. package/lib/components/product-configurator-selector-child-article/style/material.scss +3 -0
  33. package/lib/components/product-configurator-selector-option/style/_theme.scss +18 -1
  34. package/lib/components/product-configurator-selector-option-button/style/_theme.scss +5 -5
  35. package/lib/components/product-configurator-selector-option-checkbox/style/_theme.scss +9 -9
  36. package/lib/components/product-configurator-selector-option-dropdown/style/_theme.scss +2 -2
  37. package/lib/components/product-configurator-selector-option-tile/style/_layout.scss +1 -1
  38. package/lib/components/product-configurator-selector-option-tile/style/_theme.scss +52 -21
  39. package/lib/components/product-configurator-slideout/style/_layout.scss +38 -0
  40. package/lib/components/product-configurator-slideout/style/_material-definition.scss +3 -0
  41. package/lib/components/product-configurator-slideout/style/_theme.scss +30 -0
  42. package/lib/components/product-configurator-slideout/style/material.scss +3 -0
  43. package/lib/components/summary-line/style/_theme.scss +6 -6
  44. package/lib/style/_variables.scss +50 -40
  45. package/package.json +4 -4
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Injectable, EventEmitter, HostBinding, ViewEncapsulation, Component, Input, Output, HostListener, ViewChild, Directive, ElementRef, ViewChildren, TemplateRef, NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
3
- import * as i5 from '@angular/common';
3
+ import * as i6$1 from '@angular/common';
4
4
  import { CommonModule, AsyncPipe } from '@angular/common';
5
5
  import { BehaviorSubject, Subject, combineLatest, debounceTime } from 'rxjs';
6
6
  import * as THREE from 'three';
@@ -10,7 +10,7 @@ import { HdecoPlacement } from '@colijnit/configuratorapi/build/enum/hdeco-place
10
10
  import * as i6 from '@colijnit/utilities';
11
11
  import { ObjectUtils, MaterialUtils, DeviceUtils as DeviceUtils$1, DeviceTier as DeviceTier$1, TranslationModule, UtilitiesPipesModule } from '@colijnit/utilities';
12
12
  import { isNill } from '@colijnit/configuratorapi/build/utils/function/is-nill.function';
13
- import { VariationUtils, AssetUtils, FileUtils, ThreedUtils, DebugUtils, VariationHelper, SelectionUtils, Scene3DUtil } from '@colijnit/configuratorcore';
13
+ import { ImageUtils, VariationUtils, AssetUtils, FileUtils, ThreedUtils, DebugUtils, VariationHelper, SelectionUtils, Scene3DUtil } from '@colijnit/configuratorcore';
14
14
  import { UserRoleType } from '@colijnit/ioneconnector/build/enum/user-role-type.enum';
15
15
  import { MainApi } from '@colijnit/mainapi';
16
16
  import { TableName } from '@colijnit/mainapi/build/enum/table-name.enum';
@@ -21,6 +21,7 @@ import { NodeType } from '@colijnit/configuratorapi/build/enum/node-type.enum';
21
21
  import { Articles } from '@colijnit/articleapi/build/articles';
22
22
  import { Article } from '@colijnit/configuratorapi/build/model/article';
23
23
  import { Selection } from '@colijnit/configuratorapi/build/model/selection';
24
+ import { SelectorStructure } from '@colijnit/configuratorapi/build/model/selector-structure.bo';
24
25
  import { SelectorWithOptions } from '@colijnit/configuratorapi/build/model/selector-with-options';
25
26
  import { AnswerPrice } from '@colijnit/configuratorapi/build/model/answer-price';
26
27
  import { ArticleText } from '@colijnit/configuratorapi/build/model/article-text.bo';
@@ -42,19 +43,21 @@ import { XRControllerModelFactory } from 'three/examples/jsm/webxr/XRControllerM
42
43
  import axios from 'axios';
43
44
  import { trigger, state, style, transition, animate } from '@angular/animations';
44
45
  import * as i4 from '@colijnit/corecomponents_v12';
45
- import { LoaderModule, IconModule, ButtonModule, InputTextModule, CardModule, PriceDisplayPipeModule, ImageModule, TooltipDirectiveModule } from '@colijnit/corecomponents_v12';
46
+ import { LoaderModule, IconModule, ButtonModule, InputTextModule, CardModule, PriceDisplayPipeModule, InputTextChipsModule, ImageModule, AppendPipeModule, TooltipDirectiveModule } from '@colijnit/corecomponents_v12';
46
47
  import * as i1 from '@angular/platform-browser';
47
48
  import { TemplatePortal } from '@angular/cdk/portal';
48
49
  import * as i2 from '@angular/cdk/overlay';
49
50
  import * as i7 from '@angular/cdk/clipboard';
50
51
  import { CdkCopyToClipboard } from '@angular/cdk/clipboard';
51
52
  import { ConfigurationDisplayOption } from '@colijnit/configuratorapi/build/enum/refcode/configuration-display-option.enum';
52
- import { SelectorStructure } from '@colijnit/configuratorapi/build/model/selector-structure.bo';
53
- import * as i6$1 from '@angular/forms';
53
+ import * as i6$2 from '@angular/forms';
54
54
  import { FormsModule } from '@angular/forms';
55
55
  import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';
56
56
  import { MatButtonModule } from '@angular/material/button';
57
57
  import { MatIconModule } from '@angular/material/icon';
58
+ import { fromEvent } from 'rxjs/internal/observable/fromEvent';
59
+ import { filter, delay, takeUntil } from 'rxjs/operators';
60
+ import { of } from 'rxjs/internal/observable/of';
58
61
 
59
62
  class ArParameters {
60
63
  depthOcclusion = false;
@@ -133,8 +136,11 @@ class SettingOptions {
133
136
  useExternalOpenSave = false;
134
137
  floorFadeStart = 2.0;
135
138
  floorFadeEnd = 6.0;
136
- maxVisibleTiles = 10;
137
- maxVisibleSmallTiles = 24;
139
+ limitStartView = false; // Only works for full config -> true to enable limited data on start
140
+ limitAmountOfTiles = false; // this enables the tile limits
141
+ amountOfGroupsToShow = 2; // this limits the level 1 stuff
142
+ maxVisibleTiles = 10; // this limits the amount of tiles shown on load
143
+ maxVisibleSmallTiles = 24; // this limits the amount of tiles shown on load
138
144
  groupedShowAllBtn = false;
139
145
  showSavePresetButton = false;
140
146
  showLoadPresetButton = false;
@@ -428,6 +434,13 @@ class ConfiguratorEventService {
428
434
  renderImageChanged = new BehaviorSubject('');
429
435
  renderImageError = new BehaviorSubject('');
430
436
  startBuildFromPresetId = new Subject();
437
+ selectSelection = new Subject();
438
+ showAllConfigurationOptions = new Subject();
439
+ hideMainConfigurator = new Subject();
440
+ checkHiddenRepeatItem = new Subject();
441
+ checkForMarkedInputs = new Subject();
442
+ closeSlideOut = new Subject();
443
+ openSlideOut = new Subject();
431
444
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfiguratorEventService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
432
445
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfiguratorEventService, providedIn: 'root' });
433
446
  }
@@ -663,7 +676,15 @@ class ConfiguratorService {
663
676
  return this._configuratorApi.selectAnswerBySelection(selection, false, userInput);
664
677
  }
665
678
  navigateTo(chosenOption, showLoader = false) {
666
- return this._configuratorApi.navigateTo(chosenOption.opvTreeNodeHierarchy, showLoader);
679
+ return this._configuratorApi.navigateTo(chosenOption.nodeHierarchy, showLoader);
680
+ }
681
+ navigateToBySelNode(instanceId, chosenOption, showLoader = false) {
682
+ return this._configuratorApi.navigateToBySelNode(instanceId, chosenOption.selNodeHierarchy, showLoader);
683
+ }
684
+ nextCombNode(selection, showLoader = false) {
685
+ let params = {};
686
+ params.nodeId = selection.selNodeId;
687
+ return this._configuratorApi.nextCombNode(params, showLoader);
667
688
  }
668
689
  cancelAnswer(getAnswersAndQuestion = true) {
669
690
  return this._configuratorApi.cancelAnswer();
@@ -753,6 +774,9 @@ class ConfiguratorService {
753
774
  catch (e) {
754
775
  }
755
776
  }
777
+ repeatOption(params) {
778
+ return this._configuratorApi.repeatOption(params);
779
+ }
756
780
  _getPublicationCodeForRole(role) {
757
781
  if (this._publicationCodeForUserRole.has(role)) {
758
782
  return this._publicationCodeForUserRole.get(role);
@@ -832,6 +856,17 @@ class ConfiguratorConnectorService {
832
856
  get instanceId() {
833
857
  return this._instanceId;
834
858
  }
859
+ /**
860
+ *
861
+ * This is for the nested article slide out for the full config template
862
+ *
863
+ * */
864
+ set activeSlideOutParentId(id) {
865
+ this._activeSlideOutParentId = id;
866
+ }
867
+ get activeSlideOutParentId() {
868
+ return this._activeSlideOutParentId;
869
+ }
835
870
  controllerInitialized = new BehaviorSubject(false);
836
871
  standAloneInstance = new BehaviorSubject(false);
837
872
  connectionReset = new Subject();
@@ -839,6 +874,7 @@ class ConfiguratorConnectorService {
839
874
  activeQuestion;
840
875
  activeAnswers = [];
841
876
  assetPath;
877
+ _activeSlideOutParentId;
842
878
  _selections = [];
843
879
  _currentSelections;
844
880
  _activeSelection;
@@ -850,6 +886,7 @@ class ConfiguratorConnectorService {
850
886
  _totalPrice;
851
887
  _imageCache = new Map();
852
888
  _exceptionQuestionChanged;
889
+ _exceptionIds = [];
853
890
  _shouldShowLoader;
854
891
  _connectorOptions = new Options();
855
892
  _subs = [];
@@ -986,17 +1023,24 @@ class ConfiguratorConnectorService {
986
1023
  copyInstanceAndLoseOriginalConfiguration(instanceId, result) {
987
1024
  return this._copyInstance(instanceId, false, result);
988
1025
  }
989
- async getQuestionAndAnswersAsync() {
1026
+ async getQuestionAndAnswersAsync(addedElement = false) {
990
1027
  const questionAndAnswers = await this._configuratorService.getQuestionAndAnswersAsync();
1028
+ // TODO Check exception handling.
991
1029
  // When using a full config template, we got some shit
992
1030
  // When we got a response with a question + answers, it means we got an option that got change by exceptions.
993
1031
  // Save the option for exception, update the selectorStructor and make sure the costumer knows which choice needs to be checked
994
1032
  if (questionAndAnswers.answers.length > 0 && this.article && this.article.showFullConfiguration) {
995
- this._exceptionQuestionChanged = questionAndAnswers.question; // TODO we should change this
1033
+ if (!addedElement) {
1034
+ this._exceptionQuestionChanged = questionAndAnswers.question; // TODO we should change this
1035
+ }
1036
+ questionAndAnswers.answers.forEach(option => {
1037
+ if (option.node) {
1038
+ this._exceptionIds.push(option.node);
1039
+ }
1040
+ });
996
1041
  await this.getSelectionsAsync();
997
1042
  }
998
1043
  questionAndAnswers.answers = questionAndAnswers.answers.filter(a => this._isAnswerPublished(a));
999
- this._appEventService.answerCountReceived.next(questionAndAnswers.answers.length);
1000
1044
  if (questionAndAnswers.answers.length === 0) {
1001
1045
  this.emptyAnswersAndQuestion();
1002
1046
  }
@@ -1004,6 +1048,8 @@ class ConfiguratorConnectorService {
1004
1048
  this.activeQuestion = questionAndAnswers.question;
1005
1049
  this.activeAnswers = questionAndAnswers.answers;
1006
1050
  }
1051
+ // Emit it here so we can use it ea
1052
+ this._appEventService.answerCountReceived.next(questionAndAnswers.answers.length);
1007
1053
  this.handleAnswersReceived();
1008
1054
  return questionAndAnswers;
1009
1055
  }
@@ -1053,6 +1099,12 @@ class ConfiguratorConnectorService {
1053
1099
  navigateTo(choseValue, showLoader = false) {
1054
1100
  return this._configuratorService.navigateTo(choseValue, showLoader);
1055
1101
  }
1102
+ async navigateToBySelNode(instanceId, choseValue, showLoader = false) {
1103
+ return this._configuratorService.navigateToBySelNode(instanceId, choseValue, showLoader);
1104
+ }
1105
+ async nextCombNode(selection, showLoader = false) {
1106
+ return this._configuratorService.nextCombNode(selection, showLoader);
1107
+ }
1056
1108
  cancelAnswer(getAnswersAndQuestion = true) {
1057
1109
  return this._configuratorService.cancelAnswer();
1058
1110
  }
@@ -1212,8 +1264,13 @@ class ConfiguratorConnectorService {
1212
1264
  selectedOption.optionText = textAndImage.oText;
1213
1265
  selectedOption.optionText = textAndImage.oText;
1214
1266
  const image = textAndImage.oImage;
1215
- const imageData = await this._configuratorService.getImage(image.key, 4, true, TableName.InternalParam);
1216
- selectedOption.imageData = this._handleImageResponse(imageData);
1267
+ if (image.thumbnailBody) {
1268
+ selectedOption.imageData = ImageUtils.getDocBodyWithMimeTypeDefinition(image.fileName, image.thumbnailBody);
1269
+ }
1270
+ else {
1271
+ const imageData = await this._configuratorService.getImage(image.key, 4, true, TableName.InternalParam);
1272
+ selectedOption.imageData = this._handleImageResponse(imageData);
1273
+ }
1217
1274
  }
1218
1275
  }
1219
1276
  }
@@ -1249,6 +1306,66 @@ class ConfiguratorConnectorService {
1249
1306
  (selection.nodeType === NodeType.Answer && (((selection.answerPublicationCode & this._getPublicationCode()) > 0) ||
1250
1307
  isNill(selection.answerPublicationCode)))));
1251
1308
  }
1309
+ async repeatOption(optCycle, id, after = true) {
1310
+ const params = {};
1311
+ if (after !== undefined) {
1312
+ params.copyAfter = after ? 'T' : 'F';
1313
+ }
1314
+ params.optCycle = optCycle;
1315
+ const response = await this._configuratorService.repeatOption(params);
1316
+ if (response && response.validationResult && response.validationResult.success) {
1317
+ await this.getQuestionAndAnswersAsync(true);
1318
+ return true;
1319
+ }
1320
+ return false;
1321
+ }
1322
+ filterRemoveSelectionsByDeleteExceptions(options) {
1323
+ return options.filter(option => this._checkForRemovedByException(this.selectionWithAnswers, option.node));
1324
+ }
1325
+ markSelectionForUserInput(selectionNode) {
1326
+ this.selectionWithAnswers.forEach(parent => {
1327
+ let found = false;
1328
+ // Normal configurations
1329
+ parent.selectorOptions.forEach(child => {
1330
+ if (child.selector.selNodeId === selectionNode) {
1331
+ this.activeSlideOutParentId = child.selector.selNodeId;
1332
+ parent.markForUserInput = true;
1333
+ found = true;
1334
+ }
1335
+ });
1336
+ // Repeated articles are more nested
1337
+ parent.repeatedOptions.forEach(child => {
1338
+ if (child.selectorOptions && child.selectorOptions.length > 0) {
1339
+ child.selectorOptions.forEach(value => {
1340
+ if (value.selector.selNodeId === selectionNode) {
1341
+ this.activeSlideOutParentId = value.selector.selNodeId;
1342
+ parent.markForUserInput = true;
1343
+ found = true;
1344
+ }
1345
+ });
1346
+ }
1347
+ });
1348
+ // When someone clicks on a non repeating item, we got the selNodeId of the child and not the parent,
1349
+ // we need to loop extra for this to be sure.
1350
+ if (!found) {
1351
+ parent.selectorOptions.forEach(child => {
1352
+ if (child.selectorOptions && child.selectorOptions.length > 0) {
1353
+ child.selectorOptions.forEach(nested => {
1354
+ if (nested.selectorOptions && nested.selectorOptions.length > 0) {
1355
+ nested.selectorOptions.forEach(option => {
1356
+ if (option.selector.selNodeId === selectionNode) {
1357
+ this.activeSlideOutParentId = child.selector.selNodeId;
1358
+ parent.markForUserInput = true;
1359
+ }
1360
+ });
1361
+ }
1362
+ });
1363
+ }
1364
+ });
1365
+ }
1366
+ });
1367
+ this._appEventService.checkForMarkedInputs.next(true);
1368
+ }
1252
1369
  _prepareSelections(selections) {
1253
1370
  this._selections = selections.slice(0);
1254
1371
  this._prepareSelectionsToDisplay();
@@ -1391,6 +1508,17 @@ class ConfiguratorConnectorService {
1391
1508
  * Show full config stuff
1392
1509
  *
1393
1510
  * */
1511
+ async _getSelectorStructure(showLoader = true) {
1512
+ const response = await this._configuratorService.getSelectorStructure(showLoader);
1513
+ if (response && response.validationResult && response.validationResult.success) {
1514
+ if (response.resultObjects) {
1515
+ return this._boFactory.makeBOArrayFromRawBackendDataArray(SelectorStructure, response.resultObjects);
1516
+ }
1517
+ else {
1518
+ return this._boFactory.makeBOArrayFromRawBackendDataArray(SelectorStructure, response.resultObject['structures']);
1519
+ }
1520
+ }
1521
+ }
1394
1522
  async _createSelectorFullConfiguration(selections) {
1395
1523
  this._selections = selections.slice(0);
1396
1524
  this._prepareSelectionsToDisplay();
@@ -1402,42 +1530,97 @@ class ConfiguratorConnectorService {
1402
1530
  });
1403
1531
  }
1404
1532
  this._totalPrice = Math.round((totalPrice + Number.EPSILON) * 100) / 100;
1405
- let selectorStructureList = [];
1406
- const selectorStructure = await this._configuratorService.getSelectorStructure();
1407
- if (selectorStructure.validationResult.success) {
1408
- if (selectorStructure.resultObjects) {
1409
- selectorStructureList = selectorStructure.resultObjects;
1410
- }
1411
- else {
1412
- selectorStructureList = selectorStructure.resultObject['structures'];
1413
- }
1414
- }
1415
- const filteredList = selectorStructureList.filter(s => this._isStructurePublished(s));
1416
- struct = this._buildStructureThree(filteredList);
1533
+ // TODO exceptions needs to be checked/ reimplementent
1534
+ // if (this._exceptionQuestionChanged) {
1535
+ // struct = this._linkExceptionToOption(this._exceptionQuestionChanged, struct);
1536
+ // }
1537
+ const selectorStructure = await this._getSelectorStructure();
1538
+ struct = this._buildStructureThree(selectorStructure);
1417
1539
  this._markLastNodeWithChildren(struct);
1418
- if (this._exceptionQuestionChanged) {
1419
- struct = this._linkExceptionToOption(this._exceptionQuestionChanged, struct);
1540
+ struct = this._buildRepeatedOptions(struct);
1541
+ struct = this._filterResultOnPublicationCodes(struct);
1542
+ this._markLastNodeWithChildren(struct);
1543
+ if (this._exceptionIds.length > 0) {
1544
+ struct = this._markExceptions(this._exceptionIds, struct);
1545
+ this._exceptionIds = [];
1420
1546
  }
1421
1547
  this.selectionWithAnswers = struct;
1422
1548
  }
1549
+ _buildRepeatedOptions(items) {
1550
+ const seenByOptId = {};
1551
+ const toRemove = new Set();
1552
+ items.forEach(node => {
1553
+ const optId = node.selector.artNodeOptId;
1554
+ if (optId == null) {
1555
+ return;
1556
+ }
1557
+ if (seenByOptId[optId] == null) {
1558
+ seenByOptId[optId] = node;
1559
+ }
1560
+ else {
1561
+ seenByOptId[optId].repeatedOptions.push(node);
1562
+ toRemove.add(node);
1563
+ }
1564
+ });
1565
+ toRemove.forEach(node => {
1566
+ const index = items.indexOf(node);
1567
+ if (index !== -1) {
1568
+ items.splice(index, 1);
1569
+ }
1570
+ });
1571
+ return items;
1572
+ }
1423
1573
  _buildStructureThree(items) {
1424
1574
  const map = {};
1425
- const structuredList = [];
1575
+ const roots = [];
1426
1576
  items.forEach(item => {
1427
- const option = new SelectorWithOptions();
1428
- option.selector = item;
1429
- option.selectorOptions = [];
1430
- map[item.id] = option;
1577
+ const node = new SelectorWithOptions();
1578
+ node.selector = item;
1579
+ node.selectorOptions = [];
1580
+ node.repeatedOptions = [];
1581
+ map[item.id] = node;
1431
1582
  });
1583
+ const isInsideArticle = (item) => {
1584
+ let current = item;
1585
+ while (current.parentId) {
1586
+ const parent = map[current.parentId]?.selector;
1587
+ if (!parent) {
1588
+ break;
1589
+ }
1590
+ if (parent.nodeType === NodeType.Article) {
1591
+ return true;
1592
+ }
1593
+ current = parent;
1594
+ }
1595
+ return false;
1596
+ };
1597
+ const markAncestorsAsArticles = (item) => {
1598
+ let current = item;
1599
+ while (current.parentId) {
1600
+ const parentNode = map[current.parentId];
1601
+ if (!parentNode) {
1602
+ break;
1603
+ }
1604
+ parentNode.selectorOptionsAreArticles = true;
1605
+ current = parentNode.selector;
1606
+ }
1607
+ };
1432
1608
  items.forEach(item => {
1433
- if (map[item.parentId]) {
1434
- map[item.parentId].selectorOptions.push(map[item.id]);
1609
+ const parent = map[item.parentId];
1610
+ if (!parent) {
1611
+ roots.push(map[item.id]);
1612
+ return;
1613
+ }
1614
+ if (parent.selector.nodeType === NodeType.Article || (parent.selector.nodeType === NodeType.Question && parent.selector.showGrouped === false) || isInsideArticle(item)) {
1615
+ parent.selectorOptions.push(map[item.id]);
1616
+ parent.selectorOptionsAreArticles = true;
1617
+ markAncestorsAsArticles(item);
1435
1618
  }
1436
1619
  else {
1437
- structuredList.push(map[item.id]);
1620
+ parent.selectorOptions.push(map[item.id]);
1438
1621
  }
1439
1622
  });
1440
- return structuredList;
1623
+ return roots;
1441
1624
  }
1442
1625
  _markLastNodeWithChildren(nodes) {
1443
1626
  nodes.forEach(node => {
@@ -1570,13 +1753,70 @@ class ConfiguratorConnectorService {
1570
1753
  }
1571
1754
  }
1572
1755
  _linkExceptionToOption(exceptionQuestion, struct) {
1756
+ let exceptionCount = 0;
1573
1757
  struct.forEach(struct => {
1574
1758
  if (struct.selector.optId === exceptionQuestion.optionId) {
1575
1759
  struct.markForExceptionNotification = true;
1760
+ exceptionCount++;
1761
+ }
1762
+ });
1763
+ if (exceptionCount === 1) {
1764
+ this._exceptionQuestionChanged = undefined; // reset
1765
+ return struct;
1766
+ }
1767
+ }
1768
+ _filterResultOnPublicationCodes(list) {
1769
+ return list.filter(part => {
1770
+ if (!this._isStructurePublished(part.selector)) {
1771
+ return false;
1772
+ }
1773
+ if (part.selectorOptions && part.selectorOptions.length) {
1774
+ part.selectorOptions = this._filterResultOnPublicationCodes(part.selectorOptions);
1775
+ }
1776
+ if (part.repeatedOptions && part.repeatedOptions.length) {
1777
+ part.repeatedOptions = this._filterResultOnPublicationCodes(part.repeatedOptions);
1576
1778
  }
1779
+ return true;
1577
1780
  });
1578
- this._exceptionQuestionChanged = undefined; // reset
1579
- return struct;
1781
+ }
1782
+ _checkForRemovedByException(list, node) {
1783
+ for (const part of list) {
1784
+ if (part.selector.selNodeId === node) {
1785
+ return true;
1786
+ }
1787
+ if (part.selectorOptions && part.selectorOptions.length) {
1788
+ if (part.selectorOptions.length === 1) {
1789
+ if (part.selectorOptions[0].selector.opvId === 0 && part.selectorOptions[0].selector.selNodeId === node) {
1790
+ return false;
1791
+ }
1792
+ }
1793
+ const found = this._checkForRemovedByException(part.selectorOptions, node);
1794
+ if (found !== false) {
1795
+ return found;
1796
+ }
1797
+ }
1798
+ }
1799
+ return false;
1800
+ }
1801
+ _markExceptions(exceptionIds, structure) {
1802
+ if (structure && structure.length > 0) {
1803
+ for (const item of structure) {
1804
+ if (item.selectorOptions && item.selectorOptions.length > 0) {
1805
+ this._markExceptions(exceptionIds, item.selectorOptions);
1806
+ }
1807
+ if (item.repeatedOptions && item.repeatedOptions.length > 0) {
1808
+ this._markExceptions(exceptionIds, item.repeatedOptions);
1809
+ }
1810
+ if (item.selector && exceptionIds.includes(item.selector.selNodeId)) {
1811
+ item.markForExceptionNotification = true;
1812
+ }
1813
+ if (item.selectorOptions?.some(c => c.markForExceptionNotification) ||
1814
+ item.repeatedOptions?.some(c => c.markForExceptionNotification)) {
1815
+ item.markForExceptionNotification = true;
1816
+ }
1817
+ }
1818
+ }
1819
+ return structure;
1580
1820
  }
1581
1821
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfiguratorConnectorService, deps: [{ token: ConfiguratorEventService }, { token: ConfiguratorSettingsService }, { token: LoaderService }, { token: i6.UtilitiesConnectorService }], target: i0.ɵɵFactoryTarget.Injectable });
1582
1822
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfiguratorConnectorService, providedIn: 'root' });
@@ -2275,7 +2515,7 @@ class BuildFurnitureBaseService {
2275
2515
  this.prepareTheSelections(result.instanceId);
2276
2516
  }
2277
2517
  // TODO check if we need this function for Habufa
2278
- // protected handleIntegrationConnections(id: string, object: Item): void {
2518
+ // protected handleIntegrationConnections(selNodeId: string, object: Item): void {
2279
2519
  // const parts: FurniturePartIntegration[] = [];
2280
2520
  // const childParts: Object3D[] = object.configurable ? object.children : [object];
2281
2521
  // const len: number = childParts.length;
@@ -2335,12 +2575,12 @@ class BuildFurnitureBaseService {
2335
2575
  // connection.ConnectedParts = connectors;
2336
2576
  // parts.push(connection);
2337
2577
  // }
2338
- // this.upsertFurniture(id, {Parts: parts}, object);
2578
+ // this.upsertFurniture(selNodeId, {Parts: parts}, object);
2339
2579
  // }
2340
2580
  //
2341
- // protected upsertFurniture(id: string, object: any, item: Item): void {
2581
+ // protected upsertFurniture(selNodeId: string, object: any, item: Item): void {
2342
2582
  // if (this._integrationEnabled && !item.metadata.obsolete) {
2343
- // const idx: number = this._furnitureConfigurations.findIndex(f => f.Id === id);
2583
+ // const idx: number = this._furnitureConfigurations.findIndex(f => f.Id === selNodeId);
2344
2584
  // let furniture: FurnitureIntegration;
2345
2585
  // if (idx < 0) {
2346
2586
  // // empty entry for mrp code, re-use that one
@@ -2350,7 +2590,7 @@ class BuildFurnitureBaseService {
2350
2590
  // furniture = new FurnitureIntegration();
2351
2591
  // this._furnitureConfigurations.push(furniture);
2352
2592
  // }
2353
- // furniture.Id = id;
2593
+ // furniture.Id = selNodeId;
2354
2594
  // } else {
2355
2595
  // furniture = this._furnitureConfigurations[idx];
2356
2596
  // }
@@ -3785,74 +4025,49 @@ Controls = function (camera, domElement) {
3785
4025
  const position = camera.position.clone();
3786
4026
  const target = this.target.clone();
3787
4027
  const group = new Group$1();
3788
- const targetTween = new Tween(target)
3789
- .to(endTarget, duration)
3790
- .easing(Easing.Quadratic.InOut)
3791
- .onUpdate(() => {
3792
- this.target = target;
3793
- this.update();
3794
- this.dispatchEvent(changeEvent);
3795
- })
3796
- .onComplete(() => {
3797
- this.update();
3798
- this.dispatchEvent(changeEvent);
3799
- group.remove(targetTween);
3800
- dispatchRemoveGroup(group);
3801
- })
3802
- .start();
3803
- const positionTween = new Tween(position)
3804
- .to(endPosition, duration)
3805
- .easing(Easing.Quadratic.In)
3806
- .onUpdate(() => {
3807
- this.camera.position.copy(position);
3808
- this.update();
3809
- this.dispatchEvent(changeEvent);
3810
- })
3811
- .onComplete(() => {
3812
- this.update();
3813
- this.dispatchEvent(changeEvent);
3814
- group.remove(positionTween);
3815
- dispatchRemoveGroup(group);
3816
- })
3817
- .start();
3818
- group.add(targetTween);
3819
- group.add(positionTween);
3820
- dispatchAddGroup(group);
3821
- // const targetTween = new TWEEN.Tween<any>(target)
3822
- // .to(endTarget, duration)
3823
- // .easing(TWEEN.Easing.Quadratic.InOut)
3824
- // .onUpdate(() => {
3825
- // this.target = target;
3826
- // this.update();
3827
- // this.dispatchEvent(changeEvent);
3828
- // });
3829
- // const positionTween = new TWEEN.Tween<any>(position)
3830
- // .to(endPosition, duration)
3831
- // .easing(TWEEN.Easing.Quadratic.In)
3832
- // .onUpdate(() => {
3833
- // this.camera.position.copy(position);
3834
- // this.update();
3835
- // this.dispatchEvent(changeEvent);
3836
- // });
3837
- // const targetPromise = new Promise<TWEEN.Tween<any>>(resolve => {
3838
- // targetTween
3839
- // .onComplete(() => {
3840
- // this.update();
3841
- // this.dispatchEvent(changeEvent);
3842
- // resolve(targetTween);
3843
- // })
3844
- // .start();
3845
- // });
3846
- // const positionPromise = new Promise<TWEEN.Tween<any>>(resolve => {
3847
- // positionTween
3848
- // .onComplete(() => {
3849
- // this.update();
3850
- // this.dispatchEvent(changeEvent);
3851
- // resolve(positionTween);
3852
- // })
3853
- // .start();
3854
- // });
3855
- // return Promise.all([targetPromise, positionPromise]);
4028
+ return new Promise((resolve) => {
4029
+ let completedCount = 0;
4030
+ const onTweenComplete = () => {
4031
+ completedCount++;
4032
+ if (completedCount === 2)
4033
+ resolve();
4034
+ };
4035
+ const targetTween = new Tween(target)
4036
+ .to(endTarget, duration)
4037
+ .easing(Easing.Quadratic.InOut)
4038
+ .onUpdate(() => {
4039
+ this.target = target;
4040
+ this.update();
4041
+ this.dispatchEvent(changeEvent);
4042
+ })
4043
+ .onComplete(() => {
4044
+ this.update();
4045
+ this.dispatchEvent(changeEvent);
4046
+ group.remove(targetTween);
4047
+ dispatchRemoveGroup(group);
4048
+ onTweenComplete();
4049
+ })
4050
+ .start();
4051
+ const positionTween = new Tween(position)
4052
+ .to(endPosition, duration)
4053
+ .easing(Easing.Quadratic.In)
4054
+ .onUpdate(() => {
4055
+ this.camera.position.copy(position);
4056
+ this.update();
4057
+ this.dispatchEvent(changeEvent);
4058
+ })
4059
+ .onComplete(() => {
4060
+ this.update();
4061
+ this.dispatchEvent(changeEvent);
4062
+ group.remove(positionTween);
4063
+ dispatchRemoveGroup(group);
4064
+ onTweenComplete();
4065
+ })
4066
+ .start();
4067
+ group.add(targetTween);
4068
+ group.add(positionTween);
4069
+ dispatchAddGroup(group);
4070
+ });
3856
4071
  };
3857
4072
  this.fixedCameraMovement = async function (endPosition, endTarget, endDuration) {
3858
4073
  if (!isFinite(endPosition.x) ||
@@ -6255,6 +6470,8 @@ class ConfiguratorSceneService {
6255
6470
  webGL2Available;
6256
6471
  domElement;
6257
6472
  floorTexturesLoaded = new BehaviorSubject(undefined);
6473
+ getFloorSizeFn;
6474
+ getCenterFloorFn;
6258
6475
  _needsRender;
6259
6476
  _arMode = false;
6260
6477
  _subs = [];
@@ -6314,6 +6531,8 @@ class ConfiguratorSceneService {
6314
6531
  this._handleAddTweenGroup(group);
6315
6532
  }), this._cameraService.removeTweenGroup.subscribe((group) => {
6316
6533
  this._handleRemoveTweenGroup(group);
6534
+ }), this._lightsService.renderPropsChanged.subscribe(() => {
6535
+ this.handlePropsChanged();
6317
6536
  }),
6318
6537
  // this._messageBusService.subscribe(MessageType.TakeScreenshot, async () => {
6319
6538
  // if (this._viewModeService.is3dViewActive() || this._viewModeService.isTopViewActive()) {
@@ -6342,7 +6561,6 @@ class ConfiguratorSceneService {
6342
6561
  }
6343
6562
  MaterialUtils.SetAssetPath(this._assetPath);
6344
6563
  }
6345
- this._lightsService.assetPath = this._assetPath;
6346
6564
  this._initLightService();
6347
6565
  if (this._configuratorSettingsService.settings.assetIndex) {
6348
6566
  this._indexJsonFile = this._configuratorSettingsService.settings.assetIndex;
@@ -6394,7 +6612,10 @@ class ConfiguratorSceneService {
6394
6612
  positionInSceneToScreen(pos) {
6395
6613
  return Scene3DUtil.Convert3DPointToScreenPoint(pos, this._cameraService.camera, this.domElement.clientWidth, this.domElement.clientHeight);
6396
6614
  }
6397
- rendererPropsChange() {
6615
+ handlePropsChanged() {
6616
+ if (!this.scene) {
6617
+ return;
6618
+ }
6398
6619
  this.scene.traverse((node) => {
6399
6620
  if (!node.isMesh) {
6400
6621
  return;
@@ -6437,7 +6658,10 @@ class ConfiguratorSceneService {
6437
6658
  this._postProcessingService.init(this.renderer, this.scene, this._cameraService.camera, this.domElement.clientWidth, this.domElement.clientHeight);
6438
6659
  }
6439
6660
  _initLightService() {
6661
+ this._lightsService.assetPath = this._assetPath;
6440
6662
  this._lightsService.init(this.scene, this.renderer);
6663
+ this._lightsService.getSizeFn = this.getFloorSizeFn;
6664
+ this._lightsService.getCenterFn = this.getCenterFloorFn;
6441
6665
  }
6442
6666
  _initPathTracer() {
6443
6667
  if (this._configuratorSettingsService.settings.options.pathTracer) {
@@ -6816,6 +7040,13 @@ class RenderApi {
6816
7040
  options.transparency = this._useTransparency(sceneSettings);
6817
7041
  options.objectOptions = objectOptions;
6818
7042
  options.objectRenderTransform = blenderVector;
7043
+ if (optionalRenderParameters && optionalRenderParameters.objectWidth && optionalRenderParameters.objectHeight) {
7044
+ options.width = optionalRenderParameters.objectWidth;
7045
+ options.height = optionalRenderParameters.objectHeight;
7046
+ }
7047
+ if (optionalRenderParameters && optionalRenderParameters.renderType) {
7048
+ options.renderType = optionalRenderParameters.renderType;
7049
+ }
6819
7050
  renderBaseObject.assetUrl = buildResult.assetUrl;
6820
7051
  renderBaseObject.cdnUrl = buildResult.cdnUrl;
6821
7052
  renderBaseObject.options = options;
@@ -7295,6 +7526,7 @@ var IconEnum;
7295
7526
  IconEnum["ArrowTurnRightRegular"] = "arrow_turn_right_regular";
7296
7527
  IconEnum["ArCircle"] = "ar_circle";
7297
7528
  IconEnum["BarsLightFull"] = "bars_light_full";
7529
+ IconEnum["BellSharpSolid"] = "bell_sharp_solid";
7298
7530
  IconEnum["Brush"] = "brush";
7299
7531
  IconEnum["CameraSolid"] = "camera_solid";
7300
7532
  IconEnum["CameraTopdown"] = "camera_topdown";
@@ -7303,6 +7535,7 @@ var IconEnum;
7303
7535
  IconEnum["Check"] = "check";
7304
7536
  IconEnum["CheckRegular"] = "check_regular";
7305
7537
  IconEnum["CheckSolid"] = "check_solid";
7538
+ IconEnum["ChevronLeftRegular"] = "chevron_left_regular";
7306
7539
  IconEnum["CircleCheck"] = "circle_check";
7307
7540
  IconEnum["CircleCheckRegular"] = "circle_check_regular";
7308
7541
  IconEnum["CircleInfo"] = "circle_info";
@@ -7412,6 +7645,7 @@ const IconSvg = {
7412
7645
  "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>",
7413
7646
  "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>",
7414
7647
  "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>",
7648
+ "bell_sharp_solid": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M352 64L288 64L288 99.2C215 114 160 178.6 160 256L160 352L80 480L560 480L480 352L480 256C480 178.6 425 114 352 99.2L352 64zM258 528C265.1 555.6 290.2 576 320 576C349.8 576 374.9 555.6 382 528L258 528z\"/></svg>",
7415
7649
  "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>",
7416
7650
  "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>",
7417
7651
  "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>",
@@ -7420,6 +7654,7 @@ const IconSvg = {
7420
7654
  "check": "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 50 50\" enable-background=\"new 0 0 50 50\" ><polygon fill=\"#29363E\" points=\"15,22.4 19.7,29.5 31.2,10 38.9,10 19.7,40 11.1,27.4 \"/></svg>",
7421
7655
  "check_regular": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M534 132.5C544.8 140.2 547.2 155.2 539.5 166L275.5 534C271.4 539.7 265 543.4 258 543.9C251 544.4 244 542 239 537L103 401C93.6 391.6 93.6 376.4 103 367.1C112.4 357.8 127.6 357.7 136.9 367.1L253 483L500.5 138C508.2 127.2 523.2 124.8 534 132.5z\"/></svg>",
7422
7656
  "check_solid": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M530.8 134.1C545.1 144.5 548.3 164.5 537.9 178.8L281.9 530.8C276.4 538.4 267.9 543.1 258.5 543.9C249.1 544.7 240 541.2 233.4 534.6L105.4 406.6C92.9 394.1 92.9 373.8 105.4 361.3C117.9 348.8 138.2 348.8 150.7 361.3L252.2 462.8L486.2 141.1C496.6 126.8 516.6 123.6 530.9 134z\"/></svg>",
7657
+ "chevron_left_regular": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M167.5 303C158.1 312.4 158.1 327.6 167.5 336.9L367.5 536.9C376.9 546.3 392.1 546.3 401.4 536.9C410.7 527.5 410.8 512.3 401.4 503L218.4 320L401.4 137C410.8 127.6 410.8 112.4 401.4 103.1C392 93.8 376.8 93.7 367.5 103.1L167.5 303z\"/></svg>",
7423
7658
  "circle_check": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 32a224 224 0 1 1 0 448 224 224 0 1 1 0-448zm0 480A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM363.3 203.3c6.2-6.2 6.2-16.4 0-22.6s-16.4-6.2-22.6 0L224 297.4l-52.7-52.7c-6.2-6.2-16.4-6.2-22.6 0s-6.2 16.4 0 22.6l64 64c6.2 6.2 16.4 6.2 22.6 0l128-128z\"/></svg>",
7424
7659
  "circle_check_regular": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 48a208 208 0 1 1 0 416 208 208 0 1 1 0-416zm0 464A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM369 209c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-111 111-47-47c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l64 64c9.4 9.4 24.6 9.4 33.9 0L369 209z\"/></svg>",
7425
7660
  "circle_info": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 32a224 224 0 1 1 0 448 224 224 0 1 1 0-448zm0 480A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM208 352c-8.8 0-16 7.2-16 16s7.2 16 16 16l96 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0 0-112c0-8.8-7.2-16-16-16l-40 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l24 0 0 96-32 0zm48-168a24 24 0 1 0 0-48 24 24 0 1 0 0 48z\"/></svg>",
@@ -7480,7 +7715,7 @@ const IconSvg = {
7480
7715
  "magnifying_glass_plus": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M208 32a176 176 0 1 1 0 352 176 176 0 1 1 0-352zm0 384c51.7 0 99-18.8 135.3-50L484.7 507.3c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6L366 343.3c31.2-36.4 50-83.7 50-135.3C416 93.1 322.9 0 208 0S0 93.1 0 208S93.1 416 208 416zM192 304c0 8.8 7.2 16 16 16s16-7.2 16-16l0-80 80 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-80 0 0-80c0-8.8-7.2-16-16-16s-16 7.2-16 16l0 80-80 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l80 0 0 80z\"/></svg>",
7481
7716
  "measurements": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 50 50\"><path d=\"M17.8,39.17,11,32.37l21.2-21.2L39,18Zm-4.4-6.8,4.4,4.4L36.6,18l-4.4-4.4Z\" fill=\"#484f60\"/><rect x=\"28.54\" y=\"14.92\" width=\"4.53\" height=\"1.7\" transform=\"translate(20.17 -17.16) rotate(45)\" fill=\"#484f60\"/><rect x=\"13.34\" y=\"30.12\" width=\"4.53\" height=\"1.7\" transform=\"translate(26.47 -1.96) rotate(45)\" fill=\"#484f60\"/><rect x=\"25.84\" y=\"17.85\" width=\"5.66\" height=\"1.7\" transform=\"translate(21.62 -14.79) rotate(45)\" fill=\"#484f60\"/><rect x=\"23.47\" y=\"19.98\" width=\"4.53\" height=\"1.7\" transform=\"translate(22.27 -12.09) rotate(45)\" fill=\"#484f60\"/><rect x=\"20.77\" y=\"22.92\" width=\"5.66\" height=\"1.7\" transform=\"translate(23.72 -9.73) rotate(45)\" fill=\"#484f60\"/><rect x=\"18.4\" y=\"25.05\" width=\"4.53\" height=\"1.7\" transform=\"translate(24.37 -7.03) rotate(45)\" fill=\"#484f60\"/><rect x=\"15.7\" y=\"27.98\" width=\"5.66\" height=\"1.7\" transform=\"translate(25.82 -4.66) rotate(45)\" fill=\"#484f60\"/></svg>",
7482
7717
  "measurements_inside": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 30 30\"><g ><path d=\"m24.64,0h-3.43c-.59,0-1.07.48-1.07,1.07s.48,1.07,1.07,1.07h3.43c1.77,0,3.21,1.44,3.21,3.21v19.29c0,1.77-1.44,3.21-3.21,3.21h-3.43c-.59,0-1.07.48-1.07,1.07s.48,1.07,1.07,1.07h3.43c2.96,0,5.36-2.4,5.36-5.36V5.36c0-2.95-2.4-5.36-5.36-5.36Z\" fill=\"#484f60\" stroke-width=\"0\"/><path d=\"m0,26.25c0-.41.27-.75.6-.75h10.8c.33,0,.6.34.6.75s-.27.75-.6.75H.6c-.33,0-.6-.34-.6-.75Zm1.98-9.53c.23-.3.62-.3.85,0l2.58,3.22v-9.88l-2.58,3.22c-.23.3-.62.3-.85,0-.24-.29-.24-.77,0-1.06l3.6-4.5c.23-.3.62-.3.85,0l3.6,4.5c.24.29.24.77,0,1.06-.23.3-.61.3-.85,0l-2.58-3.22v9.88l2.58-3.22c.23-.3.61-.3.85,0,.24.29.24.77,0,1.06l-3.6,4.5c-.23.29-.61.29-.85,0l-3.6-4.5c-.24-.29-.24-.77,0-1.06h0ZM11.4,3c.33,0,.6.34.6.75s-.27.75-.6.75H.6c-.33,0-.6-.34-.6-.75s.27-.75.6-.75h10.8Z\" fill=\"#484f60\" stroke-width=\"0\"/></g></svg>",
7483
- "move-phone-ar": "<!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=\"363px\" height=\"222px\" viewBox=\"-0.5 -0.5 363 222\" content=\"&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2022-02-28T15:27:40.868Z&quot; agent=&quot;5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36&quot; etag=&quot;_ioPnVdQo6hh2aJpDZbs&quot; version=&quot;16.6.4&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;KlZxfvW3MfvAEXvIozvx&quot; name=&quot;Page-1&quot;&gt;7VjLcpswFP0aL+PRAxAsY8dNu2ibmaTTZolBwZpg5BHyK19fESTeCdhjp80k3hiOpCvpnHPFhRGeLnfXwl8tvvOQxiMEwt0IX40QggAS9Zch+xzxXA1EgoW6UwncsidqRmp0zUKa1jpKzmPJVnUw4ElCA1nDfCH4tt7tgcf1WVd+RFvAbeDHbfQ3C+UiR11ESvwrZdHCzAwdL29Z+qaz3km68EO+rUB4NsJTwbnMr5a7KY0z8gwv+bgvL7QWCxM0kUMGkOAyouDO+bVL0cx9YrPNzeMFzqNs/HitN6wXK/eGAcHXSUizIHCEJ9sFk/R25QdZ61ZprrCFXMa6WXDpS8YTdXvhAQU8sDie8pgLhSQ8UaMmqRT8sWDTVkh7K3p3Gyok3VUgvbVrypdUir3qolsxAGM7H7Q3iDUmGtqW0iHomI6LqnDIM7CvLRMVk5SsqgtN7AEke/0k0yS8zNxaslQjtarAAfTRsGbuNnkVXmzQJsVggsZK1U09Jbpo0jPccKZWUmpDnEIJLQ4ioB4l5WsRUD2w6uJGLMsCvbGkLyIqW7EUwf6+0m2VdUgPW7YLelfnuKD8Oa8NVxf5mkprFdoc7zZzcn5Yu1kAN3WzbOdIu8H+WC/Y7WR6kn49K+p1HdDq0bPKblnKp+s5VcRN5n7wGD0r/XMtY5Z54Hm46nKZRM9xod0pf8eJforzm+AxahzgGBVQxTkEtp1DrLMd3tDtp9/w+xDTnc6rSSXFgthPUxa8lGWgk+YcaRBd5X6UPfOyXya6HohAPrOuo9wxgcSxCLBdF2Ebv4PktQGom8BRm7DbJ+qhiWx77bgOedtEHlAHZCm5Gp5ORd3rz00E0K2eSTOnnWaoKIgqEnsdWeY2uD9djsF+ZgY+srqTqc3oqwr9J7ng1i3bpH+o9RvOJ8MeX4dWS17nYs9b6aBP23QoAZtKFBk/2DlnsspbemPAm+0H9IYLD3SCyW5Y8xQ8zxuXnuW8xrA/jdGRk01FhxrjxE44lfT4m2uhXcDsu/l98CP5c3/tWRcDqox3V8k37NNRNv6zrz7mxbWouL0xPs5kCPWGOrp2V7flN9i8e/klG8/+Ag==&lt;/diagram&gt;&lt;/mxfile&gt;\"><defs/><g><rect x=\"72.5\" y=\"45.75\" width=\"216.5\" height=\"129.5\" rx=\"19.43\" ry=\"19.43\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" transform=\"rotate(-90,180.75,110.5)\" pointer-events=\"all\"/><path d=\"M 148.75 11 L 148.75 16 Q 148.75 21 158.75 21 L 202.68 21 Q 212.68 21 212.72 16 L 212.75 11\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/><path d=\"M 175.75 197 L 185.75 197\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/><path d=\"M 180.75 73.25 L 216.25 90.3 L 216.25 130.7 L 180.75 147.75 L 145.25 130.7 L 145.25 90.3 Z\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"all\"/><path d=\"M 145.25 90.3 L 180.75 107.34 L 216.25 90.3 M 180.75 107.34 L 180.75 147.75\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"all\"/><path d=\"M 274.51 121.75 L 274.49 97.75 L 328.34 97.7 L 328.33 85.2 L 359.5 109.67 L 328.37 134.2 L 328.36 121.7 Z\" fill=\"#000000\" stroke=\"none\" pointer-events=\"all\"/><path d=\"M 215.25 153.5 L 225.25 153.5 L 225.25 143.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"none\"/><path d=\"M 145.25 153.75 L 135.25 153.5 L 135.25 143.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"none\"/><path d=\"M 216.25 67.5 L 226.25 67.5 L 226.25 77.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"none\"/><path d=\"M 135.25 77.5 L 135.25 67.5 L 145.25 67.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"none\"/><path d=\"M 86.5 98.3 L 86.5 122.3 L 32.65 122.3 L 32.65 134.8 L 1.5 110.3 L 32.65 85.8 L 32.65 98.3 Z\" fill=\"#000000\" stroke=\"none\" pointer-events=\"none\"/></g></svg>",
7718
+ "move-phone-ar": "<!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=\"363px\" height=\"222px\" viewBox=\"-0.5 -0.5 363 222\" content=\"&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2022-02-28T15:27:40.868Z&quot; agent=&quot;5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36&quot; etag=&quot;_ioPnVdQo6hh2aJpDZbs&quot; version=&quot;16.6.4&quot; type=&quot;device&quot;&gt;&lt;diagram selNodeId=&quot;KlZxfvW3MfvAEXvIozvx&quot; name=&quot;Page-1&quot;&gt;7VjLcpswFP0aL+PRAxAsY8dNu2ibmaTTZolBwZpg5BHyK19fESTeCdhjp80k3hiOpCvpnHPFhRGeLnfXwl8tvvOQxiMEwt0IX40QggAS9Zch+xzxXA1EgoW6UwncsidqRmp0zUKa1jpKzmPJVnUw4ElCA1nDfCH4tt7tgcf1WVd+RFvAbeDHbfQ3C+UiR11ESvwrZdHCzAwdL29Z+qaz3km68EO+rUB4NsJTwbnMr5a7KY0z8gwv+bgvL7QWCxM0kUMGkOAyouDO+bVL0cx9YrPNzeMFzqNs/HitN6wXK/eGAcHXSUizIHCEJ9sFk/R25QdZ61ZprrCFXMa6WXDpS8YTdXvhAQU8sDie8pgLhSQ8UaMmqRT8sWDTVkh7K3p3Gyok3VUgvbVrypdUir3qolsxAGM7H7Q3iDUmGtqW0iHomI6LqnDIM7CvLRMVk5SsqgtN7AEke/0k0yS8zNxaslQjtarAAfTRsGbuNnkVXmzQJsVggsZK1U09Jbpo0jPccKZWUmpDnEIJLQ4ioB4l5WsRUD2w6uJGLMsCvbGkLyIqW7EUwf6+0m2VdUgPW7YLelfnuKD8Oa8NVxf5mkprFdoc7zZzcn5Yu1kAN3WzbOdIu8H+WC/Y7WR6kn49K+p1HdDq0bPKblnKp+s5VcRN5n7wGD0r/XMtY5Z54Hm46nKZRM9xod0pf8eJforzm+AxahzgGBVQxTkEtp1DrLMd3tDtp9/w+xDTnc6rSSXFgthPUxa8lGWgk+YcaRBd5X6UPfOyXya6HohAPrOuo9wxgcSxCLBdF2Ebv4PktQGom8BRm7DbJ+qhiWx77bgOedtEHlAHZCm5Gp5ORd3rz00E0K2eSTOnnWaoKIgqEnsdWeY2uD9djsF+ZgY+srqTqc3oqwr9J7ng1i3bpH+o9RvOJ8MeX4dWS17nYs9b6aBP23QoAZtKFBk/2DlnsspbemPAm+0H9IYLD3SCyW5Y8xQ8zxuXnuW8xrA/jdGRk01FhxrjxE44lfT4m2uhXcDsu/l98CP5c3/tWRcDqox3V8k37NNRNv6zrz7mxbWouL0xPs5kCPWGOrp2V7flN9i8e/klG8/+Ag==&lt;/diagram&gt;&lt;/mxfile&gt;\"><defs/><g><rect x=\"72.5\" y=\"45.75\" width=\"216.5\" height=\"129.5\" rx=\"19.43\" ry=\"19.43\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" transform=\"rotate(-90,180.75,110.5)\" pointer-events=\"all\"/><path d=\"M 148.75 11 L 148.75 16 Q 148.75 21 158.75 21 L 202.68 21 Q 212.68 21 212.72 16 L 212.75 11\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/><path d=\"M 175.75 197 L 185.75 197\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/><path d=\"M 180.75 73.25 L 216.25 90.3 L 216.25 130.7 L 180.75 147.75 L 145.25 130.7 L 145.25 90.3 Z\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"all\"/><path d=\"M 145.25 90.3 L 180.75 107.34 L 216.25 90.3 M 180.75 107.34 L 180.75 147.75\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"all\"/><path d=\"M 274.51 121.75 L 274.49 97.75 L 328.34 97.7 L 328.33 85.2 L 359.5 109.67 L 328.37 134.2 L 328.36 121.7 Z\" fill=\"#000000\" stroke=\"none\" pointer-events=\"all\"/><path d=\"M 215.25 153.5 L 225.25 153.5 L 225.25 143.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"none\"/><path d=\"M 145.25 153.75 L 135.25 153.5 L 135.25 143.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"none\"/><path d=\"M 216.25 67.5 L 226.25 67.5 L 226.25 77.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"none\"/><path d=\"M 135.25 77.5 L 135.25 67.5 L 145.25 67.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"5\" stroke-miterlimit=\"10\" pointer-events=\"none\"/><path d=\"M 86.5 98.3 L 86.5 122.3 L 32.65 122.3 L 32.65 134.8 L 1.5 110.3 L 32.65 85.8 L 32.65 98.3 Z\" fill=\"#000000\" stroke=\"none\" pointer-events=\"none\"/></g></svg>",
7484
7719
  "paint_roller_light": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M352 32c17.7 0 32 14.3 32 32l0 32c0 17.7-14.3 32-32 32L64 128c-17.7 0-32-14.3-32-32l0-32c0-17.7 14.3-32 32-32l288 0zm64 32c0-35.3-28.7-64-64-64L64 0C28.7 0 0 28.7 0 64L0 96c0 35.3 28.7 64 64 64l288 0c35.3 0 64-28.7 64-64l0-32zM240 352c8.8 0 16 7.2 16 16l0 96c0 8.8-7.2 16-16 16l-32 0c-8.8 0-16-7.2-16-16l0-96c0-8.8 7.2-16 16-16l32 0zm-32-32c-26.5 0-48 21.5-48 48l0 96c0 26.5 21.5 48 48 48l32 0c26.5 0 48-21.5 48-48l0-96c0-26.5-21.5-48-48-48l0-32c0-17.7 14.3-32 32-32l176 0c35.3 0 64-28.7 64-64l0-64c0-35.3-28.7-64-64-64l0 32c17.7 0 32 14.3 32 32l0 64c0 17.7-14.3 32-32 32l-176 0c-35.3 0-64 28.7-64 64l0 32z\"/></svg>",
7485
7720
  "pen-ruler": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M373.2 16.97C395.1-4.901 430.5-4.901 452.4 16.97L495 59.6C516.9 81.47 516.9 116.9 495 138.8L182.3 451.6C170.9 462.9 156.9 471.2 141.5 475.8L20.52 511.3C14.9 512.1 8.827 511.5 4.687 507.3C.5466 503.2-1.002 497.1 .6506 491.5L36.23 370.5C40.76 355.1 49.09 341.1 60.44 329.7L373.2 16.97zM429.8 39.6C420.4 30.22 405.2 30.22 395.8 39.6L341 94.4L417.6 170.1L472.4 116.2C481.8 106.8 481.8 91.6 472.4 82.23L429.8 39.6zM66.93 379.5L39.63 472.4L132.4 445.1C142.7 442 152.1 436.5 159.6 428.9L394.1 193.6L318.4 117L83.07 352.4C75.5 359.9 69.95 369.3 66.93 379.5V379.5zM173.3 27.31L244.1 98.18L221.5 120.8L189.7 88.97L155.3 123.3C149.1 129.6 138.9 129.6 132.7 123.3C126.4 117.1 126.4 106.9 132.7 100.7L167 66.34L150.6 49.94C138.1 37.44 117.9 37.44 105.4 49.94L49.94 105.4C37.44 117.9 37.44 138.1 49.94 150.6L120.8 221.5L98.18 244.1L27.31 173.3C2.32 148.3 2.32 107.7 27.31 82.75L82.75 27.31C107.7 2.32 148.3 2.32 173.3 27.31V27.31zM338.7 484.7L267.9 413.8L290.5 391.2L361.4 462.1C373.9 474.6 394.1 474.6 406.6 462.1L462.1 406.6C474.6 394.1 474.6 373.9 462.1 361.4L445.7 344.1L411.3 379.3C405.1 385.6 394.9 385.6 388.7 379.3C382.4 373.1 382.4 362.9 388.7 356.7L423 322.3L391.2 290.5L413.8 267.9L484.7 338.7C509.7 363.7 509.7 404.3 484.7 429.3L429.3 484.7C404.3 509.7 363.7 509.7 338.7 484.7V484.7z\"/></svg>",
7486
7721
  "pencil_light": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M395.8 39.6c9.4-9.4 24.6-9.4 33.9 0l42.6 42.6c9.4 9.4 9.4 24.6 0 33.9L417.6 171 341 94.4l54.8-54.8zM318.4 117L395 193.6 159.6 428.9c-7.6 7.6-16.9 13.1-27.2 16.1L39.6 472.4l27.3-92.8c3-10.3 8.6-19.6 16.1-27.2L318.4 117zM452.4 17c-21.9-21.9-57.3-21.9-79.2 0L60.4 329.7c-11.4 11.4-19.7 25.4-24.2 40.8L.7 491.5c-1.7 5.6-.1 11.7 4 15.8s10.2 5.7 15.8 4l121-35.6c15.4-4.5 29.4-12.9 40.8-24.2L495 138.8c21.9-21.9 21.9-57.3 0-79.2L452.4 17z\"/></svg>",
@@ -7590,7 +7825,7 @@ class ConfiguratorErrorDialogComponent {
7590
7825
  <button class="close-button" (click)="onClose()" [textContent]="'CLOSE' | localize:false | async"></button>
7591
7826
  </div>
7592
7827
  </div>
7593
- `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
7828
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
7594
7829
  }
7595
7830
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfiguratorErrorDialogComponent, decorators: [{
7596
7831
  type: Component,
@@ -7780,7 +8015,7 @@ class AnswersInfoDialogComponent {
7780
8015
  </div>
7781
8016
  </div>
7782
8017
  }
7783
- `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
8018
+ `, isInline: true, dependencies: [{ kind: "directive", type: i6$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
7784
8019
  }
7785
8020
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: AnswersInfoDialogComponent, decorators: [{
7786
8021
  type: Component,
@@ -8061,7 +8296,7 @@ class AnswerCardComponent {
8061
8296
  }
8062
8297
 
8063
8298
  </co-card>
8064
- `, isInline: true, dependencies: [{ kind: "component", type: i4.CardComponent, selector: "co-card", inputs: ["imageData", "description", "price", "level", "isSelected", "isSmallModus", "hasMagnifierButton", "hasInfoButton"], outputs: ["contentClick", "infoButtonClick", "magnifierButtonClick"] }, { 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: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: AnswersInfoDialogComponent, selector: "co-answer-info-dialog", inputs: ["answer", "structure", "fixedPosition"], outputs: ["nothingToShow"] }, { kind: "component", type: i4.ButtonComponent, selector: "co-button", inputs: ["label", "iconData", "iconDataRight", "isToggleButton", "isToggled", "hidden", "disabled"], outputs: ["onClick", "clickedWhileDisabled", "isToggledChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
8299
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.CardComponent, selector: "co-card", inputs: ["imageData", "description", "price", "level", "isSelected", "isSmallModus", "hasMagnifierButton", "hasInfoButton"], outputs: ["contentClick", "infoButtonClick", "magnifierButtonClick"] }, { 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: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: AnswersInfoDialogComponent, selector: "co-answer-info-dialog", inputs: ["answer", "structure", "fixedPosition"], outputs: ["nothingToShow"] }, { kind: "component", type: i4.ButtonComponent, selector: "co-button", inputs: ["label", "iconData", "iconDataRight", "isToggleButton", "isToggled", "hidden", "disabled"], outputs: ["onClick", "clickedWhileDisabled", "isToggledChange"] }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
8065
8300
  }
8066
8301
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: AnswerCardComponent, decorators: [{
8067
8302
  type: Component,
@@ -8787,19 +9022,6 @@ class AnswersSlideoutComponent {
8787
9022
  </div>
8788
9023
  }
8789
9024
  <ng-template #answerTemplate>
8790
- @if (searchExpanded) {
8791
- <div class="search-wrapper" [@showFilter]="searchExpanded">
8792
- <!-- TODO enable after Angular update -->
8793
- <!-- <co-input-text-chips-->
8794
- <!-- class="text-chips"-->
8795
- <!-- [value]="chipTexts"-->
8796
- <!-- [initFocus]="true"-->
8797
- <!-- extraIcon="cancel"-->
8798
- <!-- (valueChange)="onChipsValueChange($event)"-->
8799
- <!-- (extraIconClicked)="onChipsClose()"-->
8800
- <!-- ></co-input-text-chips>-->
8801
- </div>
8802
- }
8803
9025
  @if (showTitle) {
8804
9026
  <div class="title">
8805
9027
  <h3 [textContent]="(question?.commercialQuestion ? question?.commercialQuestion : question?.question) | localize:true | async"></h3>
@@ -8814,6 +9036,21 @@ class AnswersSlideoutComponent {
8814
9036
  <co-icon [iconData]="iconService.getIcon(icons.Cross)"></co-icon>
8815
9037
  </button>
8816
9038
  }
9039
+ @if (searchExpanded) {
9040
+ <div class="search-wrapper">
9041
+ <co-input-text-chips
9042
+ class="text-chips"
9043
+ [model]="chipTexts"
9044
+ [initFocus]="true"
9045
+ (modelChange)="onChipsValueChange($event)"
9046
+ (extraIconClicked)="onChipsClose()"
9047
+ ></co-input-text-chips>
9048
+ <co-button
9049
+ [iconData]="iconService.getIcon(icons.Cross)"
9050
+ (onClick)="searchExpanded = false"
9051
+ ></co-button>
9052
+ </div>
9053
+ }
8817
9054
  </div>
8818
9055
  }
8819
9056
  @if (question && question.optionLinkedText) {
@@ -8898,7 +9135,7 @@ class AnswersSlideoutComponent {
8898
9135
  }
8899
9136
  </div>
8900
9137
  </ng-template>
8901
- `, isInline: true, dependencies: [{ kind: "component", type: SlideoutComponent, selector: "co-slideout", inputs: ["show", "resizable"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: AnswerCardComponent, selector: "co-answer-card", inputs: ["model", "valutaSymbol", "showing", "isSelected", "isSmallModus", "freeInput"], outputs: ["freeInputChange", "inqNumberChange", "select", "selectWithInq", "magnifierClick", "answerInfoToggle"] }, { kind: "component", type: ImageZoomComponent, selector: "co-image-zoom", inputs: ["imageData", "show"], outputs: ["showChange"] }, { kind: "component", type: ColorFilterComponent, selector: "co-color-filter", inputs: ["color", "active"] }, { kind: "component", type: TagFilterComponent, selector: "co-tag-filter", inputs: ["tag", "active"] }, { kind: "directive", type: VisibilityObserverDirective, selector: "[visibilityObserver]", inputs: ["observerEnabled"], exportAs: ["intersection"] }, { kind: "directive", type: VisibilityObserverMasterDirective, selector: "[visibilityObserverMaster]" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.PriceDisplayPipe, name: "priceDisplay" }, { kind: "pipe", type: i6.AppendPipe, name: "append" }, { kind: "pipe", type: i6.PrependPipe, name: "prepend" }, { kind: "pipe", type: i6.StripHtmlPipe, name: "stripHtml" }], animations: [
9138
+ `, isInline: true, dependencies: [{ kind: "component", type: SlideoutComponent, selector: "co-slideout", inputs: ["show", "resizable"] }, { kind: "directive", type: i6$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: AnswerCardComponent, selector: "co-answer-card", inputs: ["model", "valutaSymbol", "showing", "isSelected", "isSmallModus", "freeInput"], outputs: ["freeInputChange", "inqNumberChange", "select", "selectWithInq", "magnifierClick", "answerInfoToggle"] }, { kind: "component", type: ImageZoomComponent, selector: "co-image-zoom", inputs: ["imageData", "show"], outputs: ["showChange"] }, { kind: "component", type: ColorFilterComponent, selector: "co-color-filter", inputs: ["color", "active"] }, { kind: "component", type: TagFilterComponent, selector: "co-tag-filter", inputs: ["tag", "active"] }, { kind: "directive", type: VisibilityObserverDirective, selector: "[visibilityObserver]", inputs: ["observerEnabled"], exportAs: ["intersection"] }, { kind: "directive", type: VisibilityObserverMasterDirective, selector: "[visibilityObserverMaster]" }, { kind: "component", type: i4.InputTextChipsComponent, selector: "co-input-text-chips", inputs: ["placeholder", "colorSeqName", "toggleModel", "toggleBoxLabel", "extraIcon"], outputs: ["extraIconClicked", "submit", "toggleModelChange"] }, { kind: "component", type: i4.ButtonComponent, selector: "co-button", inputs: ["label", "iconData", "iconDataRight", "isToggleButton", "isToggled", "hidden", "disabled"], outputs: ["onClick", "clickedWhileDisabled", "isToggledChange"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.PriceDisplayPipe, name: "priceDisplay" }, { kind: "pipe", type: i6.AppendPipe, name: "append" }, { kind: "pipe", type: i6.PrependPipe, name: "prepend" }, { kind: "pipe", type: i6.StripHtmlPipe, name: "stripHtml" }], animations: [
8902
9139
  trigger('showFilter', [
8903
9140
  state('1', style({ transform: 'translateX(0%) scaleX(1)', opacity: 1 })),
8904
9141
  state('void', style({ transform: 'translateX(50%) scaleX(0)', opacity: 0 })),
@@ -8935,19 +9172,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
8935
9172
  </div>
8936
9173
  }
8937
9174
  <ng-template #answerTemplate>
8938
- @if (searchExpanded) {
8939
- <div class="search-wrapper" [@showFilter]="searchExpanded">
8940
- <!-- TODO enable after Angular update -->
8941
- <!-- <co-input-text-chips-->
8942
- <!-- class="text-chips"-->
8943
- <!-- [value]="chipTexts"-->
8944
- <!-- [initFocus]="true"-->
8945
- <!-- extraIcon="cancel"-->
8946
- <!-- (valueChange)="onChipsValueChange($event)"-->
8947
- <!-- (extraIconClicked)="onChipsClose()"-->
8948
- <!-- ></co-input-text-chips>-->
8949
- </div>
8950
- }
8951
9175
  @if (showTitle) {
8952
9176
  <div class="title">
8953
9177
  <h3 [textContent]="(question?.commercialQuestion ? question?.commercialQuestion : question?.question) | localize:true | async"></h3>
@@ -8962,6 +9186,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
8962
9186
  <co-icon [iconData]="iconService.getIcon(icons.Cross)"></co-icon>
8963
9187
  </button>
8964
9188
  }
9189
+ @if (searchExpanded) {
9190
+ <div class="search-wrapper">
9191
+ <co-input-text-chips
9192
+ class="text-chips"
9193
+ [model]="chipTexts"
9194
+ [initFocus]="true"
9195
+ (modelChange)="onChipsValueChange($event)"
9196
+ (extraIconClicked)="onChipsClose()"
9197
+ ></co-input-text-chips>
9198
+ <co-button
9199
+ [iconData]="iconService.getIcon(icons.Cross)"
9200
+ (onClick)="searchExpanded = false"
9201
+ ></co-button>
9202
+ </div>
9203
+ }
8965
9204
  </div>
8966
9205
  }
8967
9206
  @if (question && question.optionLinkedText) {
@@ -9256,7 +9495,7 @@ class CoSummaryLine {
9256
9495
  <ng-content></ng-content>
9257
9496
  </div>
9258
9497
  }
9259
- `, isInline: true, dependencies: [{ kind: "component", type: i4.ImageComponent, selector: "co-image", inputs: ["source", "placeHolder"] }, { kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.PriceDisplayPipe, name: "priceDisplay" }], animations: [
9498
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.ImageComponent, selector: "co-image", inputs: ["source", "placeHolder"] }, { kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.PriceDisplayPipe, name: "priceDisplay" }], animations: [
9260
9499
  trigger('showTheContent', [
9261
9500
  state('void', style({ height: 0, opacity: 0 })),
9262
9501
  state('*', style({ height: '*', opacity: 1 })),
@@ -9508,7 +9747,7 @@ class SelectionsSummaryLineComponent {
9508
9747
  }
9509
9748
  </co-summary-line>
9510
9749
  }
9511
- `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CoSummaryLine, selector: "co-summary-line", inputs: ["imageData", "title", "description", "price", "multilineData", "valutaSymbol", "isHighlighted", "isCollapsable", "canRepeat", "isDeletable", "showContent"], outputs: ["repeatClicked", "deleteClicked"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
9750
+ `, isInline: true, dependencies: [{ kind: "directive", type: i6$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CoSummaryLine, selector: "co-summary-line", inputs: ["imageData", "title", "description", "price", "multilineData", "valutaSymbol", "isHighlighted", "isCollapsable", "canRepeat", "isDeletable", "showContent"], outputs: ["repeatClicked", "deleteClicked"] }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
9512
9751
  }
9513
9752
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: SelectionsSummaryLineComponent, decorators: [{
9514
9753
  type: Component,
@@ -9763,7 +10002,7 @@ class ConfigurationPresetDialogComponent {
9763
10002
  </div>
9764
10003
  </div>
9765
10004
  </ng-template>
9766
- `, 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: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
10005
+ `, 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: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
9767
10006
  }
9768
10007
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetDialogComponent, decorators: [{
9769
10008
  type: Component,
@@ -9917,7 +10156,7 @@ class ConfigurationPresetComponent {
9917
10156
  </div>
9918
10157
  <co-configuration-preset-dialog></co-configuration-preset-dialog>
9919
10158
  }
9920
- `, 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: ConfigurationPresetDialogComponent, selector: "co-configuration-preset-dialog" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
10159
+ `, 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: ConfigurationPresetDialogComponent, selector: "co-configuration-preset-dialog" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
9921
10160
  }
9922
10161
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfigurationPresetComponent, decorators: [{
9923
10162
  type: Component,
@@ -10065,7 +10304,7 @@ class SelectionsSummaryComponent {
10065
10304
  }
10066
10305
  </div>
10067
10306
  }
10068
- `, 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: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i4.PriceDisplayPipe, name: "priceDisplay" }], encapsulation: i0.ViewEncapsulation.None });
10307
+ `, 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: i6$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i4.PriceDisplayPipe, name: "priceDisplay" }], encapsulation: i0.ViewEncapsulation.None });
10069
10308
  }
10070
10309
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: SelectionsSummaryComponent, decorators: [{
10071
10310
  type: Component,
@@ -10275,7 +10514,7 @@ class LiteSelectorComponent {
10275
10514
  ></co-answers-slideout>
10276
10515
  }
10277
10516
  </ng-template>
10278
- `, isInline: true, dependencies: [{ kind: "component", type: AnswersSlideoutComponent, selector: "co-answers-slideout", inputs: ["question", "showTitle", "showFilter", "answers", "useSlideout", "customDimensions"], outputs: ["answerChosen"] }, { kind: "directive", type: i5.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: [
10517
+ `, isInline: true, dependencies: [{ kind: "component", type: AnswersSlideoutComponent, selector: "co-answers-slideout", inputs: ["question", "showTitle", "showFilter", "answers", "useSlideout", "customDimensions"], outputs: ["answerChosen"] }, { kind: "directive", type: i6$1.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: [
10279
10518
  trigger('showSelections', [
10280
10519
  state('void', style({ 'transform': 'translateX(100%)', opacity: 0 })),
10281
10520
  state('*', style({ 'transform': 'translateX(0%)', opacity: 1 })),
@@ -10358,17 +10597,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
10358
10597
  type: Output
10359
10598
  }] } });
10360
10599
 
10361
- class ProductConfiguratorService {
10362
- showChange = new EventEmitter();
10363
- answerChosen = new EventEmitter();
10364
- selectSelection = new EventEmitter();
10365
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
10366
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorService, providedIn: 'root' });
10367
- }
10368
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorService, decorators: [{
10369
- type: Injectable,
10370
- args: [{ providedIn: 'root' }]
10371
- }] });
10600
+ const trackBySelectionIdFn = (index, selection) => {
10601
+ return selection && selection.id ? `${selection.id}-${selection.selected}` : `__NEW__${index}`;
10602
+ };
10372
10603
 
10373
10604
  class ProductConfiguratorSelectorOptionTileComponent {
10374
10605
  configuratorConnectorService;
@@ -10379,94 +10610,152 @@ class ProductConfiguratorSelectorOptionTileComponent {
10379
10610
  }
10380
10611
  icons = IconEnum;
10381
10612
  option;
10382
- tileClass = 'small';
10613
+ tileClass;
10383
10614
  noLabel = false;
10615
+ markAsException = false;
10616
+ set showing(value) {
10617
+ if (value) {
10618
+ this._getThumbnailImage();
10619
+ }
10620
+ }
10384
10621
  selectionClicked = new EventEmitter();
10622
+ class = 'small';
10385
10623
  constructor(configuratorConnectorService, iconService, settingsService) {
10386
10624
  this.configuratorConnectorService = configuratorConnectorService;
10387
10625
  this.iconService = iconService;
10388
10626
  this.settingsService = settingsService;
10389
10627
  }
10628
+ ngOnInit() {
10629
+ if (this.tileClass) {
10630
+ this.class = this._getTileClass();
10631
+ }
10632
+ }
10390
10633
  changeSelection() {
10391
10634
  this.selectionClicked.emit();
10392
10635
  }
10636
+ _getTileClass() {
10637
+ if (this.tileClass === ConfigurationDisplayOption.TileLarge) {
10638
+ return 'large';
10639
+ }
10640
+ else if (this.tileClass === ConfigurationDisplayOption.TileRounded) {
10641
+ return 'rounded';
10642
+ }
10643
+ else if (this.tileClass === ConfigurationDisplayOption.SmallCircle) {
10644
+ return 'small-rounded';
10645
+ }
10646
+ else if (this.tileClass === ConfigurationDisplayOption.SmallSquare) {
10647
+ return 'small-square';
10648
+ }
10649
+ else if (this.tileClass === ConfigurationDisplayOption.HorizontalTiles) {
10650
+ return 'horizontal';
10651
+ }
10652
+ else if (this.tileClass === ConfigurationDisplayOption.OnPage) {
10653
+ return 'on-page';
10654
+ }
10655
+ else if (this.tileClass === ConfigurationDisplayOption.SlideOut) {
10656
+ return 'slide-out';
10657
+ }
10658
+ else {
10659
+ return 'small';
10660
+ }
10661
+ }
10662
+ async _getThumbnailImage() {
10663
+ await this.configuratorConnectorService.getImageForAnswer(this.option);
10664
+ }
10665
+ NodeType = NodeType;
10393
10666
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorOptionTileComponent, deps: [{ token: ConfiguratorConnectorService }, { token: IconCacheService }, { token: ConfiguratorSettingsService }], target: i0.ɵɵFactoryTarget.Component });
10394
- 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: `
10395
- <!-- When selected show checkmark -->
10396
- <div
10397
- class="configurator-selector-option-tile-container configurator-selector-option-tile-container-{{this.tileClass}}"
10398
- (click)="changeSelection()" [class.active]="option.selected ==='F'">
10399
- @if (option.selected ==='F') {
10400
- <div class="product-configurator-selector-option-tile-checkmark">
10401
- <co-icon class="product-configurator-selector-option-tile-selected"
10402
- [iconData]="iconService.getIcon(icons.CheckSolid)">
10403
- </co-icon>
10404
- </div>
10405
- }
10406
- <!-- Image -->
10407
- <div class="product-configurator-selector-option-tile-image">
10408
- @if (option.imageData) {
10409
- <img [src]="option.imageData" [alt]="option.artNodeId">
10410
- }
10411
- @if (!option.imageData) {
10412
- <co-icon class="product-configurator-selector-option-button-no-image"
10413
- [iconData]="iconService.getIcon(icons.ImageSlashRegular)">
10414
- </co-icon>
10667
+ 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", markAsException: "markAsException", showing: "showing" }, outputs: { selectionClicked: "selectionClicked" }, host: { properties: { "class.co-product-configurator-selector-option-tile": "this.showClass" } }, ngImport: i0, template: `
10668
+ <!-- When selected show checkmark -->
10669
+ <div
10670
+ class="configurator-selector-option-tile-container configurator-selector-option-tile-container-{{this.class}}"
10671
+ (click)="changeSelection()" [class.active]="option.selected ==='F'">
10672
+ @if (option.selected === 'F') {
10673
+ @if (option.nodeType === NodeType.Article) {
10674
+ <div class="product-configurator-selector-option-tile-configurable" [class.exception]="markAsException">
10675
+ <co-icon class="product-configurator-selector-option-tile-selected"
10676
+ [iconData]="iconService.getIcon(icons.Brush)">
10677
+ </co-icon>
10678
+ </div>
10679
+ } @else {
10680
+ <div class="product-configurator-selector-option-tile-checkmark">
10681
+ <co-icon class="product-configurator-selector-option-tile-selected"
10682
+ [iconData]="iconService.getIcon(icons.CheckSolid)">
10683
+ </co-icon>
10684
+ </div>
10685
+ }
10415
10686
  }
10416
- </div>
10417
- <!-- Answer text -->
10687
+ <!-- Image -->
10688
+ <div class="product-configurator-selector-option-tile-image">
10689
+ @if (option.imageData) {
10690
+ <img [src]="option.imageData" [alt]="option.artNodeId">
10691
+ }
10692
+ @if (!option.imageData) {
10693
+ <co-icon class="product-configurator-selector-option-button-no-image"
10694
+ [iconData]="iconService.getIcon(icons.ImageSlashRegular)">
10695
+ </co-icon>
10696
+ }
10697
+ </div>
10698
+ <!-- Answer text -->
10418
10699
  @if (!noLabel) {
10419
- <div class="product-configurator-selector-option-tile-description">
10420
- @if (option.nodeText) {
10421
- <p [textContent]="option.nodeText | localize:true | async"></p>
10422
- }
10423
- @if (!option.nodeText) {
10424
- <p [textContent]="'Skip / Cancel' | localize:true | async"></p>
10425
- }
10426
- </div>
10700
+ <div class="product-configurator-selector-option-tile-description">
10701
+ @if (option.nodeText) {
10702
+ <p [textContent]="option.nodeText | localize:true | async"></p>
10703
+ }
10704
+ @if (!option.nodeText) {
10705
+ <p [textContent]="'Skip / Cancel' | localize:true | async"></p>
10706
+ }
10707
+ </div>
10427
10708
  }
10428
- </div>
10429
- `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
10709
+ </div>
10710
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
10430
10711
  }
10431
10712
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorOptionTileComponent, decorators: [{
10432
10713
  type: Component,
10433
10714
  args: [{
10434
10715
  selector: 'co-product-configurator-selector-option-tile',
10435
10716
  template: `
10436
- <!-- When selected show checkmark -->
10437
- <div
10438
- class="configurator-selector-option-tile-container configurator-selector-option-tile-container-{{this.tileClass}}"
10439
- (click)="changeSelection()" [class.active]="option.selected ==='F'">
10440
- @if (option.selected ==='F') {
10441
- <div class="product-configurator-selector-option-tile-checkmark">
10442
- <co-icon class="product-configurator-selector-option-tile-selected"
10443
- [iconData]="iconService.getIcon(icons.CheckSolid)">
10444
- </co-icon>
10445
- </div>
10446
- }
10447
- <!-- Image -->
10448
- <div class="product-configurator-selector-option-tile-image">
10449
- @if (option.imageData) {
10450
- <img [src]="option.imageData" [alt]="option.artNodeId">
10451
- }
10452
- @if (!option.imageData) {
10453
- <co-icon class="product-configurator-selector-option-button-no-image"
10454
- [iconData]="iconService.getIcon(icons.ImageSlashRegular)">
10455
- </co-icon>
10717
+ <!-- When selected show checkmark -->
10718
+ <div
10719
+ class="configurator-selector-option-tile-container configurator-selector-option-tile-container-{{this.class}}"
10720
+ (click)="changeSelection()" [class.active]="option.selected ==='F'">
10721
+ @if (option.selected === 'F') {
10722
+ @if (option.nodeType === NodeType.Article) {
10723
+ <div class="product-configurator-selector-option-tile-configurable" [class.exception]="markAsException">
10724
+ <co-icon class="product-configurator-selector-option-tile-selected"
10725
+ [iconData]="iconService.getIcon(icons.Brush)">
10726
+ </co-icon>
10727
+ </div>
10728
+ } @else {
10729
+ <div class="product-configurator-selector-option-tile-checkmark">
10730
+ <co-icon class="product-configurator-selector-option-tile-selected"
10731
+ [iconData]="iconService.getIcon(icons.CheckSolid)">
10732
+ </co-icon>
10733
+ </div>
10734
+ }
10456
10735
  }
10457
- </div>
10458
- <!-- Answer text -->
10736
+ <!-- Image -->
10737
+ <div class="product-configurator-selector-option-tile-image">
10738
+ @if (option.imageData) {
10739
+ <img [src]="option.imageData" [alt]="option.artNodeId">
10740
+ }
10741
+ @if (!option.imageData) {
10742
+ <co-icon class="product-configurator-selector-option-button-no-image"
10743
+ [iconData]="iconService.getIcon(icons.ImageSlashRegular)">
10744
+ </co-icon>
10745
+ }
10746
+ </div>
10747
+ <!-- Answer text -->
10459
10748
  @if (!noLabel) {
10460
- <div class="product-configurator-selector-option-tile-description">
10461
- @if (option.nodeText) {
10462
- <p [textContent]="option.nodeText | localize:true | async"></p>
10463
- }
10464
- @if (!option.nodeText) {
10465
- <p [textContent]="'Skip / Cancel' | localize:true | async"></p>
10466
- }
10467
- </div>
10749
+ <div class="product-configurator-selector-option-tile-description">
10750
+ @if (option.nodeText) {
10751
+ <p [textContent]="option.nodeText | localize:true | async"></p>
10752
+ }
10753
+ @if (!option.nodeText) {
10754
+ <p [textContent]="'Skip / Cancel' | localize:true | async"></p>
10755
+ }
10756
+ </div>
10468
10757
  }
10469
- </div>
10758
+ </div>
10470
10759
  `,
10471
10760
  encapsulation: ViewEncapsulation.None,
10472
10761
  standalone: false
@@ -10480,6 +10769,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
10480
10769
  type: Input
10481
10770
  }], noLabel: [{
10482
10771
  type: Input
10772
+ }], markAsException: [{
10773
+ type: Input
10774
+ }], showing: [{
10775
+ type: Input
10483
10776
  }], selectionClicked: [{
10484
10777
  type: Output
10485
10778
  }] } });
@@ -10529,7 +10822,7 @@ class ProductConfiguratorOptionCheckboxComponent {
10529
10822
  </div>
10530
10823
  </div>
10531
10824
 
10532
- `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
10825
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
10533
10826
  }
10534
10827
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorOptionCheckboxComponent, decorators: [{
10535
10828
  type: Component,
@@ -10613,7 +10906,7 @@ class ProductConfiguratorSelectorOptionButtonComponent {
10613
10906
  }
10614
10907
  </div>
10615
10908
  </div>
10616
- `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
10909
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
10617
10910
  }
10618
10911
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorOptionButtonComponent, decorators: [{
10619
10912
  type: Component,
@@ -10695,7 +10988,7 @@ class ProductConfiguratorSelectorOptionDropDownComponent {
10695
10988
  </co-icon>
10696
10989
  </div>
10697
10990
  </div>
10698
- `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
10991
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
10699
10992
  }
10700
10993
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorOptionDropDownComponent, decorators: [{
10701
10994
  type: Component,
@@ -10739,38 +11032,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
10739
11032
  class ProductConfiguratorSelectorOptionComponent {
10740
11033
  configuratorConnectorService;
10741
11034
  settingsService;
10742
- productConfiguratorService;
11035
+ _appEventService;
11036
+ trackBySelectionIdFn = trackBySelectionIdFn;
11037
+ smallTileOptions = [
11038
+ ConfigurationDisplayOption.TileSmall,
11039
+ ConfigurationDisplayOption.SmallCircle,
11040
+ ConfigurationDisplayOption.SmallSquare
11041
+ ];
11042
+ largeTileOptions = [
11043
+ ConfigurationDisplayOption.TileLarge,
11044
+ ConfigurationDisplayOption.TileRounded
11045
+ ];
10743
11046
  showClass() {
10744
11047
  return true;
10745
11048
  }
10746
11049
  selection;
10747
11050
  listOfChoices;
10748
11051
  markAsException;
10749
- showGlobalAll = false;
10750
- groupedSubShow = true;
11052
+ limitAmountOfTiles = false;
11053
+ maxVisibleTiles = 5;
11054
+ maxVisibleSmallTiles = 10;
11055
+ selectionClicked = new EventEmitter();
10751
11056
  configurationDisplayOption = ConfigurationDisplayOption;
10752
11057
  selectionClass = '';
10753
11058
  showAllTiles = false;
10754
- maxVisibleTiles = 10;
10755
- maxVisibleSmallTiles = 7;
10756
- visibleAnswers = [];
10757
11059
  remainingTilesCount = 0;
10758
- smallTileOptions = [
10759
- ConfigurationDisplayOption.TileSmall,
10760
- ConfigurationDisplayOption.SmallCircle,
10761
- ConfigurationDisplayOption.SmallSquare
10762
- ];
10763
- largeTileOptions = [
10764
- ConfigurationDisplayOption.TileLarge,
10765
- ConfigurationDisplayOption.TileRounded
10766
- ];
10767
- constructor(configuratorConnectorService, settingsService, productConfiguratorService) {
11060
+ amountOfTilesToShow = 0;
11061
+ showViewMoreButton = true;
11062
+ _subs = [];
11063
+ constructor(configuratorConnectorService, settingsService, _appEventService) {
10768
11064
  this.configuratorConnectorService = configuratorConnectorService;
10769
11065
  this.settingsService = settingsService;
10770
- this.productConfiguratorService = productConfiguratorService;
11066
+ this._appEventService = _appEventService;
11067
+ this._subs.push(this._appEventService.showAllConfigurationOptions.subscribe(show => {
11068
+ this._handleShowAll(show);
11069
+ }));
10771
11070
  }
10772
11071
  ngOnInit() {
10773
- if (this.selection && this.selection.displayOptionControl == null) {
11072
+ if (this.selection && this.selection.displayOptionControl === null || this.selection.displayOptionControl === undefined) {
10774
11073
  this.selection.displayOptionControl = ConfigurationDisplayOption.TileLarge;
10775
11074
  }
10776
11075
  if (this.markAsException) {
@@ -10779,160 +11078,126 @@ class ProductConfiguratorSelectorOptionComponent {
10779
11078
  else {
10780
11079
  this.selectionClass = 'selection-container-' + this.selection.displayOptionControl;
10781
11080
  }
10782
- if (this.selection && this.selection.opvTreeNodeHierarchy && this.selection.nodeType === NodeType.Question) {
10783
- // When the selection has a opvTreeNodeHierarchy and has nodeType OPT means we need to add a cancel/ skip option.
10784
- // This is different from the slide out comp/ selector.
10785
- // But we need to make a copy of it, if we do not do that, we are missing the right header...
10786
- const selectionCopy = Object.assign(new SelectorStructure(), this.selection);
10787
- this.configuratorConnectorService.getImageForAnswer(selectionCopy);
10788
- this.listOfChoices.push(selectionCopy);
10789
- }
10790
- if (this.showGlobalAll) {
10791
- this.showAllTiles = true;
10792
- }
11081
+ this.amountOfTilesToShow = this.listOfChoices.length; // Set the default amount to show.
11082
+ this.showViewMoreButton = !this.settingsService.settings.options.groupedShowAllBtn;
10793
11083
  this._calculateVisibleAnswers();
10794
11084
  }
10795
- ngOnChanges(changes) {
10796
- if (changes.showGlobalAll && !changes.showGlobalAll.firstChange) {
10797
- this.showAllTiles = !!changes.showGlobalAll.currentValue;
10798
- this._calculateVisibleAnswers();
10799
- }
10800
- if (changes.listOfChoices && !changes.listOfChoices.firstChange) {
10801
- this._calculateVisibleAnswers();
10802
- }
10803
- if (changes.selection && !changes.selection.firstChange) {
10804
- this._calculateVisibleAnswers();
10805
- }
11085
+ ngOnDestroy() {
11086
+ this._subs.forEach(s => s.unsubscribe());
10806
11087
  }
10807
- selectionClicked(answer) {
10808
- this.productConfiguratorService.selectSelection.emit(answer);
11088
+ handleSelectionClicked(answer) {
11089
+ this.selectionClicked.emit(answer);
10809
11090
  }
10810
11091
  showMore() {
10811
11092
  this.showAllTiles = true;
11093
+ this.amountOfTilesToShow = this.listOfChoices.length;
10812
11094
  this._calculateVisibleAnswers();
10813
11095
  }
10814
11096
  showLess() {
10815
11097
  this.showAllTiles = false;
10816
11098
  this._calculateVisibleAnswers();
10817
11099
  }
10818
- getTileClass() {
10819
- switch (this.selection.displayOptionControl) {
10820
- case this.configurationDisplayOption.TileLarge:
10821
- return 'large';
10822
- case this.configurationDisplayOption.TileRounded:
10823
- return 'rounded';
10824
- case this.configurationDisplayOption.SmallCircle:
10825
- return 'small-rounded';
10826
- case this.configurationDisplayOption.SmallSquare:
10827
- return 'small-square';
10828
- default:
10829
- return 'small';
10830
- }
10831
- }
10832
11100
  _calculateVisibleAnswers() {
10833
- if (this.largeTileOptions.includes(this.selection.displayOptionControl)) {
10834
- const configuredMaxVisibleTiles = this.settingsService?.settings?.options?.maxVisibleTiles;
10835
- if (configuredMaxVisibleTiles != null) {
10836
- this.maxVisibleTiles = configuredMaxVisibleTiles;
10837
- }
10838
- this.visibleAnswers = this.showAllTiles
10839
- ? this.listOfChoices
10840
- : this.listOfChoices.slice(0, this.maxVisibleTiles);
10841
- this.remainingTilesCount = Math.max(0, this.listOfChoices.length - this.maxVisibleTiles);
10842
- }
10843
- else if (this.smallTileOptions.includes(this.selection.displayOptionControl)) {
10844
- const configuredMaxVisibleTiles = this.settingsService?.settings?.options?.maxVisibleSmallTiles;
10845
- if (configuredMaxVisibleTiles != null) {
10846
- this.maxVisibleSmallTiles = configuredMaxVisibleTiles;
10847
- }
10848
- this.visibleAnswers = this.showAllTiles
10849
- ? this.listOfChoices
10850
- : this.listOfChoices.slice(0, this.maxVisibleSmallTiles);
10851
- this.remainingTilesCount = Math.max(0, this.listOfChoices.length - this.maxVisibleSmallTiles);
11101
+ if (this.limitAmountOfTiles && !this.showAllTiles) {
11102
+ if (this.largeTileOptions.includes(this.selection.displayOptionControl)) {
11103
+ this.amountOfTilesToShow = this.maxVisibleTiles;
11104
+ this.remainingTilesCount = Math.max(0, this.listOfChoices.length - this.maxVisibleTiles);
11105
+ }
11106
+ else if (this.smallTileOptions.includes(this.selection.displayOptionControl)) {
11107
+ this.amountOfTilesToShow = this.maxVisibleSmallTiles;
11108
+ this.remainingTilesCount = Math.max(0, this.listOfChoices.length - this.maxVisibleSmallTiles);
11109
+ }
11110
+ else {
11111
+ this.remainingTilesCount = 0;
11112
+ }
10852
11113
  }
10853
- else {
10854
- this.visibleAnswers = this.listOfChoices;
10855
- this.remainingTilesCount = 0;
10856
- }
10857
- }
10858
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorOptionComponent, deps: [{ token: ConfiguratorConnectorService }, { token: ConfiguratorSettingsService }, { token: ProductConfiguratorService }], target: i0.ɵɵFactoryTarget.Component });
10859
- 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: `
10860
- <div class="selector-wrapper {{this.selectionClass}}">
10861
- @if (this.selection.displayOptionControl !== configurationDisplayOption.DropDown
10862
- && !this.largeTileOptions.includes(this.selection.displayOptionControl)
10863
- && !this.smallTileOptions.includes(this.selection.displayOptionControl)) {
10864
- @for (child of listOfChoices; track child.id) {
10865
- <div class="selector-option-wrapper" [class.active]="child.selected ==='F'">
10866
- @if (this.selection.displayOptionControl === configurationDisplayOption.Button) {
10867
- <co-product-configurator-selector-option-button
11114
+ }
11115
+ _handleShowAll(show) {
11116
+ this.limitAmountOfTiles = false;
11117
+ this.showAllTiles = true;
11118
+ this.amountOfTilesToShow = this.listOfChoices.length;
11119
+ this._calculateVisibleAnswers();
11120
+ }
11121
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorOptionComponent, deps: [{ token: ConfiguratorConnectorService }, { token: ConfiguratorSettingsService }, { token: ConfiguratorEventService }], target: i0.ɵɵFactoryTarget.Component });
11122
+ 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", limitAmountOfTiles: "limitAmountOfTiles", maxVisibleTiles: "maxVisibleTiles", maxVisibleSmallTiles: "maxVisibleSmallTiles" }, outputs: { selectionClicked: "selectionClicked" }, host: { properties: { "class.co-product-configurator-selector-option": "this.showClass" } }, ngImport: i0, template: `
11123
+ <div class="selector-wrapper {{selectionClass}}" visibilityObserverMaster>
11124
+ @if (selection.displayOptionControl !== configurationDisplayOption.DropDown && !largeTileOptions.includes(selection.displayOptionControl) && !smallTileOptions.includes(selection.displayOptionControl)) {
11125
+ @for (child of listOfChoices; track trackBySelectionIdFn($index, child); ) {
11126
+ <div
11127
+ class="selector-option-wrapper"
11128
+ [class.active]="child.selected ==='F'"
11129
+ [class.exception]="child.selected ==='F' && markAsException">
11130
+ @if (selection.displayOptionControl === configurationDisplayOption.Button) {
11131
+ <co-product-configurator-selector-option-button
10868
11132
  [option]="child"
10869
- (selectionClicked)="selectionClicked(child)">
11133
+ (selectionClicked)="handleSelectionClicked(child)">
10870
11134
  </co-product-configurator-selector-option-button>
10871
11135
  }
10872
- @if (this.selection.displayOptionControl === configurationDisplayOption.ListOfValues) {
11136
+ @if (selection.displayOptionControl === configurationDisplayOption.ListOfValues) {
10873
11137
  <co-product-configurator-option-checkbox
10874
11138
  [option]="child"
10875
- (selectionClicked)="selectionClicked(child)">
11139
+ (selectionClicked)="handleSelectionClicked(child)">
10876
11140
  </co-product-configurator-option-checkbox>
10877
11141
  }
10878
- @if (this.selection.displayOptionControl === configurationDisplayOption.TileRounded) {
11142
+ @if (selection.displayOptionControl === configurationDisplayOption.TileRounded) {
10879
11143
  <co-product-configurator-selector-option-tile
10880
11144
  [option]="child"
10881
- [tileClass]="'rounded'"
10882
- (selectionClicked)="selectionClicked(child)">
11145
+ [tileClass]="selection.displayOptionControl"
11146
+ (selectionClicked)="handleSelectionClicked(child)">
10883
11147
  </co-product-configurator-selector-option-tile>
10884
11148
  }
10885
- @if (this.selection.displayOptionControl === configurationDisplayOption.HorizontalTiles) {
11149
+ @if (selection.displayOptionControl === configurationDisplayOption.HorizontalTiles) {
10886
11150
  <co-product-configurator-selector-option-tile
10887
11151
  [option]="child"
10888
- [tileClass]="'horizontal'"
10889
- (selectionClicked)="selectionClicked(child)">
11152
+ [tileClass]="selection.displayOptionControl"
11153
+ (selectionClicked)="handleSelectionClicked(child)">
10890
11154
  </co-product-configurator-selector-option-tile>
10891
11155
  }
10892
- @if (this.selection.displayOptionControl === configurationDisplayOption.OnPage) {
11156
+ @if (selection.displayOptionControl === configurationDisplayOption.OnPage) {
10893
11157
  <co-product-configurator-selector-option-tile
10894
- [option]="child"
10895
- [tileClass]="'on-page'"
10896
- (selectionClicked)="selectionClicked(child)">
11158
+ [option]="child"
11159
+ [tileClass]="selection.displayOptionControl"
11160
+ (selectionClicked)="handleSelectionClicked(child)">
10897
11161
  </co-product-configurator-selector-option-tile>
10898
11162
  }
10899
- @if (this.selection.displayOptionControl === configurationDisplayOption.SlideOut) {
11163
+ @if (selection.displayOptionControl === configurationDisplayOption.SlideOut) {
10900
11164
  <co-product-configurator-selector-option-tile
10901
- [option]="child"
10902
- [tileClass]="'slide-out'"
10903
- (selectionClicked)="selectionClicked(child)">
11165
+ [option]="child"
11166
+ [tileClass]="selection.displayOptionControl"
11167
+ (selectionClicked)="handleSelectionClicked(child)">
10904
11168
  </co-product-configurator-selector-option-tile>
10905
11169
  }
10906
11170
  </div>
10907
11171
  }
10908
11172
  }
10909
-
10910
- @if (
10911
- this.largeTileOptions.includes(this.selection.displayOptionControl)
10912
- || this.smallTileOptions.includes(this.selection.displayOptionControl)) {
10913
- @for (child of visibleAnswers; track child.id) {
10914
- <div class="selector-option-wrapper" [class.active]="child.selected ==='F'">
11173
+ @if (largeTileOptions.includes(selection.displayOptionControl) || smallTileOptions.includes(selection.displayOptionControl)) {
11174
+ @for (child of listOfChoices | slice:0:amountOfTilesToShow; track trackBySelectionIdFn($index, child)) {
11175
+ <div
11176
+ class="selector-option-wrapper"
11177
+ [class.active]="child.selected ==='F'"
11178
+ [class.exception]="child.selected ==='F' && markAsException">
10915
11179
  <co-product-configurator-selector-option-tile
11180
+ visibilityObserver
11181
+ #intersection="intersection"
11182
+ [observerEnabled]="true"
11183
+ [showing]="intersection.isIntersecting"
10916
11184
  [option]="child"
10917
- [noLabel]="this.selection.displayOptionControl === configurationDisplayOption.SmallCircle || this.selection.displayOptionControl === configurationDisplayOption.SmallSquare"
10918
- [tileClass]="getTileClass()"
10919
- (selectionClicked)="selectionClicked(child)"
11185
+ [markAsException]="markAsException"
11186
+ [noLabel]="selection.displayOptionControl === configurationDisplayOption.SmallCircle || selection.displayOptionControl === configurationDisplayOption.SmallSquare"
11187
+ [tileClass]="selection.displayOptionControl"
11188
+ (selectionClicked)="handleSelectionClicked(child)"
10920
11189
  ></co-product-configurator-selector-option-tile>
10921
11190
  </div>
10922
11191
  }
10923
11192
  }
10924
-
10925
- @if (this.selection.displayOptionControl === configurationDisplayOption.DropDown) {
11193
+ @if (selection.displayOptionControl === configurationDisplayOption.DropDown) {
10926
11194
  <co-product-configurator-selector-option-dropdown
10927
11195
  [options]="listOfChoices"
10928
- (selectionClicked)="selectionClicked($event)"
11196
+ (selectionClicked)="handleSelectionClicked($event)"
10929
11197
  ></co-product-configurator-selector-option-dropdown>
10930
11198
  }
10931
11199
  </div>
10932
-
10933
- @if (
10934
- (this.largeTileOptions.includes(this.selection.displayOptionControl) ||
10935
- this.smallTileOptions.includes(this.selection.displayOptionControl)) && groupedSubShow) {
11200
+ @if (showViewMoreButton && (largeTileOptions.includes(selection.displayOptionControl) || smallTileOptions.includes(selection.displayOptionControl))) {
10936
11201
  @if (!showAllTiles && remainingTilesCount > 0) {
10937
11202
  <div class="show-more-container">
10938
11203
  <span (click)="showMore()">
@@ -10948,96 +11213,91 @@ class ProductConfiguratorSelectorOptionComponent {
10948
11213
  </div>
10949
11214
  }
10950
11215
  }
10951
-
10952
- `, 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: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], animations: [
10953
- trigger('showSelections', [
10954
- state('void', style({ 'transform': 'translateX(100%)', opacity: 0 })),
10955
- state('*', style({ 'transform': 'translateX(0%)', opacity: 1 })),
10956
- transition('void <=> *', animate(200))
10957
- ])
10958
- ], encapsulation: i0.ViewEncapsulation.None });
11216
+ `, isInline: true, dependencies: [{ kind: "component", type: ProductConfiguratorSelectorOptionTileComponent, selector: "co-product-configurator-selector-option-tile", inputs: ["option", "tileClass", "noLabel", "markAsException", "showing"], 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: "directive", type: VisibilityObserverDirective, selector: "[visibilityObserver]", inputs: ["observerEnabled"], exportAs: ["intersection"] }, { kind: "directive", type: VisibilityObserverMasterDirective, selector: "[visibilityObserverMaster]" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6$1.SlicePipe, name: "slice" }], encapsulation: i0.ViewEncapsulation.None });
10959
11217
  }
10960
11218
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorOptionComponent, decorators: [{
10961
11219
  type: Component,
10962
11220
  args: [{
10963
11221
  selector: 'co-product-configurator-selector-option',
10964
11222
  template: `
10965
- <div class="selector-wrapper {{this.selectionClass}}">
10966
- @if (this.selection.displayOptionControl !== configurationDisplayOption.DropDown
10967
- && !this.largeTileOptions.includes(this.selection.displayOptionControl)
10968
- && !this.smallTileOptions.includes(this.selection.displayOptionControl)) {
10969
- @for (child of listOfChoices; track child.id) {
10970
- <div class="selector-option-wrapper" [class.active]="child.selected ==='F'">
10971
- @if (this.selection.displayOptionControl === configurationDisplayOption.Button) {
11223
+ <div class="selector-wrapper {{selectionClass}}" visibilityObserverMaster>
11224
+ @if (selection.displayOptionControl !== configurationDisplayOption.DropDown && !largeTileOptions.includes(selection.displayOptionControl) && !smallTileOptions.includes(selection.displayOptionControl)) {
11225
+ @for (child of listOfChoices; track trackBySelectionIdFn($index, child); ) {
11226
+ <div
11227
+ class="selector-option-wrapper"
11228
+ [class.active]="child.selected ==='F'"
11229
+ [class.exception]="child.selected ==='F' && markAsException">
11230
+ @if (selection.displayOptionControl === configurationDisplayOption.Button) {
10972
11231
  <co-product-configurator-selector-option-button
10973
11232
  [option]="child"
10974
- (selectionClicked)="selectionClicked(child)">
11233
+ (selectionClicked)="handleSelectionClicked(child)">
10975
11234
  </co-product-configurator-selector-option-button>
10976
11235
  }
10977
- @if (this.selection.displayOptionControl === configurationDisplayOption.ListOfValues) {
11236
+ @if (selection.displayOptionControl === configurationDisplayOption.ListOfValues) {
10978
11237
  <co-product-configurator-option-checkbox
10979
11238
  [option]="child"
10980
- (selectionClicked)="selectionClicked(child)">
11239
+ (selectionClicked)="handleSelectionClicked(child)">
10981
11240
  </co-product-configurator-option-checkbox>
10982
11241
  }
10983
- @if (this.selection.displayOptionControl === configurationDisplayOption.TileRounded) {
11242
+ @if (selection.displayOptionControl === configurationDisplayOption.TileRounded) {
10984
11243
  <co-product-configurator-selector-option-tile
10985
11244
  [option]="child"
10986
- [tileClass]="'rounded'"
10987
- (selectionClicked)="selectionClicked(child)">
11245
+ [tileClass]="selection.displayOptionControl"
11246
+ (selectionClicked)="handleSelectionClicked(child)">
10988
11247
  </co-product-configurator-selector-option-tile>
10989
11248
  }
10990
- @if (this.selection.displayOptionControl === configurationDisplayOption.HorizontalTiles) {
11249
+ @if (selection.displayOptionControl === configurationDisplayOption.HorizontalTiles) {
10991
11250
  <co-product-configurator-selector-option-tile
10992
11251
  [option]="child"
10993
- [tileClass]="'horizontal'"
10994
- (selectionClicked)="selectionClicked(child)">
11252
+ [tileClass]="selection.displayOptionControl"
11253
+ (selectionClicked)="handleSelectionClicked(child)">
10995
11254
  </co-product-configurator-selector-option-tile>
10996
11255
  }
10997
- @if (this.selection.displayOptionControl === configurationDisplayOption.OnPage) {
11256
+ @if (selection.displayOptionControl === configurationDisplayOption.OnPage) {
10998
11257
  <co-product-configurator-selector-option-tile
10999
- [option]="child"
11000
- [tileClass]="'on-page'"
11001
- (selectionClicked)="selectionClicked(child)">
11258
+ [option]="child"
11259
+ [tileClass]="selection.displayOptionControl"
11260
+ (selectionClicked)="handleSelectionClicked(child)">
11002
11261
  </co-product-configurator-selector-option-tile>
11003
11262
  }
11004
- @if (this.selection.displayOptionControl === configurationDisplayOption.SlideOut) {
11263
+ @if (selection.displayOptionControl === configurationDisplayOption.SlideOut) {
11005
11264
  <co-product-configurator-selector-option-tile
11006
- [option]="child"
11007
- [tileClass]="'slide-out'"
11008
- (selectionClicked)="selectionClicked(child)">
11265
+ [option]="child"
11266
+ [tileClass]="selection.displayOptionControl"
11267
+ (selectionClicked)="handleSelectionClicked(child)">
11009
11268
  </co-product-configurator-selector-option-tile>
11010
11269
  }
11011
11270
  </div>
11012
11271
  }
11013
11272
  }
11014
-
11015
- @if (
11016
- this.largeTileOptions.includes(this.selection.displayOptionControl)
11017
- || this.smallTileOptions.includes(this.selection.displayOptionControl)) {
11018
- @for (child of visibleAnswers; track child.id) {
11019
- <div class="selector-option-wrapper" [class.active]="child.selected ==='F'">
11273
+ @if (largeTileOptions.includes(selection.displayOptionControl) || smallTileOptions.includes(selection.displayOptionControl)) {
11274
+ @for (child of listOfChoices | slice:0:amountOfTilesToShow; track trackBySelectionIdFn($index, child)) {
11275
+ <div
11276
+ class="selector-option-wrapper"
11277
+ [class.active]="child.selected ==='F'"
11278
+ [class.exception]="child.selected ==='F' && markAsException">
11020
11279
  <co-product-configurator-selector-option-tile
11280
+ visibilityObserver
11281
+ #intersection="intersection"
11282
+ [observerEnabled]="true"
11283
+ [showing]="intersection.isIntersecting"
11021
11284
  [option]="child"
11022
- [noLabel]="this.selection.displayOptionControl === configurationDisplayOption.SmallCircle || this.selection.displayOptionControl === configurationDisplayOption.SmallSquare"
11023
- [tileClass]="getTileClass()"
11024
- (selectionClicked)="selectionClicked(child)"
11285
+ [markAsException]="markAsException"
11286
+ [noLabel]="selection.displayOptionControl === configurationDisplayOption.SmallCircle || selection.displayOptionControl === configurationDisplayOption.SmallSquare"
11287
+ [tileClass]="selection.displayOptionControl"
11288
+ (selectionClicked)="handleSelectionClicked(child)"
11025
11289
  ></co-product-configurator-selector-option-tile>
11026
11290
  </div>
11027
11291
  }
11028
11292
  }
11029
-
11030
- @if (this.selection.displayOptionControl === configurationDisplayOption.DropDown) {
11293
+ @if (selection.displayOptionControl === configurationDisplayOption.DropDown) {
11031
11294
  <co-product-configurator-selector-option-dropdown
11032
11295
  [options]="listOfChoices"
11033
- (selectionClicked)="selectionClicked($event)"
11296
+ (selectionClicked)="handleSelectionClicked($event)"
11034
11297
  ></co-product-configurator-selector-option-dropdown>
11035
11298
  }
11036
11299
  </div>
11037
-
11038
- @if (
11039
- (this.largeTileOptions.includes(this.selection.displayOptionControl) ||
11040
- this.smallTileOptions.includes(this.selection.displayOptionControl)) && groupedSubShow) {
11300
+ @if (showViewMoreButton && (largeTileOptions.includes(selection.displayOptionControl) || smallTileOptions.includes(selection.displayOptionControl))) {
11041
11301
  @if (!showAllTiles && remainingTilesCount > 0) {
11042
11302
  <div class="show-more-container">
11043
11303
  <span (click)="showMore()">
@@ -11053,19 +11313,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
11053
11313
  </div>
11054
11314
  }
11055
11315
  }
11056
-
11057
- `,
11316
+ `,
11058
11317
  encapsulation: ViewEncapsulation.None,
11059
- animations: [
11060
- trigger('showSelections', [
11061
- state('void', style({ 'transform': 'translateX(100%)', opacity: 0 })),
11062
- state('*', style({ 'transform': 'translateX(0%)', opacity: 1 })),
11063
- transition('void <=> *', animate(200))
11064
- ])
11065
- ],
11066
11318
  standalone: false
11067
11319
  }]
11068
- }], ctorParameters: () => [{ type: ConfiguratorConnectorService }, { type: ConfiguratorSettingsService }, { type: ProductConfiguratorService }], propDecorators: { showClass: [{
11320
+ }], ctorParameters: () => [{ type: ConfiguratorConnectorService }, { type: ConfiguratorSettingsService }, { type: ConfiguratorEventService }], propDecorators: { showClass: [{
11069
11321
  type: HostBinding,
11070
11322
  args: ['class.co-product-configurator-selector-option']
11071
11323
  }], selection: [{
@@ -11074,80 +11326,589 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
11074
11326
  type: Input
11075
11327
  }], markAsException: [{
11076
11328
  type: Input
11077
- }], showGlobalAll: [{
11329
+ }], limitAmountOfTiles: [{
11330
+ type: Input
11331
+ }], maxVisibleTiles: [{
11332
+ type: Input
11333
+ }], maxVisibleSmallTiles: [{
11334
+ type: Input
11335
+ }], selectionClicked: [{
11336
+ type: Output
11337
+ }] } });
11338
+
11339
+ class ProductConfiguratorRepeatButtonsComponent {
11340
+ iconCacheService;
11341
+ icons = IconEnum;
11342
+ showClass() {
11343
+ return true;
11344
+ }
11345
+ showRepeatButton = false;
11346
+ showDeleteButton = false;
11347
+ repeatClicked = new EventEmitter();
11348
+ deleteClicked = new EventEmitter();
11349
+ constructor(iconCacheService) {
11350
+ this.iconCacheService = iconCacheService;
11351
+ }
11352
+ handleRepeatClick() {
11353
+ this.repeatClicked.emit();
11354
+ }
11355
+ handleDeleteClick() {
11356
+ this.deleteClicked.emit();
11357
+ }
11358
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorRepeatButtonsComponent, deps: [{ token: IconCacheService }], target: i0.ɵɵFactoryTarget.Component });
11359
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ProductConfiguratorRepeatButtonsComponent, isStandalone: false, selector: "co-product-configurator-repeat-buttons", inputs: { showRepeatButton: "showRepeatButton", showDeleteButton: "showDeleteButton" }, outputs: { repeatClicked: "repeatClicked", deleteClicked: "deleteClicked" }, host: { properties: { "class.co-product-configurator-repeat-buttons": "this.showClass" } }, ngImport: i0, template: `
11360
+ @if (showRepeatButton || showDeleteButton) {
11361
+ <div class="button-container">
11362
+ @if (showRepeatButton) {
11363
+ <div class="repeat-button-container">
11364
+ <co-button
11365
+ [iconData]="iconCacheService.getIcon(icons.AddButton)"
11366
+ [label]="'ADD_ELEMENT' | localize:false | async"
11367
+ (onClick)="handleRepeatClick()"
11368
+ ></co-button>
11369
+ </div>
11370
+ }
11371
+
11372
+ @if (showDeleteButton) {
11373
+ <!-- <div class="delete-button-container">-->
11374
+ <!-- <co-button-->
11375
+ <!-- [iconData]="iconCacheService.getIcon(icons.DeleteButton)"-->
11376
+ <!-- (onClick)="handleDeleteClick()"-->
11377
+ <!-- ></co-button>-->
11378
+ <!-- </div>-->
11379
+ }
11380
+ </div>
11381
+ }
11382
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.ButtonComponent, selector: "co-button", inputs: ["label", "iconData", "iconDataRight", "isToggleButton", "isToggled", "hidden", "disabled"], outputs: ["onClick", "clickedWhileDisabled", "isToggledChange"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
11383
+ }
11384
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorRepeatButtonsComponent, decorators: [{
11385
+ type: Component,
11386
+ args: [{
11387
+ selector: 'co-product-configurator-repeat-buttons',
11388
+ template: `
11389
+ @if (showRepeatButton || showDeleteButton) {
11390
+ <div class="button-container">
11391
+ @if (showRepeatButton) {
11392
+ <div class="repeat-button-container">
11393
+ <co-button
11394
+ [iconData]="iconCacheService.getIcon(icons.AddButton)"
11395
+ [label]="'ADD_ELEMENT' | localize:false | async"
11396
+ (onClick)="handleRepeatClick()"
11397
+ ></co-button>
11398
+ </div>
11399
+ }
11400
+
11401
+ @if (showDeleteButton) {
11402
+ <!-- <div class="delete-button-container">-->
11403
+ <!-- <co-button-->
11404
+ <!-- [iconData]="iconCacheService.getIcon(icons.DeleteButton)"-->
11405
+ <!-- (onClick)="handleDeleteClick()"-->
11406
+ <!-- ></co-button>-->
11407
+ <!-- </div>-->
11408
+ }
11409
+ </div>
11410
+ }
11411
+ `,
11412
+ standalone: false,
11413
+ encapsulation: ViewEncapsulation.None
11414
+ }]
11415
+ }], ctorParameters: () => [{ type: IconCacheService }], propDecorators: { showClass: [{
11416
+ type: HostBinding,
11417
+ args: ['class.co-product-configurator-repeat-buttons']
11418
+ }], showRepeatButton: [{
11419
+ type: Input
11420
+ }], showDeleteButton: [{
11421
+ type: Input
11422
+ }], repeatClicked: [{
11423
+ type: Output
11424
+ }], deleteClicked: [{
11425
+ type: Output
11426
+ }] } });
11427
+
11428
+ class ProductConfiguratorSelectorChildArticleComponent {
11429
+ configuratorConnectorService;
11430
+ iconService;
11431
+ _appEventService;
11432
+ icons = IconEnum;
11433
+ showClass() {
11434
+ return true;
11435
+ }
11436
+ selection;
11437
+ listOfChoices;
11438
+ options;
11439
+ repeatedOptions;
11440
+ markAsException = false;
11441
+ selectionClick = new EventEmitter();
11442
+ constructor(configuratorConnectorService, iconService, _appEventService) {
11443
+ this.configuratorConnectorService = configuratorConnectorService;
11444
+ this.iconService = iconService;
11445
+ this._appEventService = _appEventService;
11446
+ }
11447
+ handleOpenChildOptions(selection) {
11448
+ // I have no clue anymore, but on this level could also be a skip cancel that does not need to open a slideout, but just navigateto
11449
+ // This only applies when opvid === 0 and only works for java backend
11450
+ if (selection.opvId === 0) {
11451
+ this.selectionClick.emit(selection);
11452
+ }
11453
+ else {
11454
+ let articleNoChildren = false;
11455
+ if (this.options && this.options.length > 0) {
11456
+ this.options.forEach(option => {
11457
+ if (option.selector.selNodeId === selection.selNodeId && option.selector.nodeType === NodeType.Article) {
11458
+ if (option.selectorOptions && option.selectorOptions.length === 0) {
11459
+ articleNoChildren = true;
11460
+ }
11461
+ }
11462
+ });
11463
+ }
11464
+ // Repeated check aswell
11465
+ if (this.repeatedOptions && this.repeatedOptions.length > 0) {
11466
+ this.repeatedOptions.forEach(option => {
11467
+ if (option.selectorOptions && option.selectorOptions.length > 0) {
11468
+ option.selectorOptions.forEach(child => {
11469
+ if (child.selector.selNodeId === selection.selNodeId && child.selector.nodeType === NodeType.Article) {
11470
+ if (child.selectorOptions && child.selectorOptions.length === 0) {
11471
+ articleNoChildren = true;
11472
+ }
11473
+ }
11474
+ });
11475
+ }
11476
+ });
11477
+ }
11478
+ if (selection.nodeType === NodeType.Article && !articleNoChildren) {
11479
+ const event = {
11480
+ open: true,
11481
+ selNodeId: selection.selNodeId,
11482
+ selection: this.selection,
11483
+ options: this.options,
11484
+ repeatedOptions: this.repeatedOptions,
11485
+ };
11486
+ this._appEventService.openSlideOut.next(event);
11487
+ }
11488
+ else {
11489
+ this.selectionClick.emit(selection);
11490
+ }
11491
+ }
11492
+ }
11493
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorChildArticleComponent, deps: [{ token: ConfiguratorConnectorService }, { token: IconCacheService }, { token: ConfiguratorEventService }], target: i0.ɵɵFactoryTarget.Component });
11494
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: ProductConfiguratorSelectorChildArticleComponent, isStandalone: false, selector: "co-product-configurator-selector-child-article", inputs: { selection: "selection", listOfChoices: "listOfChoices", options: "options", repeatedOptions: "repeatedOptions", markAsException: "markAsException" }, outputs: { selectionClick: "selectionClick" }, host: { properties: { "class.co-product-configurator-selector-child-article": "this.showClass" } }, ngImport: i0, template: `
11495
+ <div class="product-configurator-selector-child-article-container">
11496
+ <div class="product-configurator-selector-child-article-container-headers">
11497
+ <co-product-configurator-selector-option
11498
+ [selection]="selection"
11499
+ [listOfChoices]="listOfChoices"
11500
+ [markAsException]="markAsException"
11501
+ (selectionClicked)="handleOpenChildOptions($event)">
11502
+ </co-product-configurator-selector-option>
11503
+ </div>
11504
+ </div>
11505
+ `, isInline: true, dependencies: [{ kind: "component", type: ProductConfiguratorSelectorOptionComponent, selector: "co-product-configurator-selector-option", inputs: ["selection", "listOfChoices", "markAsException", "limitAmountOfTiles", "maxVisibleTiles", "maxVisibleSmallTiles"], outputs: ["selectionClicked"] }], encapsulation: i0.ViewEncapsulation.None });
11506
+ }
11507
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorChildArticleComponent, decorators: [{
11508
+ type: Component,
11509
+ args: [{
11510
+ selector: 'co-product-configurator-selector-child-article',
11511
+ template: `
11512
+ <div class="product-configurator-selector-child-article-container">
11513
+ <div class="product-configurator-selector-child-article-container-headers">
11514
+ <co-product-configurator-selector-option
11515
+ [selection]="selection"
11516
+ [listOfChoices]="listOfChoices"
11517
+ [markAsException]="markAsException"
11518
+ (selectionClicked)="handleOpenChildOptions($event)">
11519
+ </co-product-configurator-selector-option>
11520
+ </div>
11521
+ </div>
11522
+ `,
11523
+ standalone: false,
11524
+ encapsulation: ViewEncapsulation.None
11525
+ }]
11526
+ }], ctorParameters: () => [{ type: ConfiguratorConnectorService }, { type: IconCacheService }, { type: ConfiguratorEventService }], propDecorators: { showClass: [{
11527
+ type: HostBinding,
11528
+ args: ['class.co-product-configurator-selector-child-article']
11529
+ }], selection: [{
11530
+ type: Input
11531
+ }], listOfChoices: [{
11532
+ type: Input
11533
+ }], options: [{
11534
+ type: Input
11535
+ }], repeatedOptions: [{
11536
+ type: Input
11537
+ }], markAsException: [{
11538
+ type: Input
11539
+ }], selectionClick: [{
11540
+ type: Output
11541
+ }] } });
11542
+
11543
+ class ProductConfiguratorGroupedRepeatableOptionsComponent {
11544
+ configuratorConnectorService;
11545
+ iconCacheService;
11546
+ _appEventService;
11547
+ icons = IconEnum;
11548
+ showClass() {
11549
+ return true;
11550
+ }
11551
+ selection;
11552
+ listOfChoices;
11553
+ repeatedOptions;
11554
+ selectionIndex;
11555
+ options;
11556
+ selectionClick = new EventEmitter();
11557
+ newSelection;
11558
+ optionGroups = [];
11559
+ showAllElements = true;
11560
+ showRepeatedOption = true;
11561
+ _subs = [];
11562
+ constructor(configuratorConnectorService, iconCacheService, _appEventService) {
11563
+ this.configuratorConnectorService = configuratorConnectorService;
11564
+ this.iconCacheService = iconCacheService;
11565
+ this._appEventService = _appEventService;
11566
+ this._subs.push(this._appEventService.checkHiddenRepeatItem.subscribe(selection => {
11567
+ this._handleCheckRepeats(selection);
11568
+ }));
11569
+ }
11570
+ ngOnInit() {
11571
+ this.buildOptionGroups();
11572
+ setTimeout(() => {
11573
+ const el = this.newSelection?.nativeElement;
11574
+ const container = el?.closest('.product-configurator-details');
11575
+ if (el && container) {
11576
+ const offset = 400;
11577
+ const top = el.getBoundingClientRect().top - container.getBoundingClientRect().top + container.scrollTop - offset;
11578
+ container.scrollTo({ top, behavior: 'smooth' });
11579
+ }
11580
+ });
11581
+ }
11582
+ ngOnDestroy() {
11583
+ this._subs.forEach(s => s.unsubscribe());
11584
+ }
11585
+ hasSelectedItem(options) {
11586
+ return options.some(o => o.selected === 'F');
11587
+ }
11588
+ handleSwitchView(showAll) {
11589
+ this.showAllElements = showAll;
11590
+ this.optionGroups = [];
11591
+ this.buildOptionGroups();
11592
+ }
11593
+ handleSelectionClicked(selection, group) {
11594
+ let articleNoChildren = false;
11595
+ if (this.options && this.options.length > 0) {
11596
+ this.options.forEach(option => {
11597
+ if (option.selector.selNodeId === selection.selNodeId && option.selector.nodeType === NodeType.Article) {
11598
+ if (option.selectorOptions && option.selectorOptions.length === 0) {
11599
+ articleNoChildren = true;
11600
+ }
11601
+ }
11602
+ });
11603
+ }
11604
+ // Repeated check aswell
11605
+ if (this.repeatedOptions && this.repeatedOptions.length > 0) {
11606
+ this.repeatedOptions.forEach(option => {
11607
+ if (option.selectorOptions && option.selectorOptions.length > 0) {
11608
+ option.selectorOptions.forEach(child => {
11609
+ if (child.selector.selNodeId === selection.selNodeId && child.selector.nodeType === NodeType.Article) {
11610
+ if (child.selectorOptions && child.selectorOptions.length === 0) {
11611
+ articleNoChildren = true;
11612
+ }
11613
+ }
11614
+ });
11615
+ }
11616
+ });
11617
+ }
11618
+ if (selection.nodeType === NodeType.Article && !articleNoChildren) {
11619
+ this.handleOpenChildOptions(selection, group);
11620
+ }
11621
+ else {
11622
+ this.selectionClick.emit(selection);
11623
+ }
11624
+ }
11625
+ buildOptionGroups() {
11626
+ // Base choices get their own group using the parent selector
11627
+ if (this.listOfChoices?.length > 0) {
11628
+ this.optionGroups.push({
11629
+ selector: this.selection,
11630
+ options: [...this.listOfChoices]
11631
+ });
11632
+ }
11633
+ // Each repeatedOptions entry gets its own isolated group
11634
+ if (this.repeatedOptions?.length > 0) {
11635
+ this.repeatedOptions.forEach(repeat => {
11636
+ if (repeat.selectorOptions?.length > 0) {
11637
+ this.optionGroups.push({
11638
+ selector: repeat.selector,
11639
+ options: repeat.selectorOptions.map(o => o.selector)
11640
+ });
11641
+ }
11642
+ });
11643
+ }
11644
+ if (!this.showAllElements) {
11645
+ // filter out the not selected ones
11646
+ this.optionGroups.forEach(group => {
11647
+ if (group.options && group.options.length > 0) {
11648
+ group.options.forEach(choice => {
11649
+ if (choice.selected === 'F') {
11650
+ group.options = [choice];
11651
+ }
11652
+ });
11653
+ }
11654
+ });
11655
+ }
11656
+ // New addition, when there is only 1 group (the default one) and the selected value is 'skip/ cancel' they do not want to show the group.
11657
+ // Hide the group until the user clicks 'Add element', then show this option.
11658
+ if (this.optionGroups.length === 1) {
11659
+ if (this.optionGroups[0].options.length > 0) {
11660
+ this.optionGroups[0].options.forEach(option => {
11661
+ if (option.opvId === 0 && option.selected === 'F') {
11662
+ this.showRepeatedOption = false;
11663
+ }
11664
+ });
11665
+ }
11666
+ }
11667
+ }
11668
+ handleOpenChildOptions(selection, group) {
11669
+ if (selection.opvId === 0) {
11670
+ this.selectionClick.emit(selection);
11671
+ }
11672
+ else {
11673
+ const event = {
11674
+ open: true,
11675
+ selNodeId: selection.selNodeId,
11676
+ selection: this.selection,
11677
+ options: this.options,
11678
+ repeatedOptions: this.repeatedOptions
11679
+ };
11680
+ this._appEventService.openSlideOut.next(event);
11681
+ }
11682
+ }
11683
+ _handleCheckRepeats(selection) {
11684
+ if (this.selection.id === selection.id) {
11685
+ this.showRepeatedOption = true;
11686
+ }
11687
+ }
11688
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorGroupedRepeatableOptionsComponent, deps: [{ token: ConfiguratorConnectorService }, { token: IconCacheService }, { token: ConfiguratorEventService }], target: i0.ɵɵFactoryTarget.Component });
11689
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ProductConfiguratorGroupedRepeatableOptionsComponent, isStandalone: false, selector: "co-product-configurator-grouped-repeatable-options", inputs: { selection: "selection", listOfChoices: "listOfChoices", repeatedOptions: "repeatedOptions", selectionIndex: "selectionIndex", options: "options" }, outputs: { selectionClick: "selectionClick" }, host: { properties: { "class.co-product-configurator-grouped-repeatable-options": "this.showClass" } }, viewQueries: [{ propertyName: "newSelection", first: true, predicate: ["newSelection"], descendants: true }], ngImport: i0, template: `
11690
+ <div class="product-configurator-grouped-repeatable-options-container" [class.repeatable-options-hidden]="!showRepeatedOption">
11691
+ <div class="grouped-repeatable-display-tabs">
11692
+ <co-button
11693
+ class="left-button"
11694
+ [class.active-button]="showAllElements"
11695
+ [label]="'SHOW_ALL_ELEMENTS' | localize: false | async"
11696
+ (onClick)="handleSwitchView(true)"
11697
+ ></co-button>
11698
+ <co-button
11699
+ class="right-button"
11700
+ [class.active-button]="!showAllElements"
11701
+ [label]="'SHOW_ACTIVE_ELEMENTS' | localize: false | async"
11702
+ (onClick)="handleSwitchView(false)"
11703
+ ></co-button>
11704
+ </div>
11705
+ <div class="grouped-repeatable-display-body">
11706
+ @if (optionGroups && optionGroups.length > 1) {
11707
+ <div class="repeat-explainer">
11708
+ <div class="info-icon">
11709
+ <co-icon
11710
+ [iconData]="iconCacheService.getIcon(icons.InfoSolidFull)"
11711
+ ></co-icon>
11712
+ </div>
11713
+ @if (showAllElements) {
11714
+ <div class="info-text" [textContent]="'REPEAT_ELEMENTS_EXPLAINER' | localize: false | async">
11715
+ </div>
11716
+ }
11717
+ @if (!showAllElements) {
11718
+ <div class="info-text" [textContent]="'CHANGE_ELEMENTS_EXPLAINER' | localize: false | async">
11719
+ </div>
11720
+ }
11721
+ </div>
11722
+ }
11723
+ <div class="grouped-repeatable-items" [class.show-filtered]="!showAllElements">
11724
+ @for (group of optionGroups; track group.selector.id; let index = $index) {
11725
+ @if (!hasSelectedItem(group.options)) {
11726
+ <div #newSelection></div>
11727
+ }
11728
+ <div class="grouped-items-container">
11729
+ @if (optionGroups && optionGroups.length > 1 && showAllElements) {
11730
+ <div class="index-indicator">
11731
+ <div [textContent]="selectionIndex.toString() | append: '.' | append: (index + 1).toString()"></div>
11732
+ </div>
11733
+ }
11734
+ <div class="selector-options">
11735
+ <co-product-configurator-selector-option
11736
+ [class.co-product-configurator-selector-new-option]="!hasSelectedItem(group.options)"
11737
+ [selection]="group.selector"
11738
+ [listOfChoices]="group.options"
11739
+ (selectionClicked)="handleSelectionClicked($event, group)">
11740
+ </co-product-configurator-selector-option>
11741
+ </div>
11742
+ </div>
11743
+ }
11744
+ </div>
11745
+ </div>
11746
+ </div>
11747
+ `, 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", "limitAmountOfTiles", "maxVisibleTiles", "maxVisibleSmallTiles"], outputs: ["selectionClicked"] }, { kind: "component", type: i4.ButtonComponent, selector: "co-button", inputs: ["label", "iconData", "iconDataRight", "isToggleButton", "isToggled", "hidden", "disabled"], outputs: ["onClick", "clickedWhileDisabled", "isToggledChange"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AppendPipe, name: "append" }], encapsulation: i0.ViewEncapsulation.None });
11748
+ }
11749
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorGroupedRepeatableOptionsComponent, decorators: [{
11750
+ type: Component,
11751
+ args: [{
11752
+ selector: 'co-product-configurator-grouped-repeatable-options',
11753
+ template: `
11754
+ <div class="product-configurator-grouped-repeatable-options-container" [class.repeatable-options-hidden]="!showRepeatedOption">
11755
+ <div class="grouped-repeatable-display-tabs">
11756
+ <co-button
11757
+ class="left-button"
11758
+ [class.active-button]="showAllElements"
11759
+ [label]="'SHOW_ALL_ELEMENTS' | localize: false | async"
11760
+ (onClick)="handleSwitchView(true)"
11761
+ ></co-button>
11762
+ <co-button
11763
+ class="right-button"
11764
+ [class.active-button]="!showAllElements"
11765
+ [label]="'SHOW_ACTIVE_ELEMENTS' | localize: false | async"
11766
+ (onClick)="handleSwitchView(false)"
11767
+ ></co-button>
11768
+ </div>
11769
+ <div class="grouped-repeatable-display-body">
11770
+ @if (optionGroups && optionGroups.length > 1) {
11771
+ <div class="repeat-explainer">
11772
+ <div class="info-icon">
11773
+ <co-icon
11774
+ [iconData]="iconCacheService.getIcon(icons.InfoSolidFull)"
11775
+ ></co-icon>
11776
+ </div>
11777
+ @if (showAllElements) {
11778
+ <div class="info-text" [textContent]="'REPEAT_ELEMENTS_EXPLAINER' | localize: false | async">
11779
+ </div>
11780
+ }
11781
+ @if (!showAllElements) {
11782
+ <div class="info-text" [textContent]="'CHANGE_ELEMENTS_EXPLAINER' | localize: false | async">
11783
+ </div>
11784
+ }
11785
+ </div>
11786
+ }
11787
+ <div class="grouped-repeatable-items" [class.show-filtered]="!showAllElements">
11788
+ @for (group of optionGroups; track group.selector.id; let index = $index) {
11789
+ @if (!hasSelectedItem(group.options)) {
11790
+ <div #newSelection></div>
11791
+ }
11792
+ <div class="grouped-items-container">
11793
+ @if (optionGroups && optionGroups.length > 1 && showAllElements) {
11794
+ <div class="index-indicator">
11795
+ <div [textContent]="selectionIndex.toString() | append: '.' | append: (index + 1).toString()"></div>
11796
+ </div>
11797
+ }
11798
+ <div class="selector-options">
11799
+ <co-product-configurator-selector-option
11800
+ [class.co-product-configurator-selector-new-option]="!hasSelectedItem(group.options)"
11801
+ [selection]="group.selector"
11802
+ [listOfChoices]="group.options"
11803
+ (selectionClicked)="handleSelectionClicked($event, group)">
11804
+ </co-product-configurator-selector-option>
11805
+ </div>
11806
+ </div>
11807
+ }
11808
+ </div>
11809
+ </div>
11810
+ </div>
11811
+ `,
11812
+ standalone: false,
11813
+ encapsulation: ViewEncapsulation.None
11814
+ }]
11815
+ }], ctorParameters: () => [{ type: ConfiguratorConnectorService }, { type: IconCacheService }, { type: ConfiguratorEventService }], propDecorators: { showClass: [{
11816
+ type: HostBinding,
11817
+ args: ['class.co-product-configurator-grouped-repeatable-options']
11818
+ }], selection: [{
11078
11819
  type: Input
11079
- }], groupedSubShow: [{
11820
+ }], listOfChoices: [{
11821
+ type: Input
11822
+ }], repeatedOptions: [{
11080
11823
  type: Input
11824
+ }], selectionIndex: [{
11825
+ type: Input
11826
+ }], options: [{
11827
+ type: Input
11828
+ }], selectionClick: [{
11829
+ type: Output
11830
+ }], newSelection: [{
11831
+ type: ViewChild,
11832
+ args: ['newSelection']
11081
11833
  }] } });
11082
11834
 
11083
11835
  class ProductConfiguratorSelectorComponent {
11084
11836
  configuratorConnectorService;
11085
11837
  settingsService;
11086
11838
  iconService;
11087
- get hostClasses() {
11088
- const classes = [
11089
- 'co-product-configurator-selector',
11090
- `treelevel-${this.treeLevelIndex}`
11091
- ];
11092
- if (!this._shouldBeVisible()) {
11093
- classes.push('hidden-frontend');
11094
- }
11095
- return classes.join(' ');
11839
+ _appEventService;
11840
+ showClass() {
11841
+ return true;
11096
11842
  }
11097
11843
  icons = IconEnum;
11098
11844
  exceptionContainer;
11099
11845
  selection;
11100
11846
  options;
11847
+ repeatedOptions;
11101
11848
  lastNodeWithChildren;
11849
+ set markForUserInput(mark) {
11850
+ this._markForUserInput = mark;
11851
+ this._handleMarkInput(mark);
11852
+ }
11853
+ get markForUserInput() {
11854
+ return this._markForUserInput;
11855
+ }
11102
11856
  selectionIndex;
11103
11857
  treeLevelIndex = 1;
11104
- isActive = true;
11105
11858
  markAsException = false;
11106
- showAll = false;
11107
- suppressSubShowMore = false;
11108
- useGroupedParentVisibility = false;
11859
+ hasArticlesAsChildren = false;
11109
11860
  activate = new EventEmitter();
11110
- selectionClass = '';
11861
+ openSlideOutClick = new EventEmitter();
11111
11862
  listOfChoices = [];
11112
11863
  activeChildIndex = 0;
11113
- localShowAll = false;
11114
- get selectionIndexText() {
11115
- return this.selectionIndex + '. ';
11116
- }
11117
- get expandButtonText() {
11118
- if (this.getChildShowAll()) {
11119
- return 'VIEW_LESS';
11120
- }
11121
- return this.groupedRemainingTilesCount > 0
11122
- ? `SHOW_ALL`
11123
- : 'SHOW_ALL';
11124
- }
11125
- get suppressSubShowMoreForChildren() {
11126
- return this.suppressSubShowMore || this.isGroupedSection();
11127
- }
11128
- get groupedRemainingTilesCount() {
11129
- if (!this.isGroupedSection() || this.getChildShowAll()) {
11130
- return 0;
11131
- }
11132
- return this._countGroupedTilesToReveal(this.options);
11133
- }
11134
- get useGroupedVisibilityForChildren() {
11135
- return this.useGroupedParentVisibility || this.isGroupedSection();
11136
- }
11137
- constructor(configuratorConnectorService, settingsService, iconService) {
11864
+ showAnswerGrouped = true;
11865
+ limitStartView = false;
11866
+ limitAmountOfTiles = false;
11867
+ sliceAmount = 2;
11868
+ amountOfGroupsToShow = 2;
11869
+ maxVisibleTiles = 5;
11870
+ maxVisibleSmallTiles = 7;
11871
+ totalOptionCount = 0;
11872
+ selectableOption = true;
11873
+ callRepeatOption;
11874
+ activeSelection = 0;
11875
+ _markForUserInput;
11876
+ _subs = [];
11877
+ constructor(configuratorConnectorService, settingsService, iconService, _appEventService) {
11138
11878
  this.configuratorConnectorService = configuratorConnectorService;
11139
11879
  this.settingsService = settingsService;
11140
11880
  this.iconService = iconService;
11881
+ this._appEventService = _appEventService;
11882
+ this._subs.push(this._appEventService.checkForMarkedInputs.subscribe(check => {
11883
+ this.markForUserInput = check;
11884
+ this._handleMarkInput(check);
11885
+ }), this._appEventService.showAllConfigurationOptions.subscribe(show => {
11886
+ this.handleLimitedViewMode();
11887
+ }));
11141
11888
  }
11142
11889
  ngOnInit() {
11890
+ this.showAnswerGrouped = this.selection.showGrouped;
11143
11891
  if (this.selection && this.selection.displayOptionControl == null) {
11144
11892
  this.selection.displayOptionControl = ConfigurationDisplayOption.TileLarge;
11145
11893
  }
11146
- this.selectionClass = 'selection-container-' + this.selection.displayOptionControl;
11147
- if (this.lastNodeWithChildren) {
11894
+ // When the opvId === 0 it means that we got a skip/ cancel option and if there are no other options to choice from, we should hide this
11895
+ if (this.options.length === 1) {
11896
+ if (this.options[0].selector.opvId === 0 && this.options[0].selectorOptions.length === 0) {
11897
+ this.selectableOption = false;
11898
+ }
11899
+ }
11900
+ // This is filling the 'tile' data in case there are no nested articles
11901
+ if (this.lastNodeWithChildren) {
11902
+ for (const option of this.options) {
11903
+ if (option.selector) {
11904
+ this.listOfChoices.push(option.selector);
11905
+ }
11906
+ }
11907
+ }
11908
+ // This is the case when we DO have nested articles
11909
+ if (!this.lastNodeWithChildren && this.hasArticlesAsChildren) {
11148
11910
  for (const option of this.options) {
11149
11911
  if (option.selector) {
11150
- this.configuratorConnectorService.getImageForAnswer(option.selector);
11151
11912
  this.listOfChoices.push(option.selector);
11152
11913
  }
11153
11914
  }
@@ -11155,15 +11916,35 @@ class ProductConfiguratorSelectorComponent {
11155
11916
  if (this.markAsException) {
11156
11917
  this.showAndScroll();
11157
11918
  }
11158
- this._setActiveChildIndexFromSelection();
11919
+ this.handleLimitedViewMode();
11159
11920
  }
11160
- ngOnChanges(changes) {
11161
- if (changes.options && !changes.options.firstChange) {
11162
- this._setActiveChildIndexFromSelection();
11163
- }
11164
- if (changes.showAll && !changes.showAll.firstChange) {
11165
- this._setActiveChildIndexFromSelection();
11921
+ ngOnDestroy() {
11922
+ this._subs.forEach(s => s.unsubscribe());
11923
+ }
11924
+ handleLimitedViewMode() {
11925
+ this.limitStartView = this.settingsService.settings.options.limitStartView;
11926
+ this.limitAmountOfTiles = this.settingsService.settings.options.limitAmountOfTiles;
11927
+ this.sliceAmount = this.options.length;
11928
+ if (this.limitStartView && this.options && this.options.length) {
11929
+ // amountOfGroupsToShow -> top level group
11930
+ if (this.settingsService.settings.options.amountOfGroupsToShow && this.treeLevelIndex >= 1) {
11931
+ if (this.options.length >= this.amountOfGroupsToShow) {
11932
+ this.sliceAmount = this.settingsService.settings.options.amountOfGroupsToShow;
11933
+ }
11934
+ }
11935
+ this.totalOptionCount = this._countGroupedTilesToReveal(this.options);
11166
11936
  }
11937
+ this.maxVisibleTiles = this.settingsService.settings.options.maxVisibleTiles;
11938
+ this.maxVisibleSmallTiles = this.settingsService.settings.options.maxVisibleSmallTiles;
11939
+ }
11940
+ /*
11941
+ *
11942
+ * When using the full config template, there are two ways to changing.
11943
+ * NavigateTo -> used for showGrouped true options, jumps the tree to some other point
11944
+ *
11945
+ * */
11946
+ handleNavigateTo(selection) {
11947
+ this._appEventService.selectSelection.next(selection);
11167
11948
  }
11168
11949
  showAndScroll() {
11169
11950
  setTimeout(() => {
@@ -11174,59 +11955,96 @@ class ProductConfiguratorSelectorComponent {
11174
11955
  this.activate.emit();
11175
11956
  }
11176
11957
  onShowAllClick() {
11177
- this.localShowAll = !this.localShowAll;
11178
- }
11179
- getIsChildVisible(index) {
11180
- if (!this.useGroupedVisibilityForChildren) {
11181
- return true;
11182
- }
11183
- if (this.getChildShowAll()) {
11184
- return true;
11185
- }
11186
- return index === this.activeChildIndex;
11187
- }
11188
- isGroupedSection() {
11189
- return this.treeLevelIndex === 1
11190
- && !this.lastNodeWithChildren
11191
- && this.settingsService.settings.options.groupedShowAllBtn
11192
- && Array.isArray(this.options)
11193
- && this.options.length > 1;
11194
- }
11195
- shouldShowExpandButton() {
11196
- return this.isGroupedSection();
11197
- }
11198
- getChildShowAll() {
11199
- return this.showAll || this.localShowAll;
11200
- }
11201
- _shouldBeVisible() {
11202
- if (!this.useGroupedVisibilityForChildren) {
11203
- return true;
11204
- }
11205
- if (this.getChildShowAll()) {
11206
- return true;
11207
- }
11208
- return this.isActive;
11209
- }
11210
- _setActiveChildIndexFromSelection() {
11211
- if (!Array.isArray(this.options) || this.options.length === 0) {
11212
- this.activeChildIndex = 0;
11213
- return;
11214
- }
11215
- const selectedIndex = this.options.findIndex(option => this._hasSelectedOption(option));
11216
- this.activeChildIndex = selectedIndex >= 0 ? selectedIndex : 0;
11217
- }
11218
- _hasSelectedOption(option) {
11219
- if (!option) {
11220
- return false;
11221
- }
11222
- if (option.selector && option.selector.selected === 'F') {
11223
- return true;
11958
+ // just limit it to all options so we loop through it all
11959
+ this.amountOfGroupsToShow = this.options.length;
11960
+ // TODO discuss
11961
+ // This is an hacky solution but;
11962
+ // the setting to check if we should limit the amount to show is in a global settings service.
11963
+ // but this is more like a state of loading thing and not a setting that should always be checked.
11964
+ // When clicking show all, we will just change the value of the session.
11965
+ this.settingsService.settings.options.limitStartView = false;
11966
+ this.settingsService.settings.options.limitAmountOfTiles = false;
11967
+ this.handleLimitedViewMode();
11968
+ this._appEventService.showAllConfigurationOptions.next(true);
11969
+ }
11970
+ handleRepeatClicked() {
11971
+ // Some information
11972
+ // When we have a repeatable option with skip cancel selected, we do not show this by default
11973
+ // So when the user clicks on add element, show the skipcancel one so the user can make a selection.
11974
+ // else, just call repeatOption and continue
11975
+ this.callRepeatOption = true;
11976
+ this.configuratorConnectorService.selectionWithAnswers.forEach(parent => {
11977
+ if (parent.selector.id === this.selection.id) {
11978
+ // see if the selected value === a skipperdoodle
11979
+ if (parent.selectorOptions && parent.selectorOptions.length > 0 && parent.repeatedOptions && parent.repeatedOptions.length === 0) {
11980
+ parent.selectorOptions.forEach(child => {
11981
+ if (child.selector.selected === 'F' && child.selector.opvId === 0) {
11982
+ this.callRepeatOption = false;
11983
+ this._appEventService.checkHiddenRepeatItem.next(this.selection);
11984
+ }
11985
+ });
11986
+ }
11987
+ }
11988
+ });
11989
+ if (this.callRepeatOption) {
11990
+ this.configuratorConnectorService.repeatOption(this.selection.optCycle, this.selection.id);
11991
+ }
11992
+ }
11993
+ handleDeleteClicked() {
11994
+ const tempSelection = this.selection;
11995
+ const nodeHierarchy = tempSelection.nodeHierarchy + '[0]';
11996
+ tempSelection.nodeHierarchy = nodeHierarchy;
11997
+ this.handleNavigateTo(tempSelection);
11998
+ }
11999
+ handleOpenSlideOut(event) {
12000
+ this.activeSelection = event.selNodeId;
12001
+ this.configuratorConnectorService.activeSlideOutParentId = this.activeSelection;
12002
+ this._appEventService.openSlideOut.next(event);
12003
+ }
12004
+ _handleMarkInput(mark) {
12005
+ // needs to handle repeated options as well!
12006
+ if (this.options && this.options.length > 0) {
12007
+ this.options.forEach(option => {
12008
+ if (option.selector.selNodeId === this.configuratorConnectorService.activeSlideOutParentId) {
12009
+ if (mark) {
12010
+ const event = {
12011
+ open: true,
12012
+ selNodeId: this.configuratorConnectorService.activeSlideOutParentId,
12013
+ selection: this.selection,
12014
+ options: this.options,
12015
+ repeatedOptions: this.repeatedOptions,
12016
+ activeSelection: this.activeSelection,
12017
+ markForUserInput: this.markForUserInput
12018
+ };
12019
+ this.handleOpenSlideOut(event);
12020
+ }
12021
+ }
12022
+ });
11224
12023
  }
11225
- if (!Array.isArray(option.selectorOptions) || option.selectorOptions.length === 0) {
11226
- return false;
12024
+ if (this.repeatedOptions && this.repeatedOptions.length > 0) {
12025
+ this.repeatedOptions.forEach(child => {
12026
+ if (child.selectorOptions && child.selectorOptions.length > 0) {
12027
+ child.selectorOptions.forEach(value => {
12028
+ if (value.selector.selNodeId === this.configuratorConnectorService.activeSlideOutParentId) {
12029
+ if (mark) {
12030
+ const event = {
12031
+ open: true,
12032
+ selNodeId: this.configuratorConnectorService.activeSlideOutParentId,
12033
+ selection: this.selection,
12034
+ options: this.options,
12035
+ repeatedOptions: this.repeatedOptions,
12036
+ activeSelection: this.activeSelection,
12037
+ markForUserInput: this.markForUserInput
12038
+ };
12039
+ this.handleOpenSlideOut(event);
12040
+ }
12041
+ }
12042
+ });
12043
+ }
12044
+ });
11227
12045
  }
11228
- return option.selectorOptions.some(childOption => this._hasSelectedOption(childOption));
11229
12046
  }
12047
+ // TODO review functions below this
11230
12048
  _countRemainingTiles(options) {
11231
12049
  if (!Array.isArray(options) || options.length === 0) {
11232
12050
  return 0;
@@ -11293,9 +12111,13 @@ class ProductConfiguratorSelectorComponent {
11293
12111
  }
11294
12112
  return 0;
11295
12113
  }
11296
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorComponent, deps: [{ token: ConfiguratorConnectorService }, { token: ConfiguratorSettingsService }, { token: IconCacheService }], target: i0.ɵɵFactoryTarget.Component });
11297
- 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: `
11298
- <div class="selector-container">
12114
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorComponent, deps: [{ token: ConfiguratorConnectorService }, { token: ConfiguratorSettingsService }, { token: IconCacheService }, { token: ConfiguratorEventService }], target: i0.ɵɵFactoryTarget.Component });
12115
+ 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", repeatedOptions: "repeatedOptions", lastNodeWithChildren: "lastNodeWithChildren", markForUserInput: "markForUserInput", selectionIndex: "selectionIndex", treeLevelIndex: "treeLevelIndex", markAsException: "markAsException", hasArticlesAsChildren: "hasArticlesAsChildren" }, outputs: { activate: "activate", openSlideOutClick: "openSlideOutClick" }, host: { properties: { "class.co-product-configurator-selector": "this.showClass" } }, viewQueries: [{ propertyName: "exceptionContainer", first: true, predicate: ["exceptionContainer"], descendants: true }], ngImport: i0, template: `
12116
+ <div
12117
+ class="selector-container tree-level-{{treeLevelIndex}}"
12118
+ [class.hide-from-selector]="!selectableOption"
12119
+ [class.mark-for-input]="markForUserInput"
12120
+ >
11299
12121
  <!--
11300
12122
  Based on the threeLevel and the length op options we got a couple of flavours
11301
12123
  treeLevel 1 -> article, should not be used here
@@ -11304,96 +12126,119 @@ class ProductConfiguratorSelectorComponent {
11304
12126
  treeLevel 4 -> more like bold text, should be for something like 'the fabric group'
11305
12127
  treeLevel 5 -> just text head
11306
12128
  -->
11307
-
12129
+
11308
12130
  <div class="selector-container-header">
11309
12131
  @if (selection.treeLevel === 2 && options.length > 0) {
11310
12132
  <h2 class="selector-option-header">
11311
- <span [textContent]="selectionIndexText"></span>
12133
+ <span [textContent]="selectionIndex.toString() | append: '. '"></span>
11312
12134
  <span [textContent]="selection.nodeText ? selection.nodeText : selection.optionText | localize:true | async"></span>
11313
12135
  </h2>
11314
12136
  }
11315
-
11316
12137
  @if (selection.treeLevel === 3 && options.length > 0) {
11317
- <h3
11318
- class="selector-option-sub-header"
11319
- [textContent]="selection.nodeText | localize:true | async" (click)="onSubHeaderClick()"></h3>
12138
+ <h3 class="selector-option-sub-header" [textContent]="selection.nodeText | localize:true | async" (click)="onSubHeaderClick()"></h3>
11320
12139
  }
11321
-
11322
12140
  @if (selection.treeLevel === 4 && options.length > 0) {
11323
- <p
11324
- class="selector-option-bold-text-header"
11325
- [textContent]="selection.nodeText | localize:true | async"></p>
12141
+ <p class="selector-option-bold-text-header" [textContent]="selection.nodeText ? selection.nodeText: selection.optionText | localize:true | async"></p>
11326
12142
  }
11327
-
11328
12143
  @if (selection.treeLevel === 5 && options.length > 0) {
11329
- <p
11330
- class="selector-option-text-header"
11331
- [textContent]="selection.nodeText | localize:true | async"></p>
12144
+ <p class="selector-option-text-header" [textContent]="selection.nodeText | localize:true | async"></p>
11332
12145
  }
11333
-
11334
-
11335
12146
  @if (markAsException) {
11336
12147
  <span class="exception-icon" #exceptionContainer [title]="'CONFIGURATION_EXCEPTION_INFO' | localize:false | async">
11337
12148
  <co-icon [iconData]="iconService.getIcon(icons.TriangleExclamation)"></co-icon>
11338
12149
  </span>
11339
12150
  }
12151
+ @if (selection.repeatOptActive || selection.canBeDeleted) {
12152
+ <co-product-configurator-repeat-buttons
12153
+ [showRepeatButton]="selection.repeatOptActive"
12154
+ [showDeleteButton]="selection.canBeDeleted"
12155
+ (repeatClicked)="handleRepeatClicked()"
12156
+ (deleteClicked)="handleDeleteClicked()"
12157
+ ></co-product-configurator-repeat-buttons>
12158
+ }
11340
12159
  </div>
11341
-
11342
- @if (lastNodeWithChildren) {
12160
+
12161
+ @if (selection.repeatOptActive && lastNodeWithChildren && !hasArticlesAsChildren) {
12162
+ <co-product-configurator-grouped-repeatable-options
12163
+ [selection]="selection"
12164
+ [listOfChoices]="listOfChoices"
12165
+ [options]="options"
12166
+ [repeatedOptions]="repeatedOptions"
12167
+ [selectionIndex]="selectionIndex"
12168
+ (selectionClick)="handleNavigateTo($event)"
12169
+ ></co-product-configurator-grouped-repeatable-options>
12170
+ } @else if (lastNodeWithChildren) {
12171
+ <!-- Show the tiles now -->
11343
12172
  <co-product-configurator-selector-option
11344
12173
  [selection]="selection"
11345
12174
  [listOfChoices]="listOfChoices"
11346
- [groupedSubShow]="!suppressSubShowMoreForChildren"
11347
12175
  [markAsException]="markAsException"
11348
- [showGlobalAll]="getChildShowAll()">
12176
+ [limitAmountOfTiles]="limitAmountOfTiles"
12177
+ [maxVisibleTiles]="maxVisibleTiles"
12178
+ [maxVisibleSmallTiles]="maxVisibleSmallTiles"
12179
+ (selectionClicked)="handleNavigateTo($event)">
11349
12180
  </co-product-configurator-selector-option>
11350
12181
  }
12182
+
12183
+ @if (!lastNodeWithChildren && hasArticlesAsChildren) {
12184
+ <!-- When we have articles, we show show the user a nested view -->
12185
+ @if (selection.repeatOptActive) {
12186
+ <co-product-configurator-grouped-repeatable-options
12187
+ [selection]="selection"
12188
+ [listOfChoices]="listOfChoices"
12189
+ [repeatedOptions]="repeatedOptions"
12190
+ [options]="options"
12191
+ [selectionIndex]="selectionIndex"
12192
+ (selectionClick)="handleNavigateTo($event)"
12193
+ ></co-product-configurator-grouped-repeatable-options>
12194
+ } @else {
12195
+ <co-product-configurator-selector-child-article
12196
+ [selection]="selection"
12197
+ [listOfChoices]="listOfChoices"
12198
+ [options]="options"
12199
+ [repeatedOptions]="repeatedOptions"
12200
+ [markAsException]="markAsException"
12201
+ (selectionClick)="handleNavigateTo($event)">
12202
+ </co-product-configurator-selector-child-article>
12203
+ }
12204
+ }
11351
12205
  </div>
11352
-
11353
- @if (!lastNodeWithChildren) {
11354
- @for (displaySelection of options; track displaySelection; let index = $index) {
12206
+ @if (!lastNodeWithChildren && !hasArticlesAsChildren) {
12207
+ @for (displaySelection of options | slice:0:sliceAmount; track displaySelection.selector; let index = $index) {
11355
12208
  <co-product-configurator-selector
11356
12209
  [selection]="displaySelection.selector"
11357
12210
  [options]="displaySelection.selectorOptions"
12211
+ [repeatedOptions]="displaySelection.repeatedOptions"
11358
12212
  [lastNodeWithChildren]="displaySelection.lastNodeWithChildren"
11359
12213
  [selectionIndex]="index + 1"
11360
12214
  [treeLevelIndex]="treeLevelIndex + 1"
11361
- [showAll]="getChildShowAll()"
11362
- [isActive]="getIsChildVisible(index)"
11363
- [suppressSubShowMore]="suppressSubShowMoreForChildren"
11364
- [useGroupedParentVisibility]="useGroupedVisibilityForChildren"
11365
12215
  [markAsException]="displaySelection.markForExceptionNotification"
12216
+ [hasArticlesAsChildren]="displaySelection.selectorOptionsAreArticles"
12217
+ [markForUserInput]="displaySelection.markForUserInput"
11366
12218
  (activate)="activeChildIndex = index">
11367
12219
  </co-product-configurator-selector>
11368
12220
  }
11369
12221
  }
11370
- @if (shouldShowExpandButton()) {
12222
+ @if (limitStartView && treeLevelIndex === 1 && !lastNodeWithChildren && !hasArticlesAsChildren) {
11371
12223
  <div class="show-more-container" (click)="onShowAllClick()">
11372
- <span class="show-all-button show-more-text-link"
11373
- [textContent]="expandButtonText | localize:false | async">
11374
- </span>
11375
-
11376
- @if (this.groupedRemainingTilesCount > 0) {
11377
- <span class="show-all-button show-more-text-link counter"
11378
- [textContent]="'(' + this.groupedRemainingTilesCount + ')'">
11379
- </span>
12224
+ <span class="show-all-button show-more-text-link" [textContent]="'SHOW_ALL' | localize:false | async"></span>
12225
+ @if (totalOptionCount > 0) {
12226
+ <span class="show-all-button show-more-text-link counter" [textContent]="'(' + totalOptionCount + ')'"></span>
11380
12227
  }
11381
12228
  </div>
11382
12229
  }
11383
- `, 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: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], animations: [
11384
- trigger('showSelections', [
11385
- state('void', style({ 'transform': 'translateX(100%)', opacity: 0 })),
11386
- state('*', style({ 'transform': 'translateX(0%)', opacity: 1 })),
11387
- transition('void <=> *', animate(200))
11388
- ])
11389
- ], encapsulation: i0.ViewEncapsulation.None });
12230
+ `, 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", "limitAmountOfTiles", "maxVisibleTiles", "maxVisibleSmallTiles"], outputs: ["selectionClicked"] }, { kind: "component", type: ProductConfiguratorRepeatButtonsComponent, selector: "co-product-configurator-repeat-buttons", inputs: ["showRepeatButton", "showDeleteButton"], outputs: ["repeatClicked", "deleteClicked"] }, { kind: "component", type: ProductConfiguratorSelectorComponent, selector: "co-product-configurator-selector", inputs: ["selection", "options", "repeatedOptions", "lastNodeWithChildren", "markForUserInput", "selectionIndex", "treeLevelIndex", "markAsException", "hasArticlesAsChildren"], outputs: ["activate", "openSlideOutClick"] }, { kind: "component", type: ProductConfiguratorSelectorChildArticleComponent, selector: "co-product-configurator-selector-child-article", inputs: ["selection", "listOfChoices", "options", "repeatedOptions", "markAsException"], outputs: ["selectionClick"] }, { kind: "component", type: ProductConfiguratorGroupedRepeatableOptionsComponent, selector: "co-product-configurator-grouped-repeatable-options", inputs: ["selection", "listOfChoices", "repeatedOptions", "selectionIndex", "options"], outputs: ["selectionClick"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6$1.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.AppendPipe, name: "append" }], encapsulation: i0.ViewEncapsulation.None });
11390
12231
  }
11391
12232
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorComponent, decorators: [{
11392
12233
  type: Component,
11393
12234
  args: [{
11394
12235
  selector: 'co-product-configurator-selector',
11395
12236
  template: `
11396
- <div class="selector-container">
12237
+ <div
12238
+ class="selector-container tree-level-{{treeLevelIndex}}"
12239
+ [class.hide-from-selector]="!selectableOption"
12240
+ [class.mark-for-input]="markForUserInput"
12241
+ >
11397
12242
  <!--
11398
12243
  Based on the threeLevel and the length op options we got a couple of flavours
11399
12244
  treeLevel 1 -> article, should not be used here
@@ -11402,96 +12247,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
11402
12247
  treeLevel 4 -> more like bold text, should be for something like 'the fabric group'
11403
12248
  treeLevel 5 -> just text head
11404
12249
  -->
11405
-
12250
+
11406
12251
  <div class="selector-container-header">
11407
12252
  @if (selection.treeLevel === 2 && options.length > 0) {
11408
12253
  <h2 class="selector-option-header">
11409
- <span [textContent]="selectionIndexText"></span>
12254
+ <span [textContent]="selectionIndex.toString() | append: '. '"></span>
11410
12255
  <span [textContent]="selection.nodeText ? selection.nodeText : selection.optionText | localize:true | async"></span>
11411
12256
  </h2>
11412
12257
  }
11413
-
11414
12258
  @if (selection.treeLevel === 3 && options.length > 0) {
11415
- <h3
11416
- class="selector-option-sub-header"
11417
- [textContent]="selection.nodeText | localize:true | async" (click)="onSubHeaderClick()"></h3>
12259
+ <h3 class="selector-option-sub-header" [textContent]="selection.nodeText | localize:true | async" (click)="onSubHeaderClick()"></h3>
11418
12260
  }
11419
-
11420
12261
  @if (selection.treeLevel === 4 && options.length > 0) {
11421
- <p
11422
- class="selector-option-bold-text-header"
11423
- [textContent]="selection.nodeText | localize:true | async"></p>
12262
+ <p class="selector-option-bold-text-header" [textContent]="selection.nodeText ? selection.nodeText: selection.optionText | localize:true | async"></p>
11424
12263
  }
11425
-
11426
12264
  @if (selection.treeLevel === 5 && options.length > 0) {
11427
- <p
11428
- class="selector-option-text-header"
11429
- [textContent]="selection.nodeText | localize:true | async"></p>
12265
+ <p class="selector-option-text-header" [textContent]="selection.nodeText | localize:true | async"></p>
11430
12266
  }
11431
-
11432
-
11433
12267
  @if (markAsException) {
11434
12268
  <span class="exception-icon" #exceptionContainer [title]="'CONFIGURATION_EXCEPTION_INFO' | localize:false | async">
11435
12269
  <co-icon [iconData]="iconService.getIcon(icons.TriangleExclamation)"></co-icon>
11436
12270
  </span>
11437
12271
  }
12272
+ @if (selection.repeatOptActive || selection.canBeDeleted) {
12273
+ <co-product-configurator-repeat-buttons
12274
+ [showRepeatButton]="selection.repeatOptActive"
12275
+ [showDeleteButton]="selection.canBeDeleted"
12276
+ (repeatClicked)="handleRepeatClicked()"
12277
+ (deleteClicked)="handleDeleteClicked()"
12278
+ ></co-product-configurator-repeat-buttons>
12279
+ }
11438
12280
  </div>
11439
-
11440
- @if (lastNodeWithChildren) {
12281
+
12282
+ @if (selection.repeatOptActive && lastNodeWithChildren && !hasArticlesAsChildren) {
12283
+ <co-product-configurator-grouped-repeatable-options
12284
+ [selection]="selection"
12285
+ [listOfChoices]="listOfChoices"
12286
+ [options]="options"
12287
+ [repeatedOptions]="repeatedOptions"
12288
+ [selectionIndex]="selectionIndex"
12289
+ (selectionClick)="handleNavigateTo($event)"
12290
+ ></co-product-configurator-grouped-repeatable-options>
12291
+ } @else if (lastNodeWithChildren) {
12292
+ <!-- Show the tiles now -->
11441
12293
  <co-product-configurator-selector-option
11442
12294
  [selection]="selection"
11443
12295
  [listOfChoices]="listOfChoices"
11444
- [groupedSubShow]="!suppressSubShowMoreForChildren"
11445
12296
  [markAsException]="markAsException"
11446
- [showGlobalAll]="getChildShowAll()">
12297
+ [limitAmountOfTiles]="limitAmountOfTiles"
12298
+ [maxVisibleTiles]="maxVisibleTiles"
12299
+ [maxVisibleSmallTiles]="maxVisibleSmallTiles"
12300
+ (selectionClicked)="handleNavigateTo($event)">
11447
12301
  </co-product-configurator-selector-option>
11448
12302
  }
12303
+
12304
+ @if (!lastNodeWithChildren && hasArticlesAsChildren) {
12305
+ <!-- When we have articles, we show show the user a nested view -->
12306
+ @if (selection.repeatOptActive) {
12307
+ <co-product-configurator-grouped-repeatable-options
12308
+ [selection]="selection"
12309
+ [listOfChoices]="listOfChoices"
12310
+ [repeatedOptions]="repeatedOptions"
12311
+ [options]="options"
12312
+ [selectionIndex]="selectionIndex"
12313
+ (selectionClick)="handleNavigateTo($event)"
12314
+ ></co-product-configurator-grouped-repeatable-options>
12315
+ } @else {
12316
+ <co-product-configurator-selector-child-article
12317
+ [selection]="selection"
12318
+ [listOfChoices]="listOfChoices"
12319
+ [options]="options"
12320
+ [repeatedOptions]="repeatedOptions"
12321
+ [markAsException]="markAsException"
12322
+ (selectionClick)="handleNavigateTo($event)">
12323
+ </co-product-configurator-selector-child-article>
12324
+ }
12325
+ }
11449
12326
  </div>
11450
-
11451
- @if (!lastNodeWithChildren) {
11452
- @for (displaySelection of options; track displaySelection; let index = $index) {
12327
+ @if (!lastNodeWithChildren && !hasArticlesAsChildren) {
12328
+ @for (displaySelection of options | slice:0:sliceAmount; track displaySelection.selector; let index = $index) {
11453
12329
  <co-product-configurator-selector
11454
12330
  [selection]="displaySelection.selector"
11455
12331
  [options]="displaySelection.selectorOptions"
12332
+ [repeatedOptions]="displaySelection.repeatedOptions"
11456
12333
  [lastNodeWithChildren]="displaySelection.lastNodeWithChildren"
11457
12334
  [selectionIndex]="index + 1"
11458
12335
  [treeLevelIndex]="treeLevelIndex + 1"
11459
- [showAll]="getChildShowAll()"
11460
- [isActive]="getIsChildVisible(index)"
11461
- [suppressSubShowMore]="suppressSubShowMoreForChildren"
11462
- [useGroupedParentVisibility]="useGroupedVisibilityForChildren"
11463
12336
  [markAsException]="displaySelection.markForExceptionNotification"
12337
+ [hasArticlesAsChildren]="displaySelection.selectorOptionsAreArticles"
12338
+ [markForUserInput]="displaySelection.markForUserInput"
11464
12339
  (activate)="activeChildIndex = index">
11465
12340
  </co-product-configurator-selector>
11466
12341
  }
11467
12342
  }
11468
- @if (shouldShowExpandButton()) {
12343
+ @if (limitStartView && treeLevelIndex === 1 && !lastNodeWithChildren && !hasArticlesAsChildren) {
11469
12344
  <div class="show-more-container" (click)="onShowAllClick()">
11470
- <span class="show-all-button show-more-text-link"
11471
- [textContent]="expandButtonText | localize:false | async">
11472
- </span>
11473
-
11474
- @if (this.groupedRemainingTilesCount > 0) {
11475
- <span class="show-all-button show-more-text-link counter"
11476
- [textContent]="'(' + this.groupedRemainingTilesCount + ')'">
11477
- </span>
12345
+ <span class="show-all-button show-more-text-link" [textContent]="'SHOW_ALL' | localize:false | async"></span>
12346
+ @if (totalOptionCount > 0) {
12347
+ <span class="show-all-button show-more-text-link counter" [textContent]="'(' + totalOptionCount + ')'"></span>
11478
12348
  }
11479
12349
  </div>
11480
12350
  }
11481
- `,
12351
+ `,
11482
12352
  encapsulation: ViewEncapsulation.None,
11483
- animations: [
11484
- trigger('showSelections', [
11485
- state('void', style({ 'transform': 'translateX(100%)', opacity: 0 })),
11486
- state('*', style({ 'transform': 'translateX(0%)', opacity: 1 })),
11487
- transition('void <=> *', animate(200))
11488
- ])
11489
- ],
11490
12353
  standalone: false
11491
12354
  }]
11492
- }], ctorParameters: () => [{ type: ConfiguratorConnectorService }, { type: ConfiguratorSettingsService }, { type: IconCacheService }], propDecorators: { hostClasses: [{
12355
+ }], ctorParameters: () => [{ type: ConfiguratorConnectorService }, { type: ConfiguratorSettingsService }, { type: IconCacheService }, { type: ConfiguratorEventService }], propDecorators: { showClass: [{
11493
12356
  type: HostBinding,
11494
- args: ['class']
12357
+ args: ['class.co-product-configurator-selector']
11495
12358
  }], exceptionContainer: [{
11496
12359
  type: ViewChild,
11497
12360
  args: ['exceptionContainer']
@@ -11499,47 +12362,288 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
11499
12362
  type: Input
11500
12363
  }], options: [{
11501
12364
  type: Input
12365
+ }], repeatedOptions: [{
12366
+ type: Input
11502
12367
  }], lastNodeWithChildren: [{
11503
12368
  type: Input
12369
+ }], markForUserInput: [{
12370
+ type: Input
11504
12371
  }], selectionIndex: [{
11505
12372
  type: Input
11506
12373
  }], treeLevelIndex: [{
11507
12374
  type: Input
11508
- }], isActive: [{
11509
- type: Input
11510
12375
  }], markAsException: [{
11511
12376
  type: Input
11512
- }], showAll: [{
11513
- type: Input
11514
- }], suppressSubShowMore: [{
11515
- type: Input
11516
- }], useGroupedParentVisibility: [{
12377
+ }], hasArticlesAsChildren: [{
11517
12378
  type: Input
11518
12379
  }], activate: [{
11519
12380
  type: Output
12381
+ }], openSlideOutClick: [{
12382
+ type: Output
12383
+ }] } });
12384
+
12385
+ class ProductConfiguratorChildArticleConfiguratorComponent {
12386
+ configuratorConnectorService;
12387
+ settingsService;
12388
+ iconService;
12389
+ showClass() {
12390
+ return true;
12391
+ }
12392
+ icons = IconEnum;
12393
+ selection;
12394
+ options;
12395
+ lastNodeWithChildren;
12396
+ selectionIndex;
12397
+ treeLevelIndex = 1;
12398
+ markAsException = false;
12399
+ hasArticlesAsChildren = false;
12400
+ listOfChoices = [];
12401
+ showAnswerGrouped = true;
12402
+ constructor(configuratorConnectorService, settingsService, iconService) {
12403
+ this.configuratorConnectorService = configuratorConnectorService;
12404
+ this.settingsService = settingsService;
12405
+ this.iconService = iconService;
12406
+ }
12407
+ ngOnInit() {
12408
+ this.showAnswerGrouped = this.selection.showGrouped;
12409
+ if (this.selection && this.selection.displayOptionControl == null) {
12410
+ this.selection.displayOptionControl = ConfigurationDisplayOption.TileLarge;
12411
+ }
12412
+ // This is filling the 'tile' data in case there are no nested articles
12413
+ if (this.lastNodeWithChildren) {
12414
+ for (const option of this.options) {
12415
+ if (option.selector) {
12416
+ this.listOfChoices.push(option.selector);
12417
+ }
12418
+ }
12419
+ }
12420
+ // This is the case when we DO have nested articles
12421
+ if (!this.lastNodeWithChildren && this.hasArticlesAsChildren) {
12422
+ for (const option of this.options) {
12423
+ if (option.selector) {
12424
+ this.listOfChoices.push(option.selector);
12425
+ }
12426
+ }
12427
+ }
12428
+ }
12429
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorChildArticleConfiguratorComponent, deps: [{ token: ConfiguratorConnectorService }, { token: ConfiguratorSettingsService }, { token: IconCacheService }], target: i0.ɵɵFactoryTarget.Component });
12430
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ProductConfiguratorChildArticleConfiguratorComponent, isStandalone: false, selector: "co-product-configurator-child-article-configurator", inputs: { selection: "selection", options: "options", lastNodeWithChildren: "lastNodeWithChildren", selectionIndex: "selectionIndex", treeLevelIndex: "treeLevelIndex", markAsException: "markAsException", hasArticlesAsChildren: "hasArticlesAsChildren" }, host: { properties: { "class.co-product-configurator-child-article-configurator": "this.showClass" } }, ngImport: i0, template: `
12431
+ <div class="selector-container">
12432
+ <div class="selector-container-header">
12433
+ <p class="selector-option-bold-text-header" [textContent]="selection.nodeText ? selection.nodeText: selection.optionText | localize:true | async"></p>
12434
+ </div>
12435
+ </div>
12436
+ @if (!lastNodeWithChildren) {
12437
+ @for (displaySelection of options; track displaySelection.selector; let index = $index) {
12438
+ <co-product-configurator-selector
12439
+ [selection]="displaySelection.selector"
12440
+ [options]="displaySelection.selectorOptions"
12441
+ [lastNodeWithChildren]="displaySelection.lastNodeWithChildren"
12442
+ [selectionIndex]="index + 1"
12443
+ [treeLevelIndex]="treeLevelIndex + 1"
12444
+ [markAsException]="displaySelection.markForExceptionNotification"
12445
+ [markForUserInput]="displaySelection.markForUserInput"
12446
+ [hasArticlesAsChildren]="displaySelection.selectorOptionsAreArticles">
12447
+ </co-product-configurator-selector>
12448
+ }
12449
+ }
12450
+ `, isInline: true, dependencies: [{ kind: "component", type: ProductConfiguratorSelectorComponent, selector: "co-product-configurator-selector", inputs: ["selection", "options", "repeatedOptions", "lastNodeWithChildren", "markForUserInput", "selectionIndex", "treeLevelIndex", "markAsException", "hasArticlesAsChildren"], outputs: ["activate", "openSlideOutClick"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }] });
12451
+ }
12452
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorChildArticleConfiguratorComponent, decorators: [{
12453
+ type: Component,
12454
+ args: [{
12455
+ selector: 'co-product-configurator-child-article-configurator',
12456
+ template: `
12457
+ <div class="selector-container">
12458
+ <div class="selector-container-header">
12459
+ <p class="selector-option-bold-text-header" [textContent]="selection.nodeText ? selection.nodeText: selection.optionText | localize:true | async"></p>
12460
+ </div>
12461
+ </div>
12462
+ @if (!lastNodeWithChildren) {
12463
+ @for (displaySelection of options; track displaySelection.selector; let index = $index) {
12464
+ <co-product-configurator-selector
12465
+ [selection]="displaySelection.selector"
12466
+ [options]="displaySelection.selectorOptions"
12467
+ [lastNodeWithChildren]="displaySelection.lastNodeWithChildren"
12468
+ [selectionIndex]="index + 1"
12469
+ [treeLevelIndex]="treeLevelIndex + 1"
12470
+ [markAsException]="displaySelection.markForExceptionNotification"
12471
+ [markForUserInput]="displaySelection.markForUserInput"
12472
+ [hasArticlesAsChildren]="displaySelection.selectorOptionsAreArticles">
12473
+ </co-product-configurator-selector>
12474
+ }
12475
+ }
12476
+ `,
12477
+ standalone: false
12478
+ }]
12479
+ }], ctorParameters: () => [{ type: ConfiguratorConnectorService }, { type: ConfiguratorSettingsService }, { type: IconCacheService }], propDecorators: { showClass: [{
12480
+ type: HostBinding,
12481
+ args: ['class.co-product-configurator-child-article-configurator']
12482
+ }], selection: [{
12483
+ type: Input
12484
+ }], options: [{
12485
+ type: Input
12486
+ }], lastNodeWithChildren: [{
12487
+ type: Input
12488
+ }], selectionIndex: [{
12489
+ type: Input
12490
+ }], treeLevelIndex: [{
12491
+ type: Input
12492
+ }], markAsException: [{
12493
+ type: Input
12494
+ }], hasArticlesAsChildren: [{
12495
+ type: Input
12496
+ }] } });
12497
+
12498
+ class ProductConfiguratorSlideoutComponent {
12499
+ configuratorConnectorService;
12500
+ iconService;
12501
+ _appEventService;
12502
+ icons = IconEnum;
12503
+ showClass() {
12504
+ return true;
12505
+ }
12506
+ displaySelection;
12507
+ displayOptions;
12508
+ selection;
12509
+ options;
12510
+ repeatedOptions;
12511
+ showSlideOut = false;
12512
+ activeSelection;
12513
+ _subs = [];
12514
+ constructor(configuratorConnectorService, iconService, _appEventService) {
12515
+ this.configuratorConnectorService = configuratorConnectorService;
12516
+ this.iconService = iconService;
12517
+ this._appEventService = _appEventService;
12518
+ this._subs.push(this._appEventService.openSlideOut.subscribe(event => {
12519
+ this._handleSlideOut(event);
12520
+ }));
12521
+ }
12522
+ ngOnDestroy() {
12523
+ this._subs.forEach(s => s.unsubscribe());
12524
+ }
12525
+ handleCloseClick() {
12526
+ this.showSlideOut = false;
12527
+ this.configuratorConnectorService.activeSlideOutParentId = undefined;
12528
+ this._appEventService.closeSlideOut.next();
12529
+ }
12530
+ _handleSlideOut(event) {
12531
+ this.showSlideOut = event.open;
12532
+ this.selection = event.selection;
12533
+ this.options = event.options;
12534
+ this.repeatedOptions = event.repeatedOptions;
12535
+ this.activeSelection = event.selNodeId;
12536
+ this.configuratorConnectorService.activeSlideOutParentId = event.selNodeId;
12537
+ this._handleRepeatOptions(this.showSlideOut, this.activeSelection);
12538
+ }
12539
+ _handleRepeatOptions(show, activeSelection) {
12540
+ let foundRepeats = false;
12541
+ if (activeSelection && show && this.repeatedOptions && this.repeatedOptions.length > 0) {
12542
+ this.repeatedOptions.forEach(parent => {
12543
+ if (parent && parent.selectorOptions.length > 0) {
12544
+ if (parent.selectorOptions && parent.selectorOptions.length > 0) {
12545
+ parent.selectorOptions.forEach(child => {
12546
+ if (child.selector.selNodeId === activeSelection) {
12547
+ this.displaySelection = parent.selector;
12548
+ this.displayOptions = parent.selectorOptions;
12549
+ foundRepeats = true;
12550
+ }
12551
+ });
12552
+ }
12553
+ }
12554
+ });
12555
+ }
12556
+ if (!foundRepeats) {
12557
+ this.displaySelection = this.selection;
12558
+ this.displayOptions = this.options;
12559
+ }
12560
+ }
12561
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSlideoutComponent, deps: [{ token: ConfiguratorConnectorService }, { token: IconCacheService }, { token: ConfiguratorEventService }], target: i0.ɵɵFactoryTarget.Component });
12562
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ProductConfiguratorSlideoutComponent, isStandalone: false, selector: "co-product-configurator-slideout", host: { properties: { "class.co-product-configurator-slideout": "this.showClass" } }, ngImport: i0, template: `
12563
+ @if (showSlideOut) {
12564
+ <div class="product-configurator-slideout-body" [class.show-slide-out]="showSlideOut">
12565
+ <div class="product-configurator-selector-slideout-header">
12566
+ <div class="product-configurator-selector-slideout-close" (click)="handleCloseClick()">
12567
+ <co-button
12568
+ [label]="'BACK_TO_MAIN_CONFIGURATION' | localize: false | async"
12569
+ [iconData]="iconService.getIcon(icons.ChevronLeftRegular)"
12570
+ ></co-button>
12571
+ </div>
12572
+ <div class="slideout-head" [textContent]="displaySelection.optionText"></div>
12573
+ </div>
12574
+ @if (displayOptions && displayOptions.length > 0) {
12575
+ @for (child of displayOptions; track child.selector.id) {
12576
+ @if (child.selector.selNodeId === activeSelection) {
12577
+ <div class="child-article-option-container">
12578
+ <co-product-configurator-child-article-configurator
12579
+ [selection]="child.selector"
12580
+ [options]="child.selectorOptions"
12581
+ [lastNodeWithChildren]="child.lastNodeWithChildren"
12582
+ [markAsException]="child.markForExceptionNotification"
12583
+ [hasArticlesAsChildren]="child.selectorOptionsAreArticles">
12584
+ </co-product-configurator-child-article-configurator>
12585
+ </div>
12586
+ }
12587
+ }
12588
+ }
12589
+ </div>
12590
+ }
12591
+ `, 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: ProductConfiguratorChildArticleConfiguratorComponent, selector: "co-product-configurator-child-article-configurator", inputs: ["selection", "options", "lastNodeWithChildren", "selectionIndex", "treeLevelIndex", "markAsException", "hasArticlesAsChildren"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
12592
+ }
12593
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSlideoutComponent, decorators: [{
12594
+ type: Component,
12595
+ args: [{
12596
+ selector: 'co-product-configurator-slideout',
12597
+ template: `
12598
+ @if (showSlideOut) {
12599
+ <div class="product-configurator-slideout-body" [class.show-slide-out]="showSlideOut">
12600
+ <div class="product-configurator-selector-slideout-header">
12601
+ <div class="product-configurator-selector-slideout-close" (click)="handleCloseClick()">
12602
+ <co-button
12603
+ [label]="'BACK_TO_MAIN_CONFIGURATION' | localize: false | async"
12604
+ [iconData]="iconService.getIcon(icons.ChevronLeftRegular)"
12605
+ ></co-button>
12606
+ </div>
12607
+ <div class="slideout-head" [textContent]="displaySelection.optionText"></div>
12608
+ </div>
12609
+ @if (displayOptions && displayOptions.length > 0) {
12610
+ @for (child of displayOptions; track child.selector.id) {
12611
+ @if (child.selector.selNodeId === activeSelection) {
12612
+ <div class="child-article-option-container">
12613
+ <co-product-configurator-child-article-configurator
12614
+ [selection]="child.selector"
12615
+ [options]="child.selectorOptions"
12616
+ [lastNodeWithChildren]="child.lastNodeWithChildren"
12617
+ [markAsException]="child.markForExceptionNotification"
12618
+ [hasArticlesAsChildren]="child.selectorOptionsAreArticles">
12619
+ </co-product-configurator-child-article-configurator>
12620
+ </div>
12621
+ }
12622
+ }
12623
+ }
12624
+ </div>
12625
+ }
12626
+ `,
12627
+ standalone: false,
12628
+ encapsulation: ViewEncapsulation.None
12629
+ }]
12630
+ }], ctorParameters: () => [{ type: ConfiguratorConnectorService }, { type: IconCacheService }, { type: ConfiguratorEventService }], propDecorators: { showClass: [{
12631
+ type: HostBinding,
12632
+ args: ['class.co-product-configurator-slideout']
11520
12633
  }] } });
11521
12634
 
11522
12635
  class ProductConfiguratorComponent {
11523
12636
  configuratorConnectorService;
11524
12637
  buildFurnitureService;
11525
12638
  settingsService;
11526
- productConfiguratorService;
11527
12639
  iconService;
11528
12640
  _sanitizer;
11529
12641
  _configuringService;
11530
- _eventService;
12642
+ _appEventService;
11531
12643
  showClass() {
11532
12644
  return true;
11533
12645
  }
11534
12646
  icons = IconEnum;
11535
- // @Input()
11536
- // public set show(value: boolean) {
11537
- // this._show = value;
11538
- // }
11539
- //
11540
- // public get show(): boolean {
11541
- // return this._show;
11542
- // }
11543
12647
  showHeaderInformation = true;
11544
12648
  set showSelections(value) {
11545
12649
  this._showSelections = value;
@@ -11556,47 +12660,57 @@ class ProductConfiguratorComponent {
11556
12660
  article = new Article();
11557
12661
  selectionList = [];
11558
12662
  safeDescription;
12663
+ hideMainConfiguration = false;
11559
12664
  _showSelections = false;
11560
- _show = false;
11561
- _selectionSelected;
11562
12665
  _subs = [];
11563
- constructor(configuratorConnectorService, buildFurnitureService, settingsService, productConfiguratorService, iconService, _sanitizer, _configuringService, _eventService) {
12666
+ constructor(configuratorConnectorService, buildFurnitureService, settingsService, iconService, _sanitizer, _configuringService, _appEventService) {
11564
12667
  this.configuratorConnectorService = configuratorConnectorService;
11565
12668
  this.buildFurnitureService = buildFurnitureService;
11566
12669
  this.settingsService = settingsService;
11567
- this.productConfiguratorService = productConfiguratorService;
11568
12670
  this.iconService = iconService;
11569
12671
  this._sanitizer = _sanitizer;
11570
12672
  this._configuringService = _configuringService;
11571
- this._eventService = _eventService;
12673
+ this._appEventService = _appEventService;
11572
12674
  this._subs.push(this.settingsService.settingsLoaded.subscribe((loaded) => {
11573
12675
  if (loaded && this.settingsService.settings.currencySymbol) {
11574
12676
  this.valutaSymbol = this.settingsService.settings.currencySymbol;
11575
12677
  }
11576
- }), this.productConfiguratorService.selectSelection.subscribe((selection) => {
12678
+ }), this._appEventService.selectSelection.subscribe((selection) => {
11577
12679
  if (selection) {
11578
- this.onSelectionsSummarySelectSelection(selection);
12680
+ this.navigateToSelection(selection);
11579
12681
  }
11580
- }), this._eventService.articleReceived.subscribe((article) => {
12682
+ }), this._appEventService.articleReceived.subscribe((article) => {
11581
12683
  if (article) {
11582
12684
  this._handleArticleReceived(article);
11583
12685
  }
11584
- }), this._eventService.selectionWithAnswersChanged.subscribe((selections) => this._handleSelectionWithAnswersChanged(selections)));
12686
+ }), this._appEventService.selectionWithAnswersChanged.subscribe((selections) => this._handleSelectionWithAnswersChanged(selections)), this._appEventService.openSlideOut.subscribe(event => {
12687
+ if (event.open) {
12688
+ this.handleHideMainConfiguration(true);
12689
+ }
12690
+ }), this._appEventService.closeSlideOut.subscribe(() => {
12691
+ this.handleHideMainConfiguration(false);
12692
+ }));
11585
12693
  }
11586
12694
  ngOnDestroy() {
11587
12695
  this._subs.forEach(s => s.unsubscribe());
11588
12696
  }
11589
- async onSelectionsSummarySelectSelection(chosenOption) {
11590
- await this.configuratorConnectorService.navigateTo(chosenOption, true);
12697
+ async navigateToSelection(chosenOption) {
12698
+ await this.configuratorConnectorService.navigateToBySelNode(this._configuringService.buildResult.instanceId, chosenOption, true);
11591
12699
  await this.buildFurnitureService.currentActiveService.selectSelectionAsAnswer(chosenOption, this._configuringService.buildResult);
11592
12700
  }
11593
12701
  handleCloseClick() {
11594
- this.showChange.emit(false);
12702
+ // this.showChange.emit(false);
12703
+ }
12704
+ handleHideMainConfiguration(hide) {
12705
+ this.hideMainConfiguration = hide;
11595
12706
  }
11596
12707
  _handleSelectionWithAnswersChanged(selections) {
11597
12708
  if (selections && selections.length > 0) {
11598
12709
  this.selectionList = selections;
11599
12710
  }
12711
+ if (this.configuratorConnectorService.activeSlideOutParentId) {
12712
+ this.configuratorConnectorService.markSelectionForUserInput(this.configuratorConnectorService.activeSlideOutParentId);
12713
+ }
11600
12714
  }
11601
12715
  _handleArticleReceived(article) {
11602
12716
  if (!article) {
@@ -11614,102 +12728,114 @@ class ProductConfiguratorComponent {
11614
12728
  this.safeDescription = this._sanitizer.bypassSecurityTrustHtml(this.article.description);
11615
12729
  }
11616
12730
  }
11617
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorComponent, deps: [{ token: ConfiguratorConnectorService }, { token: SwitchBuildFurnitureService }, { token: ConfiguratorSettingsService }, { token: ProductConfiguratorService }, { token: IconCacheService }, { token: i1.DomSanitizer }, { token: ConfiguringService }, { token: ConfiguratorEventService }], target: i0.ɵɵFactoryTarget.Component });
12731
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorComponent, deps: [{ token: ConfiguratorConnectorService }, { token: SwitchBuildFurnitureService }, { token: ConfiguratorSettingsService }, { token: IconCacheService }, { token: i1.DomSanitizer }, { token: ConfiguringService }, { token: ConfiguratorEventService }], target: i0.ɵɵFactoryTarget.Component });
11618
12732
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ProductConfiguratorComponent, isStandalone: false, selector: "co-product-configurator", inputs: { 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: `
11619
- <div class="product-configurator-container">
11620
- @if (showHeaderInformation) {
11621
- <div class="product-configurator-header">
11622
- <div class="product-configurator-head">
11623
- <h2 class="product-configurator-header-text" [textContent]="article.name"></h2>
11624
- <p class="product-configurator-text" [innerHTML]="safeDescription"></p>
11625
- </div>
11626
- <div class="product-configurator-header-actions">
11627
- <co-configuration-preset></co-configuration-preset>
11628
- @if (canClose) {
11629
- <div class="product-configurator-close" (click)="handleCloseClick()">
11630
- <co-icon [iconData]="iconService.getIcon(icons.XmarkLightFull)"></co-icon>
11631
- </div>
11632
- }
11633
- </div>
12733
+ <div class="product-configurator-container" [class.hide-main-configuration]="hideMainConfiguration">
12734
+ @if (showHeaderInformation) {
12735
+ <div class="product-configurator-header">
12736
+ <div class="product-configurator-head">
12737
+ <h2 class="product-configurator-header-text" [textContent]="article.name"></h2>
12738
+ <p class="product-configurator-text" [innerHTML]="safeDescription"></p>
11634
12739
  </div>
11635
- }
11636
- <div class="product-configurator-details" #scrollcontainer>
11637
- @for (displaySelection of configuratorConnectorService.selectionWithAnswers; track displaySelection; let index = $index) {
11638
- <co-product-configurator-selector
11639
- [selection]="displaySelection.selector"
11640
- [options]="displaySelection.selectorOptions"
11641
- [lastNodeWithChildren]="displaySelection.lastNodeWithChildren"
11642
- [markAsException]="displaySelection.markForExceptionNotification"
11643
- [selectionIndex]="index + 1">
11644
- </co-product-configurator-selector>
11645
- }
11646
- </div>
11647
- @if (configuratorConnectorService.totalPrice !== undefined) {
11648
- <div class="product-configurator-summary">
11649
- <div class="product-configurator-summary-price-container">
11650
- @if (settingsService.settings.options.showAsConfigured) {
11651
- <div class="sum">
11652
- <label [textContent]="'AS_CONFIGURED' | localize:false | async"></label><span class="total-price"></span>
11653
- <div class="price" [textContent]="configuratorConnectorService.totalPrice | priceDisplay"></div>
11654
- </div>
11655
- }
11656
- </div>
12740
+ <div class="product-configurator-header-actions">
12741
+ <co-configuration-preset></co-configuration-preset>
12742
+ @if (canClose) {
12743
+ <div class="product-configurator-close" (click)="handleCloseClick()">
12744
+ <co-icon [iconData]="iconService.getIcon(icons.XmarkLightFull)"></co-icon>
12745
+ </div>
12746
+ }
11657
12747
  </div>
12748
+ </div>
12749
+ }
12750
+ <div class="product-configurator-details" #scrollcontainer>
12751
+ @for (displaySelection of configuratorConnectorService.selectionWithAnswers; track displaySelection.selector; let index = $index) {
12752
+ <co-product-configurator-selector
12753
+ [selection]="displaySelection.selector"
12754
+ [options]="displaySelection.selectorOptions"
12755
+ [repeatedOptions]="displaySelection.repeatedOptions"
12756
+ [lastNodeWithChildren]="displaySelection.lastNodeWithChildren"
12757
+ [markAsException]="displaySelection.markForExceptionNotification"
12758
+ [hasArticlesAsChildren]="displaySelection.selectorOptionsAreArticles"
12759
+ [markForUserInput]="displaySelection.markForUserInput"
12760
+ [selectionIndex]="index + 1">
12761
+ </co-product-configurator-selector>
11658
12762
  }
11659
12763
  </div>
11660
- `, 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: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.PriceDisplayPipe, name: "priceDisplay" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
12764
+ @if (configuratorConnectorService.totalPrice !== undefined) {
12765
+ <div class="product-configurator-summary">
12766
+ <div class="product-configurator-summary-price-container">
12767
+ @if (settingsService.settings.options.showAsConfigured) {
12768
+ <div class="sum">
12769
+ <label [textContent]="'AS_CONFIGURED' | localize:false | async"></label><span class="total-price"></span>
12770
+ <div class="price" [textContent]="configuratorConnectorService.totalPrice | priceDisplay"></div>
12771
+ </div>
12772
+ }
12773
+ </div>
12774
+ </div>
12775
+ }
12776
+
12777
+ <co-product-configurator-slideout></co-product-configurator-slideout>
12778
+ </div>
12779
+
12780
+ `, 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", "repeatedOptions", "lastNodeWithChildren", "markForUserInput", "selectionIndex", "treeLevelIndex", "markAsException", "hasArticlesAsChildren"], outputs: ["activate", "openSlideOutClick"] }, { kind: "component", type: ProductConfiguratorSlideoutComponent, selector: "co-product-configurator-slideout" }, { kind: "component", type: ConfigurationPresetComponent, selector: "co-configuration-preset" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.PriceDisplayPipe, name: "priceDisplay" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None });
11661
12781
  }
11662
12782
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorComponent, decorators: [{
11663
12783
  type: Component,
11664
12784
  args: [{
11665
12785
  selector: 'co-product-configurator',
11666
12786
  template: `
11667
- <div class="product-configurator-container">
11668
- @if (showHeaderInformation) {
11669
- <div class="product-configurator-header">
11670
- <div class="product-configurator-head">
11671
- <h2 class="product-configurator-header-text" [textContent]="article.name"></h2>
11672
- <p class="product-configurator-text" [innerHTML]="safeDescription"></p>
11673
- </div>
11674
- <div class="product-configurator-header-actions">
11675
- <co-configuration-preset></co-configuration-preset>
11676
- @if (canClose) {
11677
- <div class="product-configurator-close" (click)="handleCloseClick()">
11678
- <co-icon [iconData]="iconService.getIcon(icons.XmarkLightFull)"></co-icon>
11679
- </div>
11680
- }
11681
- </div>
12787
+ <div class="product-configurator-container" [class.hide-main-configuration]="hideMainConfiguration">
12788
+ @if (showHeaderInformation) {
12789
+ <div class="product-configurator-header">
12790
+ <div class="product-configurator-head">
12791
+ <h2 class="product-configurator-header-text" [textContent]="article.name"></h2>
12792
+ <p class="product-configurator-text" [innerHTML]="safeDescription"></p>
11682
12793
  </div>
11683
- }
11684
- <div class="product-configurator-details" #scrollcontainer>
11685
- @for (displaySelection of configuratorConnectorService.selectionWithAnswers; track displaySelection; let index = $index) {
11686
- <co-product-configurator-selector
11687
- [selection]="displaySelection.selector"
11688
- [options]="displaySelection.selectorOptions"
11689
- [lastNodeWithChildren]="displaySelection.lastNodeWithChildren"
11690
- [markAsException]="displaySelection.markForExceptionNotification"
11691
- [selectionIndex]="index + 1">
11692
- </co-product-configurator-selector>
11693
- }
11694
- </div>
11695
- @if (configuratorConnectorService.totalPrice !== undefined) {
11696
- <div class="product-configurator-summary">
11697
- <div class="product-configurator-summary-price-container">
11698
- @if (settingsService.settings.options.showAsConfigured) {
11699
- <div class="sum">
11700
- <label [textContent]="'AS_CONFIGURED' | localize:false | async"></label><span class="total-price"></span>
11701
- <div class="price" [textContent]="configuratorConnectorService.totalPrice | priceDisplay"></div>
11702
- </div>
11703
- }
11704
- </div>
12794
+ <div class="product-configurator-header-actions">
12795
+ <co-configuration-preset></co-configuration-preset>
12796
+ @if (canClose) {
12797
+ <div class="product-configurator-close" (click)="handleCloseClick()">
12798
+ <co-icon [iconData]="iconService.getIcon(icons.XmarkLightFull)"></co-icon>
12799
+ </div>
12800
+ }
11705
12801
  </div>
12802
+ </div>
12803
+ }
12804
+ <div class="product-configurator-details" #scrollcontainer>
12805
+ @for (displaySelection of configuratorConnectorService.selectionWithAnswers; track displaySelection.selector; let index = $index) {
12806
+ <co-product-configurator-selector
12807
+ [selection]="displaySelection.selector"
12808
+ [options]="displaySelection.selectorOptions"
12809
+ [repeatedOptions]="displaySelection.repeatedOptions"
12810
+ [lastNodeWithChildren]="displaySelection.lastNodeWithChildren"
12811
+ [markAsException]="displaySelection.markForExceptionNotification"
12812
+ [hasArticlesAsChildren]="displaySelection.selectorOptionsAreArticles"
12813
+ [markForUserInput]="displaySelection.markForUserInput"
12814
+ [selectionIndex]="index + 1">
12815
+ </co-product-configurator-selector>
11706
12816
  }
11707
12817
  </div>
11708
- `,
12818
+ @if (configuratorConnectorService.totalPrice !== undefined) {
12819
+ <div class="product-configurator-summary">
12820
+ <div class="product-configurator-summary-price-container">
12821
+ @if (settingsService.settings.options.showAsConfigured) {
12822
+ <div class="sum">
12823
+ <label [textContent]="'AS_CONFIGURED' | localize:false | async"></label><span class="total-price"></span>
12824
+ <div class="price" [textContent]="configuratorConnectorService.totalPrice | priceDisplay"></div>
12825
+ </div>
12826
+ }
12827
+ </div>
12828
+ </div>
12829
+ }
12830
+
12831
+ <co-product-configurator-slideout></co-product-configurator-slideout>
12832
+ </div>
12833
+
12834
+ `,
11709
12835
  encapsulation: ViewEncapsulation.None,
11710
12836
  standalone: false
11711
12837
  }]
11712
- }], ctorParameters: () => [{ type: ConfiguratorConnectorService }, { type: SwitchBuildFurnitureService }, { type: ConfiguratorSettingsService }, { type: ProductConfiguratorService }, { type: IconCacheService }, { type: i1.DomSanitizer }, { type: ConfiguringService }, { type: ConfiguratorEventService }], propDecorators: { showClass: [{
12838
+ }], ctorParameters: () => [{ type: ConfiguratorConnectorService }, { type: SwitchBuildFurnitureService }, { type: ConfiguratorSettingsService }, { type: IconCacheService }, { type: i1.DomSanitizer }, { type: ConfiguringService }, { type: ConfiguratorEventService }], propDecorators: { showClass: [{
11713
12839
  type: HostBinding,
11714
12840
  args: ['class.co-product-configurator']
11715
12841
  }], showHeaderInformation: [{
@@ -12298,7 +13424,7 @@ class ConfiguratorCameraSettingsComponent {
12298
13424
  <button (click)="exportSettings()" [textContent]="'EXPORT_SETTINGS' | localize:false | async"></button>
12299
13425
  </div>
12300
13426
  </div>
12301
- `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "directive", type: i6$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
13427
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "directive", type: i6$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6$2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
12302
13428
  }
12303
13429
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfiguratorCameraSettingsComponent, decorators: [{
12304
13430
  type: Component,
@@ -12499,7 +13625,7 @@ class ConfiguratorExportDialogComponent {
12499
13625
  </div>
12500
13626
  </div>
12501
13627
  </div>
12502
- `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
13628
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
12503
13629
  }
12504
13630
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfiguratorExportDialogComponent, decorators: [{
12505
13631
  type: Component,
@@ -12794,7 +13920,9 @@ class AnswersSlideoutModule {
12794
13920
  ColorFilterModule,
12795
13921
  TagFilterModule,
12796
13922
  DirectivesModule,
12797
- UtilitiesPipesModule], exports: [AnswersSlideoutComponent] });
13923
+ UtilitiesPipesModule,
13924
+ InputTextChipsModule,
13925
+ ButtonModule], exports: [AnswersSlideoutComponent] });
12798
13926
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: AnswersSlideoutModule, imports: [SlideoutModule,
12799
13927
  TranslationModule,
12800
13928
  CommonModule,
@@ -12805,7 +13933,9 @@ class AnswersSlideoutModule {
12805
13933
  ColorFilterModule,
12806
13934
  TagFilterModule,
12807
13935
  DirectivesModule,
12808
- UtilitiesPipesModule] });
13936
+ UtilitiesPipesModule,
13937
+ InputTextChipsModule,
13938
+ ButtonModule] });
12809
13939
  }
12810
13940
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: AnswersSlideoutModule, decorators: [{
12811
13941
  type: NgModule,
@@ -12821,7 +13951,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
12821
13951
  ColorFilterModule,
12822
13952
  TagFilterModule,
12823
13953
  DirectivesModule,
12824
- UtilitiesPipesModule
13954
+ UtilitiesPipesModule,
13955
+ InputTextChipsModule,
13956
+ ButtonModule
12825
13957
  ],
12826
13958
  declarations: [
12827
13959
  AnswersSlideoutComponent,
@@ -13097,13 +14229,15 @@ class ProductConfiguratorSelectorOptionModule {
13097
14229
  ProductConfiguratorSelectorOptionTileModule,
13098
14230
  ProductConfiguratorSelectorOptionCheckboxModule,
13099
14231
  ProductConfiguratorSelectorOptionButtonModule,
13100
- ProductConfiguratorSelectorOptionDropdownModule], exports: [ProductConfiguratorSelectorOptionComponent] });
14232
+ ProductConfiguratorSelectorOptionDropdownModule,
14233
+ DirectivesModule], exports: [ProductConfiguratorSelectorOptionComponent] });
13101
14234
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorOptionModule, imports: [TranslationModule,
13102
14235
  CommonModule,
13103
14236
  ProductConfiguratorSelectorOptionTileModule,
13104
14237
  ProductConfiguratorSelectorOptionCheckboxModule,
13105
14238
  ProductConfiguratorSelectorOptionButtonModule,
13106
- ProductConfiguratorSelectorOptionDropdownModule] });
14239
+ ProductConfiguratorSelectorOptionDropdownModule,
14240
+ DirectivesModule] });
13107
14241
  }
13108
14242
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorOptionModule, decorators: [{
13109
14243
  type: NgModule,
@@ -13114,23 +14248,70 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
13114
14248
  ProductConfiguratorSelectorOptionTileModule,
13115
14249
  ProductConfiguratorSelectorOptionCheckboxModule,
13116
14250
  ProductConfiguratorSelectorOptionButtonModule,
13117
- ProductConfiguratorSelectorOptionDropdownModule
14251
+ ProductConfiguratorSelectorOptionDropdownModule,
14252
+ DirectivesModule
13118
14253
  ],
13119
14254
  declarations: [ProductConfiguratorSelectorOptionComponent],
13120
14255
  exports: [ProductConfiguratorSelectorOptionComponent]
13121
14256
  }]
13122
14257
  }] });
13123
14258
 
14259
+ class ProductConfiguratorRepeatButtonsModule {
14260
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorRepeatButtonsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
14261
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorRepeatButtonsModule, declarations: [ProductConfiguratorRepeatButtonsComponent], imports: [ButtonModule,
14262
+ TranslationModule,
14263
+ AsyncPipe], exports: [ProductConfiguratorRepeatButtonsComponent] });
14264
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorRepeatButtonsModule, imports: [ButtonModule,
14265
+ TranslationModule] });
14266
+ }
14267
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorRepeatButtonsModule, decorators: [{
14268
+ type: NgModule,
14269
+ args: [{
14270
+ imports: [
14271
+ ButtonModule,
14272
+ TranslationModule,
14273
+ AsyncPipe
14274
+ ],
14275
+ schemas: [
14276
+ NO_ERRORS_SCHEMA
14277
+ ],
14278
+ declarations: [
14279
+ ProductConfiguratorRepeatButtonsComponent
14280
+ ],
14281
+ exports: [
14282
+ ProductConfiguratorRepeatButtonsComponent
14283
+ ]
14284
+ }]
14285
+ }] });
14286
+
13124
14287
  class ProductConfiguratorSelectorModule {
13125
14288
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
13126
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorModule, declarations: [ProductConfiguratorSelectorComponent], imports: [TranslationModule,
14289
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorModule, declarations: [ProductConfiguratorSelectorComponent,
14290
+ ProductConfiguratorSelectorChildArticleComponent,
14291
+ ProductConfiguratorChildArticleConfiguratorComponent,
14292
+ ProductConfiguratorSlideoutComponent,
14293
+ ProductConfiguratorGroupedRepeatableOptionsComponent], imports: [TranslationModule,
13127
14294
  CommonModule,
13128
14295
  IconModule,
13129
- ProductConfiguratorSelectorOptionModule], exports: [ProductConfiguratorSelectorComponent] });
14296
+ ProductConfiguratorSelectorOptionModule,
14297
+ AppendPipeModule,
14298
+ AnswerCardModule,
14299
+ DirectivesModule,
14300
+ ButtonModule,
14301
+ ProductConfiguratorRepeatButtonsModule], exports: [ProductConfiguratorSelectorComponent,
14302
+ ProductConfiguratorSelectorChildArticleComponent,
14303
+ ProductConfiguratorChildArticleConfiguratorComponent,
14304
+ ProductConfiguratorSlideoutComponent,
14305
+ ProductConfiguratorGroupedRepeatableOptionsComponent] });
13130
14306
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorModule, imports: [TranslationModule,
13131
14307
  CommonModule,
13132
14308
  IconModule,
13133
- ProductConfiguratorSelectorOptionModule] });
14309
+ ProductConfiguratorSelectorOptionModule,
14310
+ AppendPipeModule,
14311
+ AnswerCardModule,
14312
+ DirectivesModule,
14313
+ ButtonModule,
14314
+ ProductConfiguratorRepeatButtonsModule] });
13134
14315
  }
13135
14316
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ProductConfiguratorSelectorModule, decorators: [{
13136
14317
  type: NgModule,
@@ -13139,13 +14320,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
13139
14320
  TranslationModule,
13140
14321
  CommonModule,
13141
14322
  IconModule,
13142
- ProductConfiguratorSelectorOptionModule
14323
+ ProductConfiguratorSelectorOptionModule,
14324
+ AppendPipeModule,
14325
+ AnswerCardModule,
14326
+ DirectivesModule,
14327
+ ButtonModule,
14328
+ ProductConfiguratorRepeatButtonsModule
13143
14329
  ],
13144
14330
  declarations: [
13145
- ProductConfiguratorSelectorComponent
14331
+ ProductConfiguratorSelectorComponent,
14332
+ ProductConfiguratorSelectorChildArticleComponent,
14333
+ ProductConfiguratorChildArticleConfiguratorComponent,
14334
+ ProductConfiguratorSlideoutComponent,
14335
+ ProductConfiguratorGroupedRepeatableOptionsComponent
13146
14336
  ],
13147
14337
  exports: [
13148
- ProductConfiguratorSelectorComponent
14338
+ ProductConfiguratorSelectorComponent,
14339
+ ProductConfiguratorSelectorChildArticleComponent,
14340
+ ProductConfiguratorChildArticleConfiguratorComponent,
14341
+ ProductConfiguratorSlideoutComponent,
14342
+ ProductConfiguratorGroupedRepeatableOptionsComponent
13149
14343
  ]
13150
14344
  }]
13151
14345
  }] });
@@ -13265,7 +14459,7 @@ class ConfiguratorSceneLoaderComponent {
13265
14459
  {{ loaderProgress | number: '1.0-0' }}%
13266
14460
  </div>
13267
14461
  </div>
13268
- `, isInline: true, dependencies: [{ kind: "pipe", type: i5.DecimalPipe, name: "number" }], encapsulation: i0.ViewEncapsulation.None });
14462
+ `, isInline: true, dependencies: [{ kind: "pipe", type: i6$1.DecimalPipe, name: "number" }], encapsulation: i0.ViewEncapsulation.None });
13269
14463
  }
13270
14464
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfiguratorSceneLoaderComponent, decorators: [{
13271
14465
  type: Component,
@@ -13608,7 +14802,7 @@ class ElementToolbarComponent {
13608
14802
  }
13609
14803
  </div>
13610
14804
  }
13611
- `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], animations: [
14805
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }], animations: [
13612
14806
  trigger('showHideEditMenu', [
13613
14807
  state('void', style({ 'height': '0', opacity: 0 })),
13614
14808
  state('*', style({ 'height': '*', opacity: 1 })),
@@ -13874,7 +15068,7 @@ class SceneOptionsComponent {
13874
15068
  </div>
13875
15069
  }
13876
15070
  </div>
13877
- `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], animations: [
15071
+ `, isInline: true, dependencies: [{ kind: "directive", type: i6$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i4.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "pipe", type: i6$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], animations: [
13878
15072
  trigger('showHideChild', [
13879
15073
  state('true', style({ 'opacity': '1', 'visibility': 'visible' })),
13880
15074
  state('false', style({ 'opacity': '0', 'visibility': 'hidden' })),
@@ -14291,36 +15485,62 @@ class CustomObject3D extends THREE.Object3D {
14291
15485
  class SceneButtonUtils {
14292
15486
  static getAddButtons(item, selectedMesh) {
14293
15487
  const result = [];
14294
- let objectToTraverse = item;
15488
+ const usedKeys = new Set();
15489
+ let objectToTraverse;
14295
15490
  if (selectedMesh) {
14296
15491
  objectToTraverse = selectedMesh;
14297
15492
  }
15493
+ else {
15494
+ objectToTraverse = item;
15495
+ }
14298
15496
  objectToTraverse.traverse((child) => {
14299
15497
  const selection = ObjectUtils.GetSelectionFromSelectedObject(child);
14300
- if (selection) {
14301
- // @ts-ignore
14302
- if (selection.hdecoPositioning !== 'N') {
14303
- const len = selection.decoNode ? selection.decoNode.connectors.length : 0;
14304
- for (let i = 0; i < len; i++) {
14305
- if (selection.decoNode.connectors[i] === null) {
14306
- return;
14307
- }
14308
- const conObject = this._getConnectorObject(child, selection.decoNode.connectors[i].connector);
14309
- const conObjectParent = ObjectUtils.GetParentItem(conObject, CustomObject3D);
14310
- const existingButton = result.find((eab) => {
14311
- return conObjectParent && ((eab.connectorObject.connectedTo === conObjectParent.name) || (eab.connectorObject.name === conObject.name));
14312
- }); // only unique buttons
14313
- if (!existingButton) {
14314
- if (conObject && this._canShowAddButton(selection.decoNode.connectors[i], conObject)) {
14315
- result.push({
14316
- selection: selection,
14317
- connector: selection.decoNode.connectors[i],
14318
- child: child,
14319
- connectorObject: conObject
14320
- });
14321
- }
14322
- }
14323
- }
15498
+ if (!selection) {
15499
+ return;
15500
+ }
15501
+ if (selection.hdecoPositioning === 'N') {
15502
+ return;
15503
+ }
15504
+ let len;
15505
+ if (selection.decoNode && selection.decoNode.connectors) {
15506
+ len = selection.decoNode.connectors.length;
15507
+ }
15508
+ else {
15509
+ len = 0;
15510
+ }
15511
+ for (let i = 0; i < len; i++) {
15512
+ const connector = selection.decoNode.connectors[i];
15513
+ if (connector === null) {
15514
+ continue;
15515
+ }
15516
+ const conObject = this._getConnectorObject(child, connector.connector);
15517
+ if (!conObject || !this._canShowAddButton(connector, conObject)) {
15518
+ continue;
15519
+ }
15520
+ const conObjectParent = ObjectUtils.GetParentItem(conObject, CustomObject3D);
15521
+ let parentName;
15522
+ if (conObjectParent) {
15523
+ parentName = conObjectParent.name;
15524
+ }
15525
+ else {
15526
+ parentName = '';
15527
+ }
15528
+ let connectedTo;
15529
+ if (conObject.connectedTo) {
15530
+ connectedTo = conObject.connectedTo;
15531
+ }
15532
+ else {
15533
+ connectedTo = '';
15534
+ }
15535
+ const dedupeKey = conObject.name + '|' + parentName + '|' + connectedTo;
15536
+ if (!usedKeys.has(dedupeKey)) {
15537
+ usedKeys.add(dedupeKey);
15538
+ result.push({
15539
+ selection: selection,
15540
+ connector: connector,
15541
+ child: child,
15542
+ connectorObject: conObject
15543
+ });
14324
15544
  }
14325
15545
  }
14326
15546
  });
@@ -14892,6 +16112,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
14892
16112
  args: [{ providedIn: 'root' }]
14893
16113
  }], ctorParameters: () => [{ type: ConfiguratorSceneService }, { type: FontService }, { type: ConfiguratorItemService }] });
14894
16114
 
16115
+ var SceneEventState;
16116
+ (function (SceneEventState) {
16117
+ SceneEventState[SceneEventState["UNSELECTED"] = 0] = "UNSELECTED";
16118
+ SceneEventState[SceneEventState["SELECTED"] = 1] = "SELECTED";
16119
+ SceneEventState[SceneEventState["DRAGGING"] = 2] = "DRAGGING";
16120
+ SceneEventState[SceneEventState["ROTATING"] = 3] = "ROTATING";
16121
+ SceneEventState[SceneEventState["PANNING"] = 5] = "PANNING";
16122
+ SceneEventState[SceneEventState["DND"] = 6] = "DND";
16123
+ SceneEventState[SceneEventState["EXPLORE"] = 7] = "EXPLORE";
16124
+ SceneEventState[SceneEventState["DRAGGINGCONNECTOR"] = 8] = "DRAGGINGCONNECTOR";
16125
+ })(SceneEventState || (SceneEventState = {}));
16126
+
16127
+ class IntersectedObjects {
16128
+ parent;
16129
+ child;
16130
+ constructor(parent = undefined, child = undefined) {
16131
+ this.parent = parent;
16132
+ this.child = child;
16133
+ }
16134
+ }
16135
+
16136
+ class IntersectionService {
16137
+ _cameraService;
16138
+ constructor(_cameraService) {
16139
+ this._cameraService = _cameraService;
16140
+ }
16141
+ getIntersections(mouseVector, planeObjects, options) {
16142
+ const { filterByNormals = false, onlyVisible = false, recursive = true, linePrecision = 0.2, includeFloors = false, onlyConfigurableFloors = false } = options || {};
16143
+ if (!mouseVector || !planeObjects.length) {
16144
+ return [];
16145
+ }
16146
+ const camera = this._cameraService.camera;
16147
+ const direction = mouseVector.sub(camera.position).normalize();
16148
+ const rayCaster = new Raycaster(camera.position, direction);
16149
+ rayCaster.params.Line.threshold = linePrecision;
16150
+ try {
16151
+ let intersections = rayCaster.intersectObjects(planeObjects, recursive);
16152
+ if (onlyVisible && intersections.length > 0) {
16153
+ intersections = this.removeIf(intersections, (intersection) => {
16154
+ return !intersection.object.visible;
16155
+ });
16156
+ }
16157
+ return intersections;
16158
+ }
16159
+ catch (e) {
16160
+ return [];
16161
+ }
16162
+ }
16163
+ removeIf(array, func) {
16164
+ const tResult = [];
16165
+ array.forEach((element) => {
16166
+ if (!func(element)) {
16167
+ tResult.push(element);
16168
+ }
16169
+ });
16170
+ return tResult;
16171
+ }
16172
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: IntersectionService, deps: [{ token: ConfiguratorCameraService }], target: i0.ɵɵFactoryTarget.Injectable });
16173
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: IntersectionService, providedIn: 'root' });
16174
+ }
16175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: IntersectionService, decorators: [{
16176
+ type: Injectable,
16177
+ args: [{ providedIn: 'root' }]
16178
+ }], ctorParameters: () => [{ type: ConfiguratorCameraService }] });
16179
+
14895
16180
  var TextureType;
14896
16181
  (function (TextureType) {
14897
16182
  TextureType[TextureType["Basic"] = 0] = "Basic";
@@ -15056,6 +16341,8 @@ class FloorPlaneService {
15056
16341
  this._settingsService = _settingsService;
15057
16342
  this._sceneService = _sceneService;
15058
16343
  this._sceneOptionsService = _sceneOptionsService;
16344
+ this._sceneService.getFloorSizeFn = () => this.getPlaneSize();
16345
+ this._sceneService.getCenterFloorFn = () => this.getCenterFloorPlane();
15059
16346
  this._subs.push(this._sceneService.floorTexturesLoaded.subscribe((textures) => {
15060
16347
  if (textures && textures.length > 0) {
15061
16348
  this.createFloorPlane(textures);
@@ -15105,6 +16392,9 @@ class FloorPlaneService {
15105
16392
  }
15106
16393
  }
15107
16394
  getDimensions(scale = 1) {
16395
+ if (!this._floorPlane) {
16396
+ return { x: { min: 0, max: 0 }, y: { min: 0, max: 0 } };
16397
+ }
15108
16398
  const box = new Box3().setFromObject(this._floorPlane);
15109
16399
  return {
15110
16400
  x: {
@@ -15283,6 +16573,252 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15283
16573
  }]
15284
16574
  }], ctorParameters: () => [{ type: ConfiguratorSettingsService }, { type: ConfiguratorSceneService }, { type: SceneOptionsService }] });
15285
16575
 
16576
+ class SceneEventService {
16577
+ _sceneService;
16578
+ _cameraService;
16579
+ _connectorService;
16580
+ _intersectionService;
16581
+ _floorPlaneService;
16582
+ _itemService;
16583
+ _appEventService;
16584
+ intersectOffsetForWalls = 20;
16585
+ longTouchDuration = 600;
16586
+ rotateNoDrag = false;
16587
+ _element;
16588
+ _controls;
16589
+ _camera;
16590
+ _mousePosition = new Vector2();
16591
+ _oldMousePosition = new Vector2();
16592
+ _rotationStartPoint = null;
16593
+ _intersectedObject;
16594
+ _intersectedMesh;
16595
+ _mouseoverObject;
16596
+ _selectedObject;
16597
+ _prevSelectedObject;
16598
+ _defaultCursorStyle = 'pointer';
16599
+ _inDragOver = false;
16600
+ _mouseDown = false;
16601
+ _mouseMoved = false; // has mouse moved since down click
16602
+ _rotateMouseOver = false;
16603
+ _groupingMode = false;
16604
+ _state = SceneEventState.UNSELECTED;
16605
+ _intersectedWall;
16606
+ _intersectedFloor;
16607
+ _subs = [];
16608
+ _cameraMoveSub;
16609
+ _debouncedSaveState = new Subject();
16610
+ _touchStart;
16611
+ _touchEnd;
16612
+ _touchCancel;
16613
+ _touchMove;
16614
+ constructor(_sceneService, _cameraService, _connectorService, _intersectionService, _floorPlaneService, _itemService, _appEventService) {
16615
+ this._sceneService = _sceneService;
16616
+ this._cameraService = _cameraService;
16617
+ this._connectorService = _connectorService;
16618
+ this._intersectionService = _intersectionService;
16619
+ this._floorPlaneService = _floorPlaneService;
16620
+ this._itemService = _itemService;
16621
+ this._appEventService = _appEventService;
16622
+ }
16623
+ ngOnDestroy() {
16624
+ this._subs.forEach(s => s.unsubscribe());
16625
+ this._element = undefined;
16626
+ }
16627
+ init(element) {
16628
+ this._element = element;
16629
+ this._controls = this._cameraService.controls;
16630
+ this._camera = this._cameraService.camera;
16631
+ this._touchStart = fromEvent(element, 'touchstart');
16632
+ this._touchEnd = fromEvent(element, 'touchend');
16633
+ this._touchCancel = fromEvent(element, 'touchcancel');
16634
+ this._touchMove = fromEvent(element, 'touchmove');
16635
+ fromEvent(element, 'mousedown').pipe(filter((event) => event.button === 0)).subscribe(event => this._leftMouseDownEvent(event));
16636
+ fromEvent(element, 'mouseup').subscribe((event) => this._mouseUpEvent(event));
16637
+ fromEvent(element, 'mousemove').subscribe((event) => this._mouseMoveEvent(event));
16638
+ this._touchStart.subscribe((event) => this._touchStartEvent(event));
16639
+ this._touchEnd.subscribe((event) => this._touchEndEvent(event));
16640
+ this._touchCancel.subscribe((event) => this._touchEndEvent(event));
16641
+ this._touchMove.subscribe((event) => this._touchMoveEvent(event));
16642
+ this._subs.push(
16643
+ // this._itemGroupService.objectAdded.subscribe((object) => this.setSelectedObject(object)),
16644
+ );
16645
+ }
16646
+ setExploreMode(on = true) {
16647
+ // TODO Remove
16648
+ }
16649
+ setSelectedObject(object, mesh) {
16650
+ if (object) {
16651
+ const intersectedObjects = new IntersectedObjects(object, mesh);
16652
+ this._state = SceneEventState.SELECTED;
16653
+ this._appEventService.onObjectSelected.next(intersectedObjects);
16654
+ }
16655
+ this._markSceneToUpdate();
16656
+ }
16657
+ setUnselectedObject() {
16658
+ this._state = SceneEventState.UNSELECTED;
16659
+ this._appEventService.onObjectUnSelected.next(true);
16660
+ }
16661
+ _updateIntersections() {
16662
+ // get floorplan
16663
+ const floorPlane = this._floorPlaneService.floorPlane;
16664
+ // get object in the scene
16665
+ const item = this._itemService.sceneItems.values().next().value;
16666
+ const objectPlanes = [floorPlane, item];
16667
+ const intersects = this._getIntersections(this._mousePosition, objectPlanes, { onlyVisible: true, includeFloors: false });
16668
+ // object intersection is prioritized
16669
+ if (intersects.length > 1) {
16670
+ this._setIntersectedObject(intersects[0].object);
16671
+ }
16672
+ else if (intersects.length === 1 && intersects[0].object.name === floorPlane.name) {
16673
+ // just the floor, no object
16674
+ this._clearIntersectedObject();
16675
+ }
16676
+ else {
16677
+ this._clearIntersectedObject();
16678
+ }
16679
+ }
16680
+ _clearIntersectedObject() {
16681
+ this._intersectedMesh = null;
16682
+ this._intersectedObject = null;
16683
+ }
16684
+ _setMousePositionFromTouchEvent(event) {
16685
+ const canvas = this._element;
16686
+ this._mousePosition = RelativePositionUtils.GetClientTouchPosition(event, canvas);
16687
+ }
16688
+ _touchStartEvent(event) {
16689
+ if (this._isMouseEventAllowed(event)) {
16690
+ const longTouch = of(1)
16691
+ .pipe(delay(this.longTouchDuration))
16692
+ .pipe(takeUntil(this._touchStart))
16693
+ .pipe(takeUntil(this._touchEnd))
16694
+ .pipe(takeUntil(this._touchCancel));
16695
+ longTouch.subscribe(() => {
16696
+ this._updateIntersections();
16697
+ });
16698
+ this._mouseMoved = false;
16699
+ this._mouseDown = true;
16700
+ this._setMousePositionFromTouchEvent(event);
16701
+ switch (this._state) {
16702
+ case SceneEventState.SELECTED:
16703
+ if (!this._intersectedObject) {
16704
+ this.setUnselectedObject();
16705
+ }
16706
+ else {
16707
+ this.setSelectedObject(this._intersectedObject, this._intersectedMesh);
16708
+ }
16709
+ break;
16710
+ case SceneEventState.UNSELECTED:
16711
+ if (this._intersectedObject) {
16712
+ this.setSelectedObject(this._intersectedObject, this._intersectedMesh);
16713
+ }
16714
+ break;
16715
+ }
16716
+ }
16717
+ }
16718
+ async _touchEndEvent(event) {
16719
+ // TODO check if we still need this.
16720
+ }
16721
+ _touchMoveEvent(event) {
16722
+ if (this._isMouseEventAllowed(event)) {
16723
+ this._setMousePositionFromTouchEvent(event);
16724
+ this._mouseMoved = true;
16725
+ if (this._mouseMoved) {
16726
+ this._updateIntersections();
16727
+ }
16728
+ }
16729
+ }
16730
+ //
16731
+ // MOUSE EVENTS
16732
+ //
16733
+ // TODO Might be ok to remove
16734
+ async _mouseUpEvent(event) {
16735
+ // this._mouseDown = false;
16736
+ // switch (this._state) {
16737
+ // case SceneEventState.UNSELECTED:
16738
+ // break;
16739
+ // case SceneEventState.SELECTED:
16740
+ // break;
16741
+ // }
16742
+ }
16743
+ _mouseMoveEvent(event) {
16744
+ if (this._isMouseEventAllowed(event)) {
16745
+ const mousePos = event ? RelativePositionUtils.GetClientMousePosition(event) : this._mousePosition;
16746
+ let canvas;
16747
+ if (event) {
16748
+ event.preventDefault();
16749
+ canvas = event.currentTarget;
16750
+ }
16751
+ this._mousePosition.set(mousePos.x - (canvas ? canvas.offsetLeft : 0), mousePos.y - (canvas ? canvas.offsetTop : 0));
16752
+ if (this._oldMousePosition.x !== mousePos.x && this._oldMousePosition.y !== mousePos.y) {
16753
+ this._mouseMoved = true;
16754
+ }
16755
+ if (this._mouseMoved) {
16756
+ this._updateIntersections();
16757
+ }
16758
+ }
16759
+ }
16760
+ _leftMouseDownEvent(event) {
16761
+ if (this._isMouseEventAllowed(event)) {
16762
+ if (event) {
16763
+ event.preventDefault();
16764
+ }
16765
+ switch (this._state) {
16766
+ case SceneEventState.SELECTED:
16767
+ if (!this._intersectedObject) {
16768
+ this.setUnselectedObject();
16769
+ }
16770
+ else {
16771
+ this.setSelectedObject(this._intersectedObject, this._intersectedMesh);
16772
+ }
16773
+ break;
16774
+ case SceneEventState.UNSELECTED:
16775
+ if (this._intersectedObject) {
16776
+ this.setSelectedObject(this._intersectedObject, this._intersectedMesh);
16777
+ }
16778
+ break;
16779
+ }
16780
+ }
16781
+ }
16782
+ _getIntersections(mousePos, objects, options) {
16783
+ const mouseVector = this._mouseToVec3(mousePos);
16784
+ return this._intersectionService.getIntersections(mouseVector, objects, options);
16785
+ }
16786
+ _setIntersectedObject(mesh) {
16787
+ if (mesh && mesh.parent && mesh.parent.userData && mesh.parent.userData.rootObject) {
16788
+ this._intersectedMesh = mesh;
16789
+ }
16790
+ if (mesh && mesh.userData && mesh.userData.rootObject) {
16791
+ this._intersectedObject = mesh;
16792
+ }
16793
+ else if (mesh.parent) {
16794
+ this._setIntersectedObject(mesh.parent);
16795
+ }
16796
+ }
16797
+ _isMouseEventAllowed(event) {
16798
+ return event ? (event.target && event.target.nodeName === 'CANVAS') : true;
16799
+ }
16800
+ // Reverted changes from IONE-31399
16801
+ _mouseToVec3(vec2) {
16802
+ const rendererElement = this._element;
16803
+ const mPosition = new Vector2((vec2.x / rendererElement.clientWidth) * 2 - 1, -(vec2.y / rendererElement.clientHeight) * 2 + 1);
16804
+ const vector = new Vector3(mPosition.x, mPosition.y, 0.5);
16805
+ vector.unproject(this._camera);
16806
+ return vector;
16807
+ }
16808
+ _markSceneToUpdate() {
16809
+ this._sceneService.needsRender = true;
16810
+ }
16811
+ _setCursorStyle(style) {
16812
+ this._element.style.cursor = style;
16813
+ }
16814
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: SceneEventService, deps: [{ token: ConfiguratorSceneService }, { token: ConfiguratorCameraService }, { token: ConfiguratorConnectorService }, { token: IntersectionService }, { token: FloorPlaneService }, { token: ConfiguratorItemService }, { token: ConfiguratorEventService }], target: i0.ɵɵFactoryTarget.Injectable });
16815
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: SceneEventService, providedIn: 'root' });
16816
+ }
16817
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: SceneEventService, decorators: [{
16818
+ type: Injectable,
16819
+ args: [{ providedIn: 'root' }]
16820
+ }], ctorParameters: () => [{ type: ConfiguratorSceneService }, { type: ConfiguratorCameraService }, { type: ConfiguratorConnectorService }, { type: IntersectionService }, { type: FloorPlaneService }, { type: ConfiguratorItemService }, { type: ConfiguratorEventService }] });
16821
+
15286
16822
  class ConfiguratorSceneComponent {
15287
16823
  _settingsService;
15288
16824
  _rotationService;
@@ -15294,6 +16830,8 @@ class ConfiguratorSceneComponent {
15294
16830
  _buildFurnitureService;
15295
16831
  _sceneOptionsService;
15296
16832
  _dimensionsService;
16833
+ _configuratorConnectorService;
16834
+ _sceneEventService;
15297
16835
  _floorService;
15298
16836
  canvasElement;
15299
16837
  elementToolbar;
@@ -15313,11 +16851,12 @@ class ConfiguratorSceneComponent {
15313
16851
  development = false;
15314
16852
  showDownloadDialog = false;
15315
16853
  showCameraSettingsDialog = false;
16854
+ showFullConfiguration = undefined;
15316
16855
  _subs = [];
15317
16856
  _firstBuild = true;
15318
16857
  _selectedElementObject;
15319
16858
  _buildResult;
15320
- constructor(_settingsService, _rotationService, _dynamicCameraService, _sceneService, _eventService, _cameraService, _itemService, _buildFurnitureService, _sceneOptionsService, _dimensionsService, _floorService // do not remove
16859
+ constructor(_settingsService, _rotationService, _dynamicCameraService, _sceneService, _eventService, _cameraService, _itemService, _buildFurnitureService, _sceneOptionsService, _dimensionsService, _configuratorConnectorService, _sceneEventService, _floorService // do not remove
15321
16860
  ) {
15322
16861
  this._settingsService = _settingsService;
15323
16862
  this._rotationService = _rotationService;
@@ -15329,6 +16868,8 @@ class ConfiguratorSceneComponent {
15329
16868
  this._buildFurnitureService = _buildFurnitureService;
15330
16869
  this._sceneOptionsService = _sceneOptionsService;
15331
16870
  this._dimensionsService = _dimensionsService;
16871
+ this._configuratorConnectorService = _configuratorConnectorService;
16872
+ this._sceneEventService = _sceneEventService;
15332
16873
  this._floorService = _floorService;
15333
16874
  this._subs.push(this._eventService.buildFinished.subscribe((result) => {
15334
16875
  if (!result || !result.object) {
@@ -15344,6 +16885,7 @@ class ConfiguratorSceneComponent {
15344
16885
  this._firstBuild = false;
15345
16886
  }
15346
16887
  this._eventService.addedToScene.next(this._buildResult);
16888
+ this._sceneService.handlePropsChanged();
15347
16889
  }), this._eventService.buildStarted.subscribe((started) => {
15348
16890
  if (started) {
15349
16891
  this.setSceneBuildLoader = started;
@@ -15354,7 +16896,11 @@ class ConfiguratorSceneComponent {
15354
16896
  this._loaderProcessUpdate(this.totalSteps);
15355
16897
  }
15356
16898
  }
15357
- }), this._settingsService.settingsLoaded.subscribe((loaded) => {
16899
+ }), this._eventService.articleReceived.subscribe((article) => {
16900
+ if (article) {
16901
+ this.showFullConfiguration = !!article.showFullConfiguration;
16902
+ }
16903
+ }), this._eventService.onObjectSelected.subscribe((intersected) => this._handleIntersectedObjects(intersected)), this._eventService.onObjectUnSelected.subscribe((unselect) => this._handleUnselectObject(unselect)), this._sceneService.onAfterRender.subscribe(() => this._handleRender()), this._settingsService.settingsLoaded.subscribe((loaded) => {
15358
16904
  if (loaded && this._settingsService.settings && this._settingsService.settings.options) {
15359
16905
  if (this._settingsService.settings.options.showDownloadButton) {
15360
16906
  this._createDownloadButton();
@@ -15373,10 +16919,12 @@ class ConfiguratorSceneComponent {
15373
16919
  }
15374
16920
  ngAfterViewInit() {
15375
16921
  this._sceneService.init(this.canvasElement.nativeElement);
16922
+ this._sceneEventService.init(this.canvasElement.nativeElement);
15376
16923
  }
15377
16924
  ngOnDestroy() {
15378
16925
  this._subs.forEach(sub => sub.unsubscribe());
15379
16926
  this.canvasElement = undefined;
16927
+ this.showFullConfiguration = undefined;
15380
16928
  }
15381
16929
  swapElement() {
15382
16930
  if (this._selectedElementObject) {
@@ -15485,6 +17033,19 @@ class ConfiguratorSceneComponent {
15485
17033
  this._buildFurnitureService.currentActiveService.selectSelection(selection, this._buildResult, connector.linkedRepeatables !== 'T', after, connector.connector);
15486
17034
  this._resetSelectedElement();
15487
17035
  }
17036
+ _handleFullConfigAddButtonClick(selection, connector, parent) {
17037
+ let after;
17038
+ if (connector.addAdjust === 2) {
17039
+ after = connector.connector.indexOf('_M_') > -1;
17040
+ }
17041
+ if (selection.repeatOptActive) {
17042
+ this._configuratorConnectorService.repeatOption(selection.optCycle, selection.id, after);
17043
+ }
17044
+ else {
17045
+ // when it's not repeatable, we need to short cut to the correct in the configuration, like the Element menu
17046
+ this._configuratorConnectorService.markSelectionForUserInput(selection.node);
17047
+ }
17048
+ }
15488
17049
  _resetSelectedElement() {
15489
17050
  this._selectedElementObject = undefined;
15490
17051
  this._resetElementPosition();
@@ -15581,7 +17142,90 @@ class ConfiguratorSceneComponent {
15581
17142
  _handleShowMeasurements() {
15582
17143
  this._dimensionsService.enabled = !this._dimensionsService.enabled;
15583
17144
  }
15584
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfiguratorSceneComponent, deps: [{ token: ConfiguratorSettingsService }, { token: ConfiguratorRotationService }, { token: ConfiguratorDynamicCameraService }, { token: ConfiguratorSceneService }, { token: ConfiguratorEventService }, { token: ConfiguratorCameraService }, { token: ConfiguratorItemService }, { token: SwitchBuildFurnitureService }, { token: SceneOptionsService }, { token: DimensionsService }, { token: FloorPlaneService }], target: i0.ɵɵFactoryTarget.Component });
17145
+ _handleUnselectObject(unselected) {
17146
+ if (unselected) {
17147
+ this.editAddButtons = [];
17148
+ this.showElementToolbar = false;
17149
+ this._sceneService.needsRender = true;
17150
+ }
17151
+ }
17152
+ _handleRender() {
17153
+ if (this.showElementToolbar) {
17154
+ this._repositionButtons();
17155
+ }
17156
+ }
17157
+ _handleIntersectedObjects(intersectedObjects) {
17158
+ this._selectedElementObject = intersectedObjects.child;
17159
+ if (this._selectedElementObject) {
17160
+ this._prepareAddButtons(intersectedObjects);
17161
+ this._prepareElementMenu(intersectedObjects);
17162
+ const shouldBeHidden = this._selectedElementObject.userData &&
17163
+ this._selectedElementObject.userData.selection &&
17164
+ this._selectedElementObject.userData.selection.question.indexOf('[hidden]') > -1;
17165
+ if (this._settingsService.settings.options.instantReplace) {
17166
+ if (shouldBeHidden) {
17167
+ // this._cancelElementReplace();
17168
+ }
17169
+ else {
17170
+ this.swapElement();
17171
+ }
17172
+ }
17173
+ this.showElementToolbar = true;
17174
+ this._sceneService.needsRender = true;
17175
+ this._repositionButtons();
17176
+ }
17177
+ }
17178
+ _prepareAddButtons(intersectedObjects) {
17179
+ this.editAddButtons = [];
17180
+ const buttonList = SceneButtonUtils.getAddButtons(intersectedObjects.parent, intersectedObjects.child);
17181
+ for (const customButtonItem of buttonList) {
17182
+ // We should check them here again to make sure we do not have dubs
17183
+ this.editAddButtons.push(new CustomButton('', () => {
17184
+ if (this.showFullConfiguration) {
17185
+ this._handleFullConfigAddButtonClick(customButtonItem.selection, customButtonItem.connector, customButtonItem.child);
17186
+ }
17187
+ else {
17188
+ this._handleAddButtonClick(customButtonItem.selection, customButtonItem.connector, customButtonItem.child);
17189
+ }
17190
+ }, customButtonItem.connectorObject));
17191
+ }
17192
+ }
17193
+ _prepareElementMenu(intersectedObjects) {
17194
+ this.editElementMenu = [];
17195
+ const selection = ObjectUtils.GetSelectionFromSelectedObject(intersectedObjects.child);
17196
+ if (this._settingsService.settings.options.showEditPencilConfigurator && selection) {
17197
+ let options = this._getOptionsFromSelection(selection);
17198
+ options = options.filter(o => {
17199
+ return o.nodeType === 'OPT' && this._configuratorConnectorService.isSelectionPublished(o);
17200
+ });
17201
+ if (this.showFullConfiguration) {
17202
+ // TODO discuss, this means that we remove selections that got removed by exceptions.
17203
+ // When we do not remove them, we see them, we can click on them, but the will be removed from the _getOptionsFromSelection data
17204
+ // Not sure if this is correct, maybe conflict between normale and full config.
17205
+ //options = this._configuratorConnectorService.filterRemoveSelectionsByDeleteExceptions(options);
17206
+ }
17207
+ const len = options.length;
17208
+ for (let i = 0; i < len; i++) {
17209
+ this.editElementMenu.push(new CustomButton(options[i].question, () => {
17210
+ if (this.showFullConfiguration) {
17211
+ // TODO we might need to redo this when we got in trouble again but option[i].node matches with selectorStructure.selNodeId
17212
+ // We shoul be able to mark this in the template.
17213
+ this._configuratorConnectorService.markSelectionForUserInput(selection.node);
17214
+ }
17215
+ else {
17216
+ this._buildFurnitureService.currentActiveService.selectSelection(options[i], this._buildResult);
17217
+ }
17218
+ if (!this._settingsService.settings.options.instantEditMenu) {
17219
+ this._resetSelectedElement();
17220
+ }
17221
+ }));
17222
+ }
17223
+ }
17224
+ }
17225
+ _getOptionsFromSelection(baseSelection) {
17226
+ return this._buildFurnitureService.currentActiveService.getOptionsFromSelection(baseSelection);
17227
+ }
17228
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ConfiguratorSceneComponent, deps: [{ token: ConfiguratorSettingsService }, { token: ConfiguratorRotationService }, { token: ConfiguratorDynamicCameraService }, { token: ConfiguratorSceneService }, { token: ConfiguratorEventService }, { token: ConfiguratorCameraService }, { token: ConfiguratorItemService }, { token: SwitchBuildFurnitureService }, { token: SceneOptionsService }, { token: DimensionsService }, { token: ConfiguratorConnectorService }, { token: SceneEventService }, { token: FloorPlaneService }], target: i0.ɵɵFactoryTarget.Component });
15585
17229
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: ConfiguratorSceneComponent, isStandalone: false, selector: "co-configurator-scene", host: { properties: { "class.co-configurator-scene": "this.showClass" } }, viewQueries: [{ propertyName: "canvasElement", first: true, predicate: ["canvas"], descendants: true, read: ElementRef }, { propertyName: "elementToolbar", first: true, predicate: ElementToolbarComponent, descendants: true }], ngImport: i0, template: `
15586
17230
  @if (showSceneBuildLoader && setSceneBuildLoader) {
15587
17231
  <co-configurator-scene-loader
@@ -15672,7 +17316,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15672
17316
  encapsulation: ViewEncapsulation.None,
15673
17317
  standalone: false
15674
17318
  }]
15675
- }], ctorParameters: () => [{ type: ConfiguratorSettingsService }, { type: ConfiguratorRotationService }, { type: ConfiguratorDynamicCameraService }, { type: ConfiguratorSceneService }, { type: ConfiguratorEventService }, { type: ConfiguratorCameraService }, { type: ConfiguratorItemService }, { type: SwitchBuildFurnitureService }, { type: SceneOptionsService }, { type: DimensionsService }, { type: FloorPlaneService }], propDecorators: { canvasElement: [{
17319
+ }], ctorParameters: () => [{ type: ConfiguratorSettingsService }, { type: ConfiguratorRotationService }, { type: ConfiguratorDynamicCameraService }, { type: ConfiguratorSceneService }, { type: ConfiguratorEventService }, { type: ConfiguratorCameraService }, { type: ConfiguratorItemService }, { type: SwitchBuildFurnitureService }, { type: SceneOptionsService }, { type: DimensionsService }, { type: ConfiguratorConnectorService }, { type: SceneEventService }, { type: FloorPlaneService }], propDecorators: { canvasElement: [{
15676
17320
  type: ViewChild,
15677
17321
  args: ['canvas', { read: ElementRef }]
15678
17322
  }], elementToolbar: [{
@@ -15720,5 +17364,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
15720
17364
  * Generated bundle index. Do not edit.
15721
17365
  */
15722
17366
 
15723
- export { AnswerCardComponent, AnswerCardModule, AnswersInfoDialogComponent, AnswersInfoDialogModule, AnswersSlideoutComponent, AnswersSlideoutModule, ArFeature, ArPositionIndicator, CoSummaryLine, CoSummaryLineModule, ColorFilterComponent, ColorFilterModule, ConfigurationPresetComponent, ConfigurationPresetModule, ConfigurationResultObject, ConfiguratorArService, ConfiguratorCameraService, ConfiguratorCameraSettingsComponent, ConfiguratorComponent, ConfiguratorConnectorService, ConfiguratorDialogModule, ConfiguratorErrorDialogComponent, ConfiguratorErrorMessage, ConfiguratorEventService, ConfiguratorExportDialogComponent, ConfiguratorLoaderComponent, ConfiguratorLoaderModule, ConfiguratorModule, ConfiguratorSceneComponent, ConfiguratorSceneLoaderComponent, ConfiguratorSceneLoaderModule, ConfiguratorSceneModule, ConfiguratorSceneService, ConfiguratorVrService, ConfiguratorXrService, ConfiguringService, Controls, ElementButtonsComponent, ElementButtonsModule, ElementToolbarComponent, ElementToolbarModule, ImageZoomComponent, ImageZoomModule, LiteSelectorComponent, LiteSelectorModule, ProductConfiguratorComponent, ProductConfiguratorModule, ProductConfiguratorOptionCheckboxComponent, ProductConfiguratorSelectorComponent, ProductConfiguratorSelectorModule, ProductConfiguratorSelectorOptionButtonComponent, ProductConfiguratorSelectorOptionButtonModule, ProductConfiguratorSelectorOptionCheckboxModule, ProductConfiguratorSelectorOptionComponent, ProductConfiguratorSelectorOptionDropDownComponent, ProductConfiguratorSelectorOptionDropdownModule, ProductConfiguratorSelectorOptionModule, ProductConfiguratorSelectorOptionTileComponent, ProductConfiguratorSelectorOptionTileModule, ProgressBarComponent, ProgressBarModule, Reticle, SceneOptionsComponent, SelectionsModule, SelectionsSummaryComponent, SelectionsSummaryLineComponent, SelectionsSummaryModule, TagFilterComponent, TagFilterModule, XrMode };
17367
+ export { AnswerCardComponent, AnswerCardModule, AnswersInfoDialogComponent, AnswersInfoDialogModule, AnswersSlideoutComponent, AnswersSlideoutModule, ArFeature, ArPositionIndicator, CoSummaryLine, CoSummaryLineModule, ColorFilterComponent, ColorFilterModule, ConfigurationPresetComponent, ConfigurationPresetModule, ConfigurationResultObject, ConfiguratorArService, ConfiguratorCameraService, ConfiguratorCameraSettingsComponent, ConfiguratorComponent, ConfiguratorConnectorService, ConfiguratorDialogModule, ConfiguratorErrorDialogComponent, ConfiguratorErrorMessage, ConfiguratorEventService, ConfiguratorExportDialogComponent, ConfiguratorLoaderComponent, ConfiguratorLoaderModule, ConfiguratorModule, ConfiguratorSceneComponent, ConfiguratorSceneLoaderComponent, ConfiguratorSceneLoaderModule, ConfiguratorSceneModule, ConfiguratorSceneService, ConfiguratorVrService, ConfiguratorXrService, ConfiguringService, Controls, ElementButtonsComponent, ElementButtonsModule, ElementToolbarComponent, ElementToolbarModule, ImageZoomComponent, ImageZoomModule, LiteSelectorComponent, LiteSelectorModule, ProductConfiguratorChildArticleConfiguratorComponent, ProductConfiguratorComponent, ProductConfiguratorGroupedRepeatableOptionsComponent, ProductConfiguratorModule, ProductConfiguratorOptionCheckboxComponent, ProductConfiguratorSelectorChildArticleComponent, ProductConfiguratorSelectorComponent, ProductConfiguratorSelectorModule, ProductConfiguratorSelectorOptionButtonComponent, ProductConfiguratorSelectorOptionButtonModule, ProductConfiguratorSelectorOptionCheckboxModule, ProductConfiguratorSelectorOptionComponent, ProductConfiguratorSelectorOptionDropDownComponent, ProductConfiguratorSelectorOptionDropdownModule, ProductConfiguratorSelectorOptionModule, ProductConfiguratorSelectorOptionTileComponent, ProductConfiguratorSelectorOptionTileModule, ProductConfiguratorSlideoutComponent, ProgressBarComponent, ProgressBarModule, Reticle, SceneOptionsComponent, SelectionsModule, SelectionsSummaryComponent, SelectionsSummaryLineComponent, SelectionsSummaryModule, TagFilterComponent, TagFilterModule, XrMode };
15724
17368
  //# sourceMappingURL=colijnit-configurator.mjs.map