@tet/tet-components 1.3.146-testing → 1.3.147-testing

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 (155) hide show
  1. package/dist/cjs/index-f559cb2e.js +24 -36
  2. package/dist/cjs/loader.cjs.js +1 -1
  3. package/dist/cjs/{tet-notification.cjs.entry.js → tet-accordion_2.cjs.entry.js} +131 -0
  4. package/dist/cjs/tet-address-offers-filters-products_2.cjs.entry.js +1 -1
  5. package/dist/cjs/{tet-autocomplete_2.cjs.entry.js → tet-autocomplete.cjs.entry.js} +0 -65
  6. package/dist/cjs/tet-b2b-check-out-form_5.cjs.entry.js +647 -0
  7. package/dist/cjs/tet-b2b-configurator.cjs.entry.js +536 -0
  8. package/dist/cjs/tet-b2b-service-calculator.cjs.entry.js +1 -1
  9. package/dist/cjs/tet-border-radius.cjs.entry.js +1 -1
  10. package/dist/cjs/tet-business-lines.cjs.entry.js +1 -1
  11. package/dist/cjs/tet-colors.cjs.entry.js +4 -4
  12. package/dist/cjs/tet-compare-card-v2.cjs.entry.js +1 -1
  13. package/dist/cjs/tet-components.cjs.js +1 -1
  14. package/dist/cjs/tet-font-weight.cjs.entry.js +1 -1
  15. package/dist/cjs/tet-fonts.cjs.entry.js +1 -1
  16. package/dist/cjs/tet-grid.cjs.entry.js +1 -1
  17. package/dist/cjs/tet-layout.cjs.entry.js +1 -1
  18. package/dist/cjs/tet-link.cjs.entry.js +1 -1
  19. package/dist/cjs/tet-spacing.cjs.entry.js +1 -1
  20. package/dist/cjs/tet-spinner.cjs.entry.js +71 -0
  21. package/dist/cjs/tet-text-list.cjs.entry.js +1 -1
  22. package/dist/collection/collection-manifest.json +1 -0
  23. package/dist/collection/components/advanced/cards/tet-b2b-compare-card/test/tet-b2b-compare-card.spec.js +0 -1
  24. package/dist/collection/components/advanced/cards/tet-b2b-compare-card/tet-b2b-compare-card.js +8 -8
  25. package/dist/collection/components/advanced/cards/tet-business-summary-card/tet-business-summary-card.css +7 -0
  26. package/dist/collection/components/advanced/cards/tet-business-summary-card/tet-business-summary-card.js +31 -7
  27. package/dist/collection/components/advanced/cards/tet-compare-card/tet-compare-card.css +1 -0
  28. package/dist/collection/components/advanced/cards/tet-compare-card-v2/tet-compare-card-v2.css +1 -0
  29. package/dist/collection/components/advanced/forms/tet-b2b-check-out-form/tet-b2b-check-out-form.css +0 -2
  30. package/dist/collection/components/advanced/forms/tet-b2b-check-out-form/tet-b2b-check-out-form.js +24 -4
  31. package/dist/collection/components/simple/lists/tet-text-list/tet-text-list.css +1 -0
  32. package/dist/collection/components/simple/menu/tet-business-navigation/tet-business-navigation.css +15 -5
  33. package/dist/collection/components/simple/structural/tet-accordion/tet-accordion.css +4 -2
  34. package/dist/collection/components/simple/structural/tet-accordion/tet-accordion.js +27 -5
  35. package/dist/collection/components/views/tet-b2b-configurator/b2b-configurator.store.js +47 -0
  36. package/dist/collection/components/views/tet-b2b-configurator/partials/tet-b2b-configurator-cart/test/tet-b2b-configurator-cart.spec.js +10 -1
  37. package/dist/collection/components/views/tet-b2b-configurator/partials/tet-b2b-configurator-cart/tet-b2b-configurator-cart.css +54 -9
  38. package/dist/collection/components/views/tet-b2b-configurator/partials/tet-b2b-configurator-cart/tet-b2b-configurator-cart.js +106 -8
  39. package/dist/collection/components/views/tet-b2b-configurator/tet-b2b-configurator.css +472 -0
  40. package/dist/collection/components/views/tet-b2b-configurator/tet-b2b-configurator.js +612 -0
  41. package/dist/collection/components/views/tet-b2b-service-calculator/tet-b2b-service-calculator.js +1 -1
  42. package/dist/collection/components/views/tet-business-lines/tet-business-lines.js +1 -1
  43. package/dist/collection/docs/styling/border-radius/tet-border-radius.js +1 -1
  44. package/dist/collection/docs/styling/colors/tet-colors.js +4 -4
  45. package/dist/collection/docs/styling/font-weight/tet-font-weight.js +1 -1
  46. package/dist/collection/docs/styling/fonts/tet-fonts.js +1 -1
  47. package/dist/collection/docs/styling/layout/tet-layout.js +1 -1
  48. package/dist/collection/docs/styling/link/tet-link.js +1 -1
  49. package/dist/collection/docs/styling/spacing/tet-spacing.js +1 -1
  50. package/dist/collection/docs/styling/tet-grid/tet-grid.js +1 -1
  51. package/dist/collection/services/utils/minimum-duration-time.js +14 -0
  52. package/dist/components/index.js +2 -0
  53. package/dist/components/{p-08cb8e8b.js → p-401be6d8.js} +8 -6
  54. package/dist/components/{p-b3266df2.js → p-42c3311c.js} +1 -1
  55. package/dist/components/{p-c15aec6f.js → p-4a4c9b2c.js} +1 -1
  56. package/dist/{esm/tet-business-navigation.entry.js → components/p-5541195e.js} +35 -8
  57. package/dist/components/{p-e735af9c.js → p-8dd212bd.js} +1 -1
  58. package/dist/{esm/tet-b2b-compare-card.entry.js → components/p-922171da.js} +68 -20
  59. package/dist/{esm/tet-b2b-check-out-form.entry.js → components/p-b74f5470.js} +69 -16
  60. package/dist/components/p-cbf2c238.js +227 -0
  61. package/dist/components/{p-18778346.js → p-e72ea31d.js} +1 -1
  62. package/dist/{esm/tet-business-summary-card.entry.js → components/p-f68a8deb.js} +66 -14
  63. package/dist/components/tet-accordion.js +1 -1
  64. package/dist/components/tet-address-offers-view.js +2 -2
  65. package/dist/components/tet-address-offers.js +1 -1
  66. package/dist/components/tet-b2b-check-out-form.js +1 -207
  67. package/dist/components/tet-b2b-compare-card.js +1 -206
  68. package/dist/components/tet-b2b-configurator-cart.js +1 -167
  69. package/dist/components/tet-b2b-configurator.d.ts +11 -0
  70. package/dist/components/tet-b2b-configurator.js +661 -0
  71. package/dist/components/tet-b2b-service-calculator.js +1 -1
  72. package/dist/components/tet-border-radius.js +1 -1
  73. package/dist/components/tet-business-compare-card.js +1 -1
  74. package/dist/components/tet-business-lines.js +1 -1
  75. package/dist/components/tet-business-navigation.js +1 -103
  76. package/dist/components/tet-business-summary-card.js +1 -116
  77. package/dist/components/tet-colors.js +4 -4
  78. package/dist/components/tet-compare-card-v2.js +1 -1
  79. package/dist/components/tet-compare-card.js +1 -1
  80. package/dist/components/tet-compare-cards-tab.js +2 -2
  81. package/dist/components/tet-compare-cards.js +1 -1
  82. package/dist/components/tet-font-weight.js +1 -1
  83. package/dist/components/tet-fonts.js +1 -1
  84. package/dist/components/tet-grid.js +1 -1
  85. package/dist/components/tet-layout.js +1 -1
  86. package/dist/components/tet-link.js +1 -1
  87. package/dist/components/tet-spacing.js +1 -1
  88. package/dist/components/tet-text-list.js +1 -1
  89. package/dist/esm/index-7f1e2a22.js +24 -36
  90. package/dist/esm/loader.js +1 -1
  91. package/dist/esm/{tet-notification.entry.js → tet-accordion_2.entry.js} +132 -2
  92. package/dist/esm/tet-address-offers-filters-products_2.entry.js +1 -1
  93. package/dist/esm/{tet-autocomplete_2.entry.js → tet-autocomplete.entry.js} +1 -65
  94. package/dist/esm/tet-b2b-check-out-form_5.entry.js +639 -0
  95. package/dist/esm/tet-b2b-configurator.entry.js +532 -0
  96. package/dist/esm/tet-b2b-service-calculator.entry.js +1 -1
  97. package/dist/esm/tet-border-radius.entry.js +1 -1
  98. package/dist/esm/tet-business-lines.entry.js +1 -1
  99. package/dist/esm/tet-colors.entry.js +4 -4
  100. package/dist/esm/tet-compare-card-v2.entry.js +1 -1
  101. package/dist/esm/tet-components.js +1 -1
  102. package/dist/esm/tet-font-weight.entry.js +1 -1
  103. package/dist/esm/tet-fonts.entry.js +1 -1
  104. package/dist/esm/tet-grid.entry.js +1 -1
  105. package/dist/esm/tet-layout.entry.js +1 -1
  106. package/dist/esm/tet-link.entry.js +1 -1
  107. package/dist/esm/tet-spacing.entry.js +1 -1
  108. package/dist/esm/tet-spinner.entry.js +67 -0
  109. package/dist/esm/tet-text-list.entry.js +1 -1
  110. package/dist/tet-components/{p-0121cef5.entry.js → p-067c2f1b.entry.js} +1 -1
  111. package/dist/tet-components/{p-bb6387c6.entry.js → p-0738afc0.entry.js} +1 -1
  112. package/dist/tet-components/{p-f476f61c.entry.js → p-07aee8d0.entry.js} +1 -1
  113. package/dist/tet-components/p-0d818b7e.entry.js +1 -0
  114. package/dist/tet-components/{p-56460d2d.entry.js → p-4c9e742f.entry.js} +1 -1
  115. package/dist/tet-components/{p-9c274191.entry.js → p-4e0a24ba.entry.js} +1 -1
  116. package/dist/tet-components/p-4ea127f4.entry.js +1 -0
  117. package/dist/tet-components/{p-9bfcf2cc.entry.js → p-62eb4fe0.entry.js} +1 -1
  118. package/dist/tet-components/{p-38c3b247.entry.js → p-662d9457.entry.js} +1 -1
  119. package/dist/tet-components/{p-1ddb9e3c.entry.js → p-677b8bf7.entry.js} +1 -1
  120. package/dist/tet-components/{p-7f00f463.entry.js → p-6a4a979c.entry.js} +1 -1
  121. package/dist/tet-components/p-6d2c4b16.entry.js +1 -0
  122. package/dist/tet-components/{p-6782340f.entry.js → p-9513c8f6.entry.js} +1 -1
  123. package/dist/tet-components/p-af917a8f.entry.js +1 -0
  124. package/dist/tet-components/{p-597e234a.entry.js → p-dcb66405.entry.js} +1 -1
  125. package/dist/tet-components/{p-4838a00a.entry.js → p-e311eb7d.entry.js} +1 -1
  126. package/dist/tet-components/p-ed67bd52.entry.js +1 -0
  127. package/dist/tet-components/{p-bd8a0449.entry.js → p-eed6163a.entry.js} +1 -1
  128. package/dist/tet-components/tet-components.css +1 -1
  129. package/dist/tet-components/tet-components.esm.js +1 -1
  130. package/dist/types/components/advanced/cards/tet-business-summary-card/tet-business-summary-card.d.ts +4 -2
  131. package/dist/types/components/advanced/forms/tet-b2b-check-out-form/tet-b2b-check-out-form.d.ts +2 -1
  132. package/dist/types/components/simple/structural/tet-accordion/tet-accordion.d.ts +5 -0
  133. package/dist/types/components/views/tet-b2b-configurator/b2b-configurator.store.d.ts +22 -0
  134. package/dist/types/components.d.ts +100 -4
  135. package/dist/types/services/api/interfaces/property.interface.d.ts +2 -2
  136. package/dist/types/services/api/services/b2b-configurator/b2b-configurator.d.ts +4 -4
  137. package/dist/types/services/utils/minimum-duration-time.d.ts +9 -0
  138. package/package.json +1 -1
  139. package/dist/cjs/tet-accordion.cjs.entry.js +0 -136
  140. package/dist/cjs/tet-b2b-check-out-form.cjs.entry.js +0 -164
  141. package/dist/cjs/tet-b2b-compare-card.cjs.entry.js +0 -164
  142. package/dist/cjs/tet-b2b-configurator-cart.cjs.entry.js +0 -129
  143. package/dist/cjs/tet-business-navigation.cjs.entry.js +0 -82
  144. package/dist/cjs/tet-business-summary-card.cjs.entry.js +0 -77
  145. package/dist/esm/tet-accordion.entry.js +0 -132
  146. package/dist/esm/tet-b2b-configurator-cart.entry.js +0 -125
  147. package/dist/tet-components/p-05fc6443.entry.js +0 -1
  148. package/dist/tet-components/p-319c29e9.entry.js +0 -1
  149. package/dist/tet-components/p-47618056.entry.js +0 -1
  150. package/dist/tet-components/p-4eb386f5.entry.js +0 -1
  151. package/dist/tet-components/p-62419a1f.entry.js +0 -1
  152. package/dist/tet-components/p-a9499bbb.entry.js +0 -1
  153. package/dist/tet-components/p-d0d39e88.entry.js +0 -1
  154. package/dist/tet-components/p-ff5dba0e.entry.js +0 -1
  155. package/dist/types/components/views/tet-b2b-configurator/partials/tet-b2b-configurator-cart/tet-b2b-configurator-cart.d.ts +0 -67
@@ -0,0 +1,536 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const index$1 = require('./index-f559cb2e.js');
6
+ const httpCodes = require('./http-codes-2f72a8b2.js');
7
+ const index = require('./index-84ede372.js');
8
+ const translations = require('./translations-ed68775f.js');
9
+ require('./typecheck-d48810dc.js');
10
+
11
+ const b2bConfigurator = () => {
12
+ let apiUrl;
13
+ try {
14
+ apiUrl = new URL(httpCodes.endpoints.b2bConfigurator).href;
15
+ }
16
+ catch (error) {
17
+ console.error(error);
18
+ return Promise.reject('B2B configurator endpoint URL generation failed.');
19
+ }
20
+ const request = new httpCodes.ApiRequest()
21
+ .setUrl(apiUrl)
22
+ .setErrorFallbackValue([]);
23
+ return request.execute();
24
+ };
25
+
26
+ /**
27
+ * Ensures an asynchronous operation (Promise or async function) takes at least
28
+ * a specified minimum duration to resolve.
29
+ * @param callback The Promise to await, or an asynchronous function that returns a Promise.
30
+ * @param minDurationMs The minimum time, in milliseconds, the resulting Promise should take to resolve.
31
+ * @returns A Promise that resolves with the result of the callback, but only after
32
+ * both the callback and the minDurationMs delay have completed.
33
+ */
34
+ const ensureMinDuration = async (callback, minDurationMs) => {
35
+ const responsePromise = typeof callback === 'function' ? callback() : callback;
36
+ const delayPromise = new Promise((resolve) => setTimeout(resolve, minDurationMs));
37
+ const [result] = await Promise.all([responsePromise, delayPromise]);
38
+ return result;
39
+ };
40
+
41
+ const { state, set, get } = index.createStore({
42
+ data: [],
43
+ cart: new Map(),
44
+ productDetails: new Map()
45
+ });
46
+ const initData = (data) => {
47
+ set('data', data);
48
+ const productDetails = new Map();
49
+ for (const category of data) {
50
+ for (const product of category.products) {
51
+ const { type: categoryType, name: categoryName, id: categoryId } = category;
52
+ const { name: { lv: name }, description: { lv: description }, amount, b2bConfiguratorProduct } = product;
53
+ productDetails.set(product.productCode, {
54
+ name,
55
+ description,
56
+ amount,
57
+ discountAmount: b2bConfiguratorProduct.discountAmount,
58
+ categoryType,
59
+ categoryName,
60
+ categoryId,
61
+ b2bConfiguratorProduct
62
+ });
63
+ }
64
+ }
65
+ set('productDetails', productDetails);
66
+ };
67
+ const addToCart = (product, count) => {
68
+ if (count < 0) {
69
+ return;
70
+ }
71
+ const newCart = new Map(state.cart);
72
+ newCart.set(product, count);
73
+ set('cart', newCart);
74
+ };
75
+ const removeFromCart = (product) => {
76
+ const newCart = new Map(state.cart);
77
+ newCart.delete(product);
78
+ set('cart', newCart);
79
+ };
80
+ const resetCart = () => {
81
+ set('cart', new Map());
82
+ };
83
+ const getCart = () => {
84
+ return Object.fromEntries(get('cart'));
85
+ };
86
+
87
+ const tetB2bConfiguratorCss = "@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:400;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Medium.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Medium.woff\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:500;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Medium.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Medium.woff\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:600;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Semibold.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Semibold.woff\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:700;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Bold.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Bold.woff\") format(\"woff\")}@font-face{font-family:\"Inter\";font-style:normal;font-weight:400;font-display:swap;src:url(\"assets/fonts/Inter-Regular.woff2?v=3.19\") format(\"woff2\"), url(\"assets/fonts/Inter-Regular.woff?v=3.19\") format(\"woff\")}@font-face{font-family:\"Inter\";font-style:normal;font-weight:500;font-display:swap;src:url(\"assets/fonts/Inter-Medium.woff2?v=3.19\") format(\"woff2\"), url(\"assets/fonts/Inter-Medium.woff?v=3.19\") format(\"woff\")}@font-face{font-family:\"Inter\";font-style:normal;font-weight:600;font-display:swap;src:url(\"assets/fonts/Inter-SemiBold.woff2?v=3.19\") format(\"woff2\"), url(\"assets/fonts/Inter-SemiBold.woff?v=3.19\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:400;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Medium.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Medium.woff\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:500;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Medium.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Medium.woff\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:600;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Semibold.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Semibold.woff\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:700;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Bold.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Bold.woff\") format(\"woff\")}@font-face{font-family:\"Inter\";font-style:normal;font-weight:400;font-display:swap;src:url(\"assets/fonts/Inter-Regular.woff2?v=3.19\") format(\"woff2\"), url(\"assets/fonts/Inter-Regular.woff?v=3.19\") format(\"woff\")}@font-face{font-family:\"Inter\";font-style:normal;font-weight:500;font-display:swap;src:url(\"assets/fonts/Inter-Medium.woff2?v=3.19\") format(\"woff2\"), url(\"assets/fonts/Inter-Medium.woff?v=3.19\") format(\"woff\")}@font-face{font-family:\"Inter\";font-style:normal;font-weight:600;font-display:swap;src:url(\"assets/fonts/Inter-SemiBold.woff2?v=3.19\") format(\"woff2\"), url(\"assets/fonts/Inter-SemiBold.woff?v=3.19\") format(\"woff\")}:host{--font-family-fallback:Gilroy, Arial, sans-serif;--font-family-headline:Gilroy;--font-family-content:Inter, var(--font-family-fallback);font-family:var(--font-family-content)}:root{--tet-link-color:var(--tc-text-primary);--tet-link-color-hover:var(--tc-text-secondary);--tet-link-color-active:var(--tc-text-tertiary);--tet-link-color-focus:var(--tc-blue-40);--tet-link-color-disabled:var(--tc-button-text-inverse-disabled);--tet-link-secondary-color:var(--tc-text-secondary);--tet-link-secondary-color-hover:var(--tc-text-primary)}.tet-link,.tet-link__arrow{text-decoration:underline;color:var(--tet-link-color);position:relative;line-height:1.5rem;cursor:pointer}.tet-link.dark,.tet-link__arrow.dark{--tet-link-color:var(--tc-text-primary-dark);--tet-link-color-hover:var(--tc-text-secondary-dark);--tet-link-color-active:var(--tc-text-tertiary-dark);--tet-link-color-focus:var(--tc-blue-40-dark);--tet-link-color-disabled:var(--tc-button-text-inverse-disabled-dark);--tet-link-secondary-color:var(--tc-text-secondary-dark);--tet-link-secondary-color-hover:var(--tc-text-primary-dark)}.tet-link.tet-link--secondary,.tet-link__arrow.tet-link--secondary{--tet-link-color:var(--tet-link-secondary-color);--tet-link-color-hover:var(--tet-link-secondary-color-hover)}.tet-link tet-icon,.tet-link__arrow tet-icon{--icon-color:var(--tet-link-color)}.tet-link:hover,.tet-link__arrow:hover{color:var(--tet-link-color-hover)}.tet-link:hover tet-icon,.tet-link__arrow:hover tet-icon{--icon-color:var(--tet-link-color-hover)}.tet-link:active,.tet-link__arrow:active{color:var(--tet-link-color-active)}.tet-link:active tet-icon,.tet-link__arrow:active tet-icon{--icon-color:var(--tet-link-color-active)}.tet-link:focus-visible,.tet-link__arrow:focus-visible{outline:0.125rem solid var(--tc-blue-40);outline-offset:0.125rem;transition:outline 0s;outline-color:var(--tet-link-color-focus);border-radius:0.125rem}.tet-link.disabled,.tet-link__arrow.disabled{color:var(--tet-link-color-disabled);pointer-events:none;cursor:auto}.tet-link.disabled tet-icon,.tet-link__arrow.disabled tet-icon{--icon-color:var(--tet-link-color-disabled)}.tet-link.disabled:focus-visible,.tet-link__arrow.disabled:focus-visible{outline:none}.tet-link tet-icon,.tet-link__arrow tet-icon{padding-left:0.25rem;padding-right:0.25rem;--icon-container-display:inline-block}.tet-link__arrow{padding-right:1.5rem}.tet-link__arrow::after{content:\"-->\";position:absolute;white-space:nowrap;display:inline-block;text-decoration:none;padding-left:0.25rem;letter-spacing:initial;transition:all 0.15s ease-in}.tet-link__arrow:hover::after{padding-left:0.375rem}:host{display:block;--b2b-cart-offset-top:0px}.light{--b2b-text-color:var(--tc-text-primary);--b2b-text-color-secondary:var(--tc-text-secondary);--b2b-background-color:var(--tc-layer-primary);--b2b-icon-background-color:var(--tc-layer-secondary);--b2b-icon-pressed-background-color:var(--tc-layer-quaternary);--b2b-box-shadow:var(--tc-elevation-one);--b2b-border-color:var(--tc-border-quaternary);--b2b-summary-block-color:var(--tc-layer-secondary);--b2b-summary-accent-color:var(--tc-yellow-20);--b2b-confirmation-dialog-icon-color:var(--tc-yellow-40);--b2b-success-dialog-icon-color:var(--tc-green-40)}.dark{--b2b-text-color:var(--tc-text-primary-dark);--b2b-text-color-secondary:var(--tc-text-secondary-dark);--b2b-background-color:var(--tc-layer-primary-dark);--b2b-icon-background-color:var(--tc-layer-secondary-dark);--b2b-icon-pressed-background-color:var(--tc-layer-quaternary-dark);--b2b-box-shadow:var(--tc-elevation-one-dark);--b2b-border-color:var(--tc-border-quaternary-dark);--b2b-summary-block-color:var(--tc-layer-secondary-dark);--b2b-summary-accent-color:var(--tc-grey-20-dark);--b2b-confirmation-dialog-icon-color:var(--tc-yellow-40-dark);--b2b-success-dialog-icon-color:var(--tc-green-40-dark)}button.button-reset{background:none;border:none;padding:0;font:inherit;color:inherit;text-align:inherit}.placeholder{--placeholder-animation-speed:5s}.configurator{display:flex;gap:1rem;flex-direction:column;color:var(--b2b-text-color)}@media screen and (min-width: 64rem){.configurator{gap:1.5rem;flex-direction:row;align-items:flex-start}}.offer{border-radius:1rem;height:fit-content;flex:0 0 calc(70% - 0.75rem);background-color:var(--b2b-background-color);box-shadow:var(--b2b-box-shadow)}.offer__block{--accordion-header-padding:1rem;--accordion-header-mobile-padding:1rem;--accordion-header-font:600 1.25rem/1.5rem Gilroy, Gilroy, Arial, sans-serif;--accordion-header-mobile-font:600 1.25rem/1.5rem Gilroy, Gilroy, Arial, sans-serif}.offer__block:first-child{--accordion-border-radius:1rem 1rem 0 0;--accordion-outer-border:var(--b2b-border-color)}.offer__block:last-child{--accordion-border-radius:0 0 1rem 1rem;--accordion-border-bottom-width:0}@media screen and (min-width: 64rem){.offer__block{--accordion-header-padding:1.5rem;--accordion-header-font:600 1.75rem/2rem Gilroy, Gilroy, Arial, sans-serif}}.offer__content{overflow:hidden;padding:1.5rem 1rem;display:flex;flex-direction:column;gap:0.75rem;border-color:var(--b2b-border-color);border-top-style:solid;border-top-width:0.0625rem}@media screen and (min-width: 48rem){.offer__content{padding:1.5rem}}@media screen and (min-width: 64rem){.offer__content{flex-direction:row;gap:1.5rem;padding-bottom:2.5rem}}.offer__navigation{margin:0 -1.5rem;flex:0 0 30%}@media screen and (min-width: 64rem){.offer__navigation{max-width:20.5rem;margin:0}}.offer__cards{flex:1 1 0%}.offer__cards-header{padding:0.5rem 0 0.75rem 0;display:flex;gap:0.5rem;justify-content:space-between;align-items:center}@media screen and (min-width: 64rem){.offer__cards-header{padding:1rem 0}}.offer__cards-list{display:flex;flex-direction:column;gap:1rem}.offer__cards-title{flex:auto;font:600 1rem/1.5rem \"Inter\", \"Gilroy, Arial, sans-serif\"}@media screen and (min-width: 64rem){.offer__cards-title{font:600 1.25rem/1.5rem \"Gilroy\", \"Gilroy, Arial, sans-serif\"}}.compare__button{border-radius:50%;overflow:hidden}@media screen and (min-width: 64rem){.compare__button{border-radius:0.125rem}}.compare__button:focus-visible{outline:0.125rem solid var(--tc-blue-40);outline-offset:0.125rem;transition:outline 0s}.compare__button.dark:focus-visible{outline:0.125rem solid var(--tc-blue-40);outline:0.125rem solid var(--tc-blue-40-dark);outline-offset:0.125rem;transition:outline 0s}.compare__button:active{--b2b-icon-background-color:var(--b2b-icon-pressed-background-color)}.compare__text{font:400 1rem/1.5rem \"Inter\", \"Gilroy, Arial, sans-serif\";display:none}@media screen and (min-width: 64rem){.compare__text{display:initial}}.compare__icon-wrapper{width:2.75rem;height:2.75rem;display:flex;justify-content:center;align-items:center;background-color:var(--b2b-icon-background-color);cursor:pointer}@media screen and (min-width: 64rem){.compare__icon-wrapper{display:none}}.compare__icon{--icon-size:1.5rem}.cart{flex:0 0 calc(30% - 0.75rem);position:sticky}.cart--edit{bottom:-1px;top:calc(var(--b2b-cart-sticky-top) + var(--b2b-cart-offset-top))}.cart--empty{display:none}@media screen and (min-width: 64rem){.cart--empty{display:flex}}.cart__card-list{padding:0 1rem 1rem;display:flex;flex-direction:column;gap:0.5rem}.cart__cta{display:block;align-self:center}@media screen and (min-width: 48rem){.cart__cta{align-self:flex-end}}.action-dialog{display:flex;flex-direction:column;gap:0.5rem;align-items:center;margin-bottom:1.5rem}.action-dialog--loading{--dialog-footer-border-color:transparent}.action-dialog__title{text-align:center;font:600 1.5rem/1.75rem \"Gilroy\", \"Gilroy, Arial, sans-serif\"}.action-dialog__description{font:400 1rem/1.5rem \"Inter\", \"Gilroy, Arial, sans-serif\"}.action-dialog__icon{--icon-size:3rem}.action-dialog__attention-icon{--icon-color:var(--b2b-confirmation-dialog-icon-color)}.action-dialog__success-icon{--icon-color:var(--b2b-success-dialog-icon-color)}.action-dialog__footer{display:flex;justify-content:space-between;flex:auto}.action-dialog__button-text{white-space:nowrap}";
88
+ const TetB2bConfiguratorStyle0 = tetB2bConfiguratorCss;
89
+
90
+ /** Constant with value X, that will be used to show skeleton fox >=X ms amount of time. */
91
+ const MIN_LOAD_TIME = 500;
92
+ /** Constant to use in desktop resolution checker. Should be same as one used in SCSS media query */
93
+ const DESKTOP_BREAKPOINT = 1024;
94
+ const TetB2bConfigurator = class {
95
+ constructor(hostRef) {
96
+ index$1.registerInstance(this, hostRef);
97
+ this.compareLinkClick = index$1.createEvent(this, "compareLinkClick", 7);
98
+ this.b2bConfiguratorSubmit = index$1.createEvent(this, "b2bConfiguratorSubmit", 7);
99
+ this.successCloseClick = index$1.createEvent(this, "successCloseClick", 7);
100
+ /** @private The suffix for the price displayed - "€/mēn."). */
101
+ this.priceSuffix = '€/mēn.';
102
+ /** Syncs desktop resolution with state variable */
103
+ this.checkDesktopResolution = () => {
104
+ this.isDesktopResolution = window.innerWidth >= DESKTOP_BREAKPOINT;
105
+ };
106
+ /** Fetches the data and passes it to Stencil store */
107
+ this.fetchData = async () => {
108
+ const data = await b2bConfigurator();
109
+ initData(data);
110
+ };
111
+ /** Renders the placeholdes/skeleton */
112
+ this.renderPlaceholder = () => {
113
+ const darkTheme = this.theme === 'dark';
114
+ return [
115
+ index$1.h("div", { class: "offer placeholder" }, index$1.h("div", { style: { padding: this.isDesktopResolution ? '1.5rem' : '1rem' } }, index$1.h("tet-placeholder", { class: "placeholder", height: this.isDesktopResolution ? '2rem' : '1.5rem', darkTheme: darkTheme })), index$1.h("div", { class: "offer__content" }, index$1.h("tet-placeholder", { class: "placeholder offer__navigation", height: this.isDesktopResolution ? '48rem' : ' 2.25rem', darkTheme: darkTheme, style: { margin: '0' } }), index$1.h("div", { class: "offer__cards" }, index$1.h("div", { class: "offer__cards-list" }, index$1.h("tet-placeholder", { class: "placeholder", height: "3rem", darkTheme: darkTheme }), index$1.h("tet-placeholder", { class: "placeholder", height: "10.25rem", darkTheme: darkTheme }), index$1.h("tet-placeholder", { class: "placeholder", height: "10.25rem", darkTheme: darkTheme }), index$1.h("tet-placeholder", { class: "placeholder", height: "10.25rem", darkTheme: darkTheme }), index$1.h("tet-placeholder", { class: "placeholder", height: "10.25rem", darkTheme: darkTheme }))))),
116
+ index$1.h("div", { class: "cart cart--empty", style: {
117
+ 'padding': '1.5rem 1rem 1rem',
118
+ 'background-color': `var(--b2b-background-color)`
119
+ } }, index$1.h("tet-placeholder", { class: "placeholder", height: "12.75rem", darkTheme: darkTheme }))
120
+ ];
121
+ };
122
+ /**
123
+ * Handles event form navigation and sets currently active categories
124
+ * @param e
125
+ * @returns
126
+ */
127
+ this.categoryClickHandler = (e) => {
128
+ const { id } = e.detail;
129
+ const category = this.getCategoryById(id);
130
+ if (!category) {
131
+ return;
132
+ }
133
+ if (category.type === 'primary') {
134
+ this.activePrimaryCategoryId = id;
135
+ }
136
+ else {
137
+ this.activeSecondaryCategoryId = id;
138
+ }
139
+ };
140
+ /** Renders the offer section */
141
+ this.renderOffer = () => {
142
+ const blocks = [
143
+ { name: translations.translate('components-b2b-offer-primary-title'), type: 'primary' },
144
+ { name: translations.translate('components-b2b-offer-secondary-title'), type: 'secondary' }
145
+ ];
146
+ return (index$1.h("div", { class: { offer: true, [`offer--${this.theme}`]: true } }, blocks.map((block) => {
147
+ const menuItems = state.data
148
+ .filter((item) => item.type === block.type)
149
+ .map((category) => {
150
+ const { id, name, icon } = category;
151
+ const selected = id === this.activePrimaryCategoryId || id === this.activeSecondaryCategoryId;
152
+ return { id, name, icon, selected };
153
+ });
154
+ const accRefCallback = (el) => {
155
+ if (block.type === 'primary') {
156
+ this.primaryAccordionEl = el;
157
+ }
158
+ else {
159
+ this.secondaryAccordionEl = el;
160
+ }
161
+ };
162
+ const navRefCallback = (el) => {
163
+ if (block.type === 'primary') {
164
+ this.primaryNavEl = el;
165
+ }
166
+ else {
167
+ this.secondaryNavEl = el;
168
+ }
169
+ };
170
+ return (index$1.h("tet-accordion", { ref: accRefCallback, key: block.type, class: "offer__block", isOpen: block.type === 'primary', header: block.name, withBorder: true, theme: this.theme, transparentBackground: true }, index$1.h("div", { class: "offer__content" }, index$1.h("div", { class: "offer__navigation" }, index$1.h("tet-business-navigation", { ref: navRefCallback, menuItems: menuItems, theme: this.theme, "onMenu-click-event": this.categoryClickHandler })), this.renderCards(block.type))));
171
+ })));
172
+ };
173
+ /**
174
+ * Finds category by id. Returns category or undefined.
175
+ * @param categoryId
176
+ * @returns
177
+ */
178
+ this.getCategoryById = (categoryId) => {
179
+ return state.data.find((category) => category.id === categoryId);
180
+ };
181
+ /**
182
+ * Event, emitted on compare link click with the relevant modal Id
183
+ * @param categoryId
184
+ * @returns
185
+ */
186
+ this.onCompareLinkClick = (categoryId) => {
187
+ const category = this.getCategoryById(categoryId);
188
+ if (!category || !category.modalScreenId) {
189
+ return;
190
+ }
191
+ this.compareLinkClick.emit(category.modalScreenId);
192
+ };
193
+ /**
194
+ * Handles card selection (aka. oepen state). Checks for single|multi choice
195
+ * @param cardId
196
+ * @param categoryId
197
+ * @returns
198
+ */
199
+ this.handleCardSelected = (cardId, categoryId) => {
200
+ const category = this.getCategoryById(categoryId);
201
+ if (!category) {
202
+ return;
203
+ }
204
+ const { type, allowMultipleChoice } = category;
205
+ if (type === 'primary') {
206
+ if (this.selectedPrimaryCards.includes(cardId)) {
207
+ return;
208
+ }
209
+ this.selectedPrimaryCards = allowMultipleChoice ? [...this.selectedPrimaryCards, cardId] : [cardId];
210
+ }
211
+ else {
212
+ if (this.selectedSecondaryCards.includes(cardId)) {
213
+ return;
214
+ }
215
+ this.selectedSecondaryCards = allowMultipleChoice ? [...this.selectedSecondaryCards, cardId] : [cardId];
216
+ }
217
+ };
218
+ /**
219
+ * Updates product in cart (add, edit, remove)
220
+ * In desktop mode - changes state of summary cart's accordions
221
+ * @param e
222
+ * @param categoryId
223
+ */
224
+ this.handleProductCountChanged = async (e, categoryId) => {
225
+ const { cardId, count } = e.detail;
226
+ const productCategory = this.getCategoryById(categoryId);
227
+ if (!productCategory || state.cart.get(cardId) === count) {
228
+ return;
229
+ }
230
+ if (!count) {
231
+ this.itemToRemove = cardId;
232
+ this.confirmationDialogEl.open();
233
+ return;
234
+ }
235
+ if (!productCategory.allowMultipleChoice) {
236
+ productCategory.products.forEach((product) => product.productCode !== cardId && removeFromCart(product.productCode));
237
+ }
238
+ addToCart(cardId, count);
239
+ if (this.isDesktopResolution) {
240
+ this.cartEl.changeBlockState(productCategory.type, 'open');
241
+ this.cartEl.changeBlockState(productCategory.type === 'primary' ? 'secondary' : 'primary', 'close');
242
+ }
243
+ };
244
+ /** Resets itemId to be removed when confirmation dialog is closed */
245
+ this.onConfirmationClose = () => {
246
+ this.itemToRemove = null;
247
+ };
248
+ /** Renders confirmation dialog, shown on product removal action */
249
+ this.renderConfirmationDialog = () => {
250
+ return (index$1.h("tet-dialog", { ref: (el) => (this.confirmationDialogEl = el), class: this.theme, closeOnOverlayClick: false, onCloseDialog: this.onConfirmationClose, theme: this.theme }, index$1.h("div", { class: "action-dialog" }, index$1.h("tet-icon", { class: "action-dialog__icon action-dialog__attention-icon", name: "attention" }), index$1.h("div", { class: "action-dialog__title" }, translations.translate('components-b2b-item-remove-confirmation-title'))), index$1.h("div", { slot: "footer", class: "action-dialog__footer" }, index$1.h("tet-button", { type: "secondary", theme: this.theme, size: "large", onClick: () => this.confirmationDialogEl.close() }, translations.translate('components-b2b-item-remove-confirmation-decline')), index$1.h("tet-button", { type: "primary", theme: this.theme, size: "large", iconName: "tc-trash", iconPosition: "left", onClick: () => {
251
+ removeFromCart(this.itemToRemove);
252
+ this.confirmationDialogEl.close();
253
+ } }, translations.translate('components-b2b-item-remove-confirmation-accept')))));
254
+ };
255
+ /** Performs action to start again */
256
+ this.resetState = () => {
257
+ resetCart();
258
+ this.checkoutAttempted = false;
259
+ this.primaryAccordionEl.open();
260
+ this.secondaryAccordionEl.close();
261
+ };
262
+ /** Renders dialog, shown after form submit */
263
+ this.renderSubmissionStateDialog = () => {
264
+ const isFormSubmitLoading = this.formState === 'loading';
265
+ const successClose = () => {
266
+ this.resetState();
267
+ this.successCloseClick.emit();
268
+ this.submissionStateDialogEl.close();
269
+ };
270
+ const content = isFormSubmitLoading ? (index$1.h("div", { class: "action-dialog" }, index$1.h("tet-spinner", { theme: this.theme }), index$1.h("div", { class: "action-dialog__title" }, translations.translate('components-b2b-loading-dialog-title')), index$1.h("div", { class: "action-dialog__description" }, translations.translate('components-b2b-loading-dialog-description')))) : ([
271
+ index$1.h("div", { class: "action-dialog" }, index$1.h("tet-icon", { class: "action-dialog__icon action-dialog__success-icon", name: "tc-check-circle" }), index$1.h("div", { class: "action-dialog__title" }, translations.translate('components-b2b-success-dialog-title')), index$1.h("div", { class: "action-dialog__description" }, translations.translate('components-b2b-success-dialog-description'))),
272
+ index$1.h("div", { slot: "footer", class: "action-dialog__footer" }, index$1.h("tet-button", { type: "secondary", theme: this.theme, size: "large", onClick: successClose }, index$1.h("div", { class: "action-dialog__button-text" }, translations.translate('components-b2b-success-dialog-close'))), index$1.h("tet-button", { type: "primary", theme: this.theme, size: "large", onClick: () => {
273
+ this.resetState();
274
+ this.submissionStateDialogEl.close();
275
+ } }, index$1.h("div", { class: "action-dialog__button-text" }, translations.translate('components-b2b-success-dialog-start-again'))))
276
+ ]);
277
+ return (index$1.h("tet-dialog", { ref: (el) => (this.submissionStateDialogEl = el), class: { [this.theme]: true, 'action-dialog--loading': isFormSubmitLoading }, closeOnOverlayClick: false, closeOnEscape: !isFormSubmitLoading, hideCloseButton: isFormSubmitLoading, theme: this.theme, onCloseDialog: this.formState === 'success' ? successClose : this.submissionStateDialogEl.close }, content));
278
+ };
279
+ /**
280
+ * Renders offer section cards for the given category type
281
+ * @param categoryType The type of category block to render
282
+ * @returns
283
+ */
284
+ this.renderCards = (categoryType) => {
285
+ var _a;
286
+ const activeCategoryId = categoryType === 'primary' ? this.activePrimaryCategoryId : this.activeSecondaryCategoryId;
287
+ const selectedCards = categoryType === 'primary' ? this.selectedPrimaryCards : this.selectedSecondaryCards;
288
+ const products = ((_a = this.getCategoryById(activeCategoryId)) === null || _a === void 0 ? void 0 : _a.products) || [];
289
+ const cards = products.map((product) => {
290
+ var _a, _b;
291
+ const { productCode: id, name: { lv: title }, description: { lv: subtitle }, amount: price, b2bConfiguratorProduct: { discountAmount: discountPrice, selectionType, defaultValue, minValue, maxValue, translationKey: label }, benefits: { lv: benefits }, contracts } = product;
292
+ const isBestChoice = !!((_a = product.attributes.find((attribute) => attribute.key === 'isBestChoice')) === null || _a === void 0 ? void 0 : _a.value);
293
+ const counterOptions = selectionType === 'single'
294
+ ? undefined
295
+ : {
296
+ defaultValue,
297
+ minValue,
298
+ maxValue,
299
+ label
300
+ };
301
+ const options = {
302
+ id,
303
+ title,
304
+ subtitle,
305
+ isBestChoice,
306
+ price,
307
+ discountPrice,
308
+ benefits: benefits.split('\n'),
309
+ contract: (_b = contracts[0]) === null || _b === void 0 ? void 0 : _b.contract,
310
+ counterOptions
311
+ };
312
+ const isSelected = selectedCards.includes(id);
313
+ return (index$1.h("tet-b2b-compare-card", { options: options, theme: this.theme, key: id, isSelected: isSelected, onSelectedChange: () => this.handleCardSelected(id, activeCategoryId), count: state.cart.get(id), onCountChange: (e) => this.handleProductCountChanged(e, activeCategoryId) }));
314
+ });
315
+ return (index$1.h("div", { class: "offer__cards" }, index$1.h("div", { class: "offer__cards-header" }, index$1.h("div", { class: "offer__cards-title" }, translations.translate('components-b2b-offer-product-list-title')), index$1.h("button", { class: { 'button-reset': true, 'compare__button': true, [`${this.theme}`]: true }, onClick: () => {
316
+ this.onCompareLinkClick(activeCategoryId);
317
+ } }, index$1.h("span", { class: { 'compare__text': true, 'tet-link': true, [`${this.theme}`]: true } }, translations.translate('components-b2b-offer-compare-link-text')), index$1.h("div", { class: "compare__icon-wrapper" }, index$1.h("tet-icon", { class: "compare__icon", name: "tc-info-circle-outline", theme: this.theme })))), index$1.h("div", { class: "offer__cards-list" }, cards)));
318
+ };
319
+ /**
320
+ * Translates Cart "count change" event and uses in the general "count change" handler
321
+ * @param cardId
322
+ * @param count
323
+ * @param categoryId
324
+ */
325
+ this.handleCartProductCountChange = (cardId, count, categoryId) => {
326
+ const updateEvent = { detail: { cardId, count } };
327
+ this.handleProductCountChanged(updateEvent, categoryId);
328
+ };
329
+ /**
330
+ * Navigates user in offer section by opening accordion and selecting the specific product which was clicked in cart component
331
+ * @param categoryId
332
+ * @param productCode
333
+ * @returns
334
+ */
335
+ this.goToProduct = async (categoryId, productCode) => {
336
+ const category = this.getCategoryById(categoryId);
337
+ if (!category) {
338
+ return;
339
+ }
340
+ if (category.type === 'primary') {
341
+ await this.primaryAccordionEl.open();
342
+ await this.primaryNavEl.selectMenuItem(categoryId);
343
+ this.primaryAccordionEl.scrollIntoView({ behavior: 'smooth' });
344
+ }
345
+ else if (category.type === 'secondary') {
346
+ await this.secondaryAccordionEl.open();
347
+ await this.secondaryNavEl.selectMenuItem(categoryId);
348
+ this.secondaryAccordionEl.scrollIntoView({ behavior: 'smooth' });
349
+ }
350
+ setTimeout(() => {
351
+ this.handleCardSelected(productCode, categoryId);
352
+ }, 0);
353
+ };
354
+ /**
355
+ * Renders list of Cards in Cart depending on context
356
+ * @param context
357
+ * @returns
358
+ */
359
+ this.renderCartCardsList = (context) => {
360
+ const categoryTypes = ['primary', 'secondary'];
361
+ const productCodeToSummaryCard = (productCode) => {
362
+ const count = state.cart.get(productCode);
363
+ const details = state.productDetails.get(productCode);
364
+ if (count === undefined || !details) {
365
+ return null;
366
+ }
367
+ const { name, amount, description, discountAmount, categoryName, categoryType, categoryId, b2bConfiguratorProduct } = details;
368
+ const productDescription = categoryType === 'primary' ? description : categoryName;
369
+ const { selectionType, term, minValue, maxValue, translationKey } = b2bConfiguratorProduct;
370
+ const activeCategoryId = categoryType === 'primary' ? this.activePrimaryCategoryId : this.activeSecondaryCategoryId;
371
+ return (index$1.h("tet-business-summary-card", { key: productCode, productName: name, price: amount, productDescription: productDescription, discountPrice: discountAmount, currency: this.priceSuffix, contractTerm: term, theme: this.theme, withStepper: selectionType === 'number', value: count, minValue: minValue, maxValue: maxValue, stepperLabel: translations.translate(translationKey || ''), context: context, onAmountChange: (e) => this.handleCartProductCountChange(productCode, e.detail, activeCategoryId), onDeleteButtonClick: () => this.handleCartProductCountChange(productCode, 0, activeCategoryId), onEditButtonClick: () => this.goToProduct(categoryId, productCode) }));
372
+ };
373
+ return categoryTypes.map((type) => {
374
+ const summaryCards = [...state.cart]
375
+ .filter(([productCode]) => {
376
+ const details = state.productDetails.get(productCode);
377
+ return details && details.categoryType === type;
378
+ })
379
+ .map(([productCode]) => productCodeToSummaryCard(productCode));
380
+ return summaryCards.length ? (index$1.h("div", { class: "cart__card-list", slot: type }, summaryCards)) : null;
381
+ });
382
+ };
383
+ /** Adjusts the top position variable for the sticky cart element */
384
+ this.positionStickyCartEl = () => {
385
+ if (this.referenceElement) {
386
+ if (this.isDesktopResolution) {
387
+ this.hostElement.style.setProperty('--b2b-cart-sticky-top', `${this.referenceElement.offsetTop}px`);
388
+ }
389
+ else {
390
+ this.hostElement.style.removeProperty('--b2b-cart-sticky-top');
391
+ }
392
+ }
393
+ };
394
+ /**
395
+ * Renders Cart content depending on context
396
+ * @param context
397
+ * @returns
398
+ */
399
+ this.renderCart = (context = 'edit') => {
400
+ var _a;
401
+ const isCartEmpty = !state.cart.size;
402
+ let summaryAmounts = { primary: 0, secondary: 0 };
403
+ let summaryCounts = { primary: 0, secondary: 0 };
404
+ let summaryWouldBeAmount = 0;
405
+ for (const [key, count] of state.cart) {
406
+ const details = state.productDetails.get(key);
407
+ if (!details) {
408
+ continue;
409
+ }
410
+ summaryAmounts[details.categoryType] += ((_a = details.discountAmount) !== null && _a !== void 0 ? _a : details.amount) * count;
411
+ summaryCounts[details.categoryType] += 1;
412
+ summaryWouldBeAmount += details.amount * count;
413
+ }
414
+ const { primary: primaryAmount, secondary: secondaryAmount } = summaryAmounts;
415
+ const summaryAmount = primaryAmount + secondaryAmount;
416
+ const summarySavings = summaryWouldBeAmount - summaryAmount;
417
+ const { primary, secondary } = this.areProductsAddedToCart();
418
+ const hasPrimaryNotification = context === 'edit' && this.checkoutAttempted && !primary;
419
+ const hasSecondaryNotification = context === 'edit' && this.checkoutAttempted && !secondary;
420
+ const data = {
421
+ summaryAmount: summaryAmount.toFixed(2),
422
+ primaryAmount: primaryAmount.toFixed(2),
423
+ secondaryAmount: secondaryAmount.toFixed(2),
424
+ primaryCount: summaryCounts.primary,
425
+ secondaryCount: summaryCounts.secondary,
426
+ summarySavings: summarySavings.toFixed(2),
427
+ hasPrimaryNotification,
428
+ hasSecondaryNotification
429
+ };
430
+ const ctaButton = context === 'edit' ? (index$1.h("tet-button", { onClick: this.checkout, slot: "cta", class: "cart__cta", type: "primary", size: this.isDesktopResolution ? 'large' : 'medium', theme: this.theme }, translations.translate('components-b2b-cart-cta-button-title'))) : null;
431
+ return (index$1.h("tet-b2b-configurator-cart", { ref: (el) => (context === 'edit' ? (this.cartEl = el) : null), context: context, class: { 'cart': true, 'cart--empty': isCartEmpty, [`cart--${context}`]: true }, data: data, theme: this.theme, isCartEmpty: isCartEmpty, isDesktopResolution: this.isDesktopResolution }, this.renderCartCardsList(context), ctaButton));
432
+ };
433
+ /** Checks if both primary and secondary products are currently in cart */
434
+ this.areProductsAddedToCart = () => {
435
+ const productsInCart = { primary: false, secondary: false };
436
+ for (const [key, _] of state.cart) {
437
+ const details = state.productDetails.get(key);
438
+ if (!details) {
439
+ continue;
440
+ }
441
+ productsInCart[details.categoryType] = true;
442
+ }
443
+ return productsInCart;
444
+ };
445
+ /** Cart checkout handler. Opens Checkout component*/
446
+ this.checkout = () => {
447
+ this.checkoutAttempted = true;
448
+ const { primary, secondary } = this.areProductsAddedToCart();
449
+ if (primary && secondary) {
450
+ this.checkoutFormEl.open();
451
+ }
452
+ };
453
+ /**
454
+ * Catches emitted checkout form data
455
+ * Combines with cart data and re-emits
456
+ * @param e
457
+ */
458
+ this.submit = ({ detail }) => {
459
+ const data = {
460
+ cart: getCart(),
461
+ contactInfo: detail
462
+ };
463
+ this.formState = 'loading';
464
+ this.b2bConfiguratorSubmit.emit(data);
465
+ this.checkoutFormEl.close();
466
+ this.submissionStateDialogEl.open();
467
+ };
468
+ this.renderCheckoutForm = () => {
469
+ return (index$1.h("tet-b2b-check-out-form", { ref: (el) => (this.checkoutFormEl = el), theme: this.theme, "onSubmit-check-out-form": this.submit }, index$1.h("div", { slot: "cart" }, this.renderCart('checkout'))));
470
+ };
471
+ this.referenceElement = undefined;
472
+ this.isLoading = true;
473
+ this.itemToRemove = null;
474
+ this.checkoutAttempted = false;
475
+ this.formState = 'success';
476
+ this.activePrimaryCategoryId = null;
477
+ this.activeSecondaryCategoryId = null;
478
+ this.selectedPrimaryCards = [];
479
+ this.selectedSecondaryCards = [];
480
+ this.isDesktopResolution = undefined;
481
+ this.theme = 'light';
482
+ this.stickyRefEl = '';
483
+ }
484
+ /** Resets selected (open) primary cards on category change */
485
+ resetSelectedPrimaryCards() {
486
+ this.selectedPrimaryCards = [];
487
+ }
488
+ /** Resets selected (open) secondary cards on category change */
489
+ resetSelectedSecondaryCards() {
490
+ this.selectedSecondaryCards = [];
491
+ }
492
+ /** Checks for desktop resolution and intializes the sticky element's reference using the provided prop or the host's parent */
493
+ async componentWillLoad() {
494
+ this.checkDesktopResolution();
495
+ this.referenceElement = this.stickyRefEl
496
+ ? document.querySelector(this.stickyRefEl)
497
+ : this.hostElement.parentElement;
498
+ }
499
+ /**
500
+ * Initiates:
501
+ * - data (with minimum load time to reduce flickering)
502
+ * - selected categories for each type
503
+ * - sticky elements position
504
+ */
505
+ async componentDidLoad() {
506
+ var _a, _b;
507
+ this.isLoading = true;
508
+ await ensureMinDuration(this.fetchData, MIN_LOAD_TIME);
509
+ this.isLoading = false;
510
+ this.activePrimaryCategoryId = ((_a = state.data.find((category) => category.type === 'primary')) === null || _a === void 0 ? void 0 : _a.id) || null;
511
+ this.activeSecondaryCategoryId = ((_b = state.data.find((category) => category.type === 'secondary')) === null || _b === void 0 ? void 0 : _b.id) || null;
512
+ this.positionStickyCartEl();
513
+ }
514
+ /**
515
+ * Initiates desktop resolution listener and sticky adjustement on window resize
516
+ */
517
+ onResize() {
518
+ this.checkDesktopResolution();
519
+ this.positionStickyCartEl();
520
+ }
521
+ /** Sets the value of form submission status*/
522
+ async setSubmitFormState(value) {
523
+ this.formState = value;
524
+ }
525
+ render() {
526
+ return (index$1.h(index$1.Host, { key: 'e7d2ab1d76e8ad347393bde30d0d71a7425ca2f7' }, index$1.h("div", { key: 'af251291fbb1cdf8c6eb1c3928f1fcd99181fa25', class: { configurator: true, [`${this.theme}`]: true } }, this.isLoading ? this.renderPlaceholder() : state.data && [this.renderOffer(), this.renderCart()]), this.renderCheckoutForm(), this.renderConfirmationDialog(), this.renderSubmissionStateDialog()));
527
+ }
528
+ get hostElement() { return index$1.getElement(this); }
529
+ static get watchers() { return {
530
+ "activePrimaryCategoryId": ["resetSelectedPrimaryCards"],
531
+ "activeSecondaryCategoryId": ["resetSelectedSecondaryCards"]
532
+ }; }
533
+ };
534
+ TetB2bConfigurator.style = TetB2bConfiguratorStyle0;
535
+
536
+ exports.tet_b2b_configurator = TetB2bConfigurator;
@@ -62,7 +62,7 @@ const TetB2bServiceCalculator = class {
62
62
  translations.processTranslations('tet-components', this.language).then(() => index.forceUpdate(this));
63
63
  }
64
64
  render() {
65
- return (index.h("section", { key: '7249b0c2f37af39e860637cfe416182c5227c6d2', class: "container" }, index.h("div", { key: '89565a9f35411aa6a542582b77df0b9b9da03e0e', class: "title-block" }, translations.translate('components-b2b-calculator-title')), index.h("div", { key: '433eff5a8e863475880f8cf0216d1f604b7f74ce', class: "calculator-block" }, index.h("p", { key: '1b81e92aa9b7c58543257ea906c2177108b5c3e5', class: "slider-title" }, translations.translate('components-b2b-calculator-computer-count')), index.h("tet-range-slider", { key: 'c5ce8ce5c73329b07f9df3b22aa2f243c56ca1e9', class: "slider", size: "large", type: "primary", defaultValue: 75, maxValue: 100, withControls: false, withInput: false, dataPoints: [1, 20, 40, 60, 80, 100], displayDataPoints: [1, 20, 40, 60, 80, 100], lockToDataPoint: false }), index.h("div", { key: '69d35eac4899ba24153253d1a70984c60de6ee4f', class: "control-container" }, index.h("div", { key: '53f8d6355652051ca9e455769a32b1ee127a1a7d', class: "control" }, index.h("tet-checkbox", { key: 'adfd75a801a68e6ba794d27735d595dddfc9c901', class: "it-admin-checkbox", checked: this.withItAdmin, onCheck: this.handleWithItAdminValueChange }, translations.translate('components-b2b-calculator-it-admin-checkbox-label'))), index.h("div", { key: '000d314c262c7688e1ca5aed97dc84d0c72955e2', class: "control" }, index.h("tet-switch", { key: '8a423a478675117419a6c2ce02dd37962d4741e0', class: "in-person-support-switch", checked: this.withInPersonServiceSupport, onCheck: this.handleInPersonServiceSupportValueChange }, translations.translate('components-b2b-calculator-in-person-support-switch-label')))), index.h("div", { key: '9d869285131a855b2b9caf6d8ffe6100ab09df8f', class: "monthly-payment-block" }, index.h("p", { key: '08248a6283d71227e0350b4c0ff092993c86aa56', class: "title" }, translations.translate('components-b2b-calculator-potential-monthly-payment')), index.h("p", { key: 'cf137d3eed20a677c934f1dacdf8624bce437d70' }, index.h("span", { key: '070d5c3458a67c444c779e62fe522f3cda3dbb2a', class: "price" }, this.totalPrice), index.h("span", { key: 'f176b1e11123c143f0c63267256ec1484df38eec', class: "currency" }, translations.translate('components-euro-per-month')))))));
65
+ return (index.h("section", { key: '326aaa3f71423e90e2b453e5cc8b1df96689a8bc', class: "container" }, index.h("div", { key: 'f51769d2182670107b7a43467781160486c0f029', class: "title-block" }, translations.translate('components-b2b-calculator-title')), index.h("div", { key: 'b4ff5d39a203c91ade560be83be338166d8b9ff0', class: "calculator-block" }, index.h("p", { key: 'c1e8ac5d2b37d8a324acf7b3da046c29e1383c75', class: "slider-title" }, translations.translate('components-b2b-calculator-computer-count')), index.h("tet-range-slider", { key: '81d57baa4df911bbeceb6ba2a6c67bcd07a09a90', class: "slider", size: "large", type: "primary", defaultValue: 75, maxValue: 100, withControls: false, withInput: false, dataPoints: [1, 20, 40, 60, 80, 100], displayDataPoints: [1, 20, 40, 60, 80, 100], lockToDataPoint: false }), index.h("div", { key: '410efdef7d65e976e94dd7040c4d7faa1d52e32b', class: "control-container" }, index.h("div", { key: '931c43b16c415ab0075a9fbc9f4710210ed0a5f4', class: "control" }, index.h("tet-checkbox", { key: '6df1d34cb7670a01213ee83f8c3d33529f13bef6', class: "it-admin-checkbox", checked: this.withItAdmin, onCheck: this.handleWithItAdminValueChange }, translations.translate('components-b2b-calculator-it-admin-checkbox-label'))), index.h("div", { key: '1584213b5b9f61d97be033f37e1e0d82dafedc78', class: "control" }, index.h("tet-switch", { key: 'd02d94c371e55119eceea25d187346cb13cd2071', class: "in-person-support-switch", checked: this.withInPersonServiceSupport, onCheck: this.handleInPersonServiceSupportValueChange }, translations.translate('components-b2b-calculator-in-person-support-switch-label')))), index.h("div", { key: '4a2b3bd7bdc6f893e644480e4d234f140df41931', class: "monthly-payment-block" }, index.h("p", { key: '390d38acfbc980da72a405639ff1c5b14bc6402a', class: "title" }, translations.translate('components-b2b-calculator-potential-monthly-payment')), index.h("p", { key: '5c159aef3379a1c4c321959c9512dc733d509ebd' }, index.h("span", { key: 'd84fc849ac203fc4fe0199759263ee39959a594d', class: "price" }, this.totalPrice), index.h("span", { key: 'a8cf396d4fa1ea083833dd276fb45b0c6d73e7c2', class: "currency" }, translations.translate('components-euro-per-month')))))));
66
66
  }
67
67
  static get watchers() { return {
68
68
  "language": ["onLanguageChange"],
@@ -12,7 +12,7 @@ const TetBorderRadius = class {
12
12
  index.registerInstance(this, hostRef);
13
13
  }
14
14
  render() {
15
- return (index.h(index.Host, { key: '824695af0bdc8618a5e13312583d930394edc062' }, index.h("div", { key: '4e31fd7b1c02f20521dcaa12e4865d7c24396901', class: "variable-container" }, index.h("div", { key: 'e0d904db4a4c55f1a1d3bd7f38e85978b649335d', class: "container-title main" }, "Border r\u0101diusa klase"), index.h("div", { key: 'c47184e263ee3c30b9610706ec6c01f57fd1652f', class: "container-section" }, index.h("div", { key: '180d3bd4ee52825beae42d95f940dc274eb2aad9', class: "variable-name" }, index.h("div", { key: '562879900d54b23f887693c42d117f00e2ae7875', class: "variable-part" }, "tet"), index.h("div", { key: '292ca9d4d99a3b25627f32d6e9b2faae80c677eb', class: "variable-part" }, "-border"), index.h("div", { key: '5039dae824531f3bcfd7445e703184be18652fd4', class: "variable-part variable variable-type" }, "-radius"), index.h("div", { key: '109b76eb35e05e3ff8f6dab3624e4e60d46d959b', class: "variable-part variable variable-size" }, "--md")))), index.h("div", { key: '74579cdac69de91f4046335008b3b713ebfc133e', class: "tet-fonts-container" }, index.h("div", { key: 'f220407e26557e647534797a68fadc222289cb22', class: "container-title" }, "R\u0101diusa izm\u0113ri"), index.h("div", { key: 'f35b2dc9ac52b8d3a57e97604c0b738de16bb804', class: "section" }, index.h("div", { key: '6f8db5b529707d796f13d1bcaff5790ba81ce1fd', class: "section-variable" }, index.h("div", { key: '8a2a872d7d70b63ba56e8d73f0e5e7933689c1e5', class: "border tet-border-radius--xs" }), index.h("div", { key: 'bf83b4833fe57bb5dd482aa0675a076935899207', class: "section-font-class" }, "klase: tet-border-radius--xs"), index.h("div", { key: '4af7748836ce92d5e036cdb8fc7299d3af1d1660', class: "section-font-size" }, "border radius: 0.25rem / 4px")), index.h("div", { key: '1b56a0e9bb9af0fe97ef722e9b9f6c3dd76ad07a', class: "section-variable" }, index.h("div", { key: '5306079890e8227554c7ba9786f5f43dd66049d7', class: "border tet-border-radius--sm" }), index.h("div", { key: 'f127eceacf5c5f9e1deab915633c974ea3de290b', class: "section-font-class" }, "klase: tet-border-radius--sm"), index.h("div", { key: 'cea678272d74df702dea10996a800d521feaede7', class: "section-font-size" }, "border radius: 0.5rem / 8px")), index.h("div", { key: '1f97acd42cac01d8fb04fc4a2c67cbfd4035b585', class: "section-variable" }, index.h("div", { key: '052b51da4fa0ef6be8c32f8a530c473260807f4b', class: "border tet-border-radius--md" }), index.h("div", { key: 'd7090e283161c6b6a038afe526913fa4f0dd26da', class: "section-font-class" }, "klase: tet-border-radius--md"), index.h("div", { key: 'c481386916cb419d593fbfa7550b3606e9148902', class: "section-font-size" }, "border radius: 1rem / 16px")), index.h("div", { key: 'e970f004eb83f1834d59f1fda7646b90cf7dcad9', class: "section-variable" }, index.h("div", { key: 'c0bea393cff284d5809e8121cd1a815050622deb', class: "border tet-border-radius--lg" }), index.h("div", { key: '77ace4611d911356a5d0a33c0e51c392f369665c', class: "section-font-class" }, "klase: tet-border-radius--lg"), index.h("div", { key: 'e97f9d8e7f79ec085259b4f9614a730557e3ea13', class: "section-font-size" }, "border radius: 1.5rem / 24px"), index.h("div", { key: '01940f7bbadc90c5ab5257cc0a297ce726303642', class: "section-font-size" })), index.h("div", { key: '3493b74fe5050e5c8fda7e2eec7d5debdfde295c', class: "section-variable" }, index.h("div", { key: '130f8eb3c9f40b0fa7f314658f15309b58d7ffc7', class: "border tet-border-radius--xl" }), index.h("div", { key: '94aba6bdcf8bea0942efa3d123c59a7b58eaac8a', class: "section-font-class" }, "klase: tet-border-radius--xl"), index.h("div", { key: '5cab0eecd699064182b7ebf755ff82ceff103a97', class: "section-font-size" }, "border radius: 2rem / 32px"))))));
15
+ return (index.h(index.Host, { key: '0c5eb1c84e6e12c139d336156876f885e8e1898a' }, index.h("div", { key: '9248d0401161eebfcfd10501d8dd6f6ceabe175a', class: "variable-container" }, index.h("div", { key: '61bd6a861a441a8aadde002186e9457d914ba865', class: "container-title main" }, "Border r\u0101diusa klase"), index.h("div", { key: '043c430f505327a438222f84b4f73a91756334ee', class: "container-section" }, index.h("div", { key: 'ae0be152784b0e8a9e26ed5e673a9b30e60399ad', class: "variable-name" }, index.h("div", { key: '23fd45b7c6613a18bc6506424a2f13996292847d', class: "variable-part" }, "tet"), index.h("div", { key: 'cda3e2cbf73ac3566d4b4964b228e3e48896ce3c', class: "variable-part" }, "-border"), index.h("div", { key: '27f6b71a88fa0b11b0c4685b4b18c43473423d01', class: "variable-part variable variable-type" }, "-radius"), index.h("div", { key: 'e5aa2b931e3c1d6dd34fd1519f458f4e41c5fa7d', class: "variable-part variable variable-size" }, "--md")))), index.h("div", { key: 'fad020daf0f44bd1efd666e5ae411ec011d27c59', class: "tet-fonts-container" }, index.h("div", { key: 'a88e76bdc8b5d9fa04a0e0573c45b737c6b5f8f2', class: "container-title" }, "R\u0101diusa izm\u0113ri"), index.h("div", { key: 'ccfbcefd5f05695551d9cf457cc79ef3d369088e', class: "section" }, index.h("div", { key: 'a1973d56c4750d9092ab90e116d63cc5cf220f81', class: "section-variable" }, index.h("div", { key: '236333eaf96e2b5fb5fecf0ad19b061c33e6aa52', class: "border tet-border-radius--xs" }), index.h("div", { key: 'a92a1a73f2fd5064085739390bc0db07f87f5fc9', class: "section-font-class" }, "klase: tet-border-radius--xs"), index.h("div", { key: 'e0d3ff6dcda4c447af035ba3fb002fae6f0273e5', class: "section-font-size" }, "border radius: 0.25rem / 4px")), index.h("div", { key: '5420af14d7b7108aef3623b466f64891917d9c39', class: "section-variable" }, index.h("div", { key: 'b2e230c6db68fa056d978d73b29af7af84e5d3eb', class: "border tet-border-radius--sm" }), index.h("div", { key: 'bc9e400dcabe3ea2762214ace88460c7d002353f', class: "section-font-class" }, "klase: tet-border-radius--sm"), index.h("div", { key: 'd879a43edf304ea81966abc095d288615e0ecdf3', class: "section-font-size" }, "border radius: 0.5rem / 8px")), index.h("div", { key: '2d8b7886bb4fd1b485d3410d821d5d044f29ea23', class: "section-variable" }, index.h("div", { key: 'cc11f623e5961d2db0add84c09cdec8df723faaa', class: "border tet-border-radius--md" }), index.h("div", { key: '6ffb3fedefffceeb5c33248590e8fc960b531173', class: "section-font-class" }, "klase: tet-border-radius--md"), index.h("div", { key: '9416af782ca35536e6307cb447bb86088b510577', class: "section-font-size" }, "border radius: 1rem / 16px")), index.h("div", { key: 'f8b41b2d8b853234822373f27f7a4d33be1dac27', class: "section-variable" }, index.h("div", { key: 'ba086e73096f88b012543f050301088d83d08d4a', class: "border tet-border-radius--lg" }), index.h("div", { key: '8cf744af670b89da06d651fe9015fb7c49b022ad', class: "section-font-class" }, "klase: tet-border-radius--lg"), index.h("div", { key: 'f798358f8ddeeb92cb36fe1d4f4b54a2855d8bc8', class: "section-font-size" }, "border radius: 1.5rem / 24px"), index.h("div", { key: 'eeed99048ab43f86ba0ae5c059bc3f1de84be8a8', class: "section-font-size" })), index.h("div", { key: '3f984951f3deeac4522ce3284dd795697e92835d', class: "section-variable" }, index.h("div", { key: '500eaa605db810378b1cd42595721a992010f94f', class: "border tet-border-radius--xl" }), index.h("div", { key: 'c6066d4b0c9f9a5fba13cfbf67cca06c3d8b228d', class: "section-font-class" }, "klase: tet-border-radius--xl"), index.h("div", { key: 'dd02e958c143326db12a5e0268d9133e8c7b6ecc', class: "section-font-size" }, "border radius: 2rem / 32px"))))));
16
16
  }
17
17
  };
18
18
  TetBorderRadius.style = TetBorderRadiusStyle0;
@@ -70,7 +70,7 @@ const TetBusinessLines = class {
70
70
  }
71
71
  render() {
72
72
  var _a;
73
- return (index.h("div", { key: '662ada195159db350c1c297f8c07a0e344d45cb2', class: "container" }, this.showHeadings && this.renderHeadings(), index.h("div", { key: 'ae66eb988b9c4f8b78ca265bb30b853cda6b6993', class: "business-line-wrapper" }, (_a = this.businessLines) === null || _a === void 0 ? void 0 : _a.map(this.renderBusinessLineItem))));
73
+ return (index.h("div", { key: '373ee3335a2e897763556faedda0720e437f5894', class: "container" }, this.showHeadings && this.renderHeadings(), index.h("div", { key: '1d4b289bcec43264aa7f12d2bd82aa300638b0de', class: "business-line-wrapper" }, (_a = this.businessLines) === null || _a === void 0 ? void 0 : _a.map(this.renderBusinessLineItem))));
74
74
  }
75
75
  static get watchers() { return {
76
76
  "language": ["onLanguageChange"],