@useinsider/guido 2.1.0-beta.42f5dfa → 2.1.0-beta.4bcb91b

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 (149) hide show
  1. package/README.md +3 -1
  2. package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue2.js +14 -15
  3. package/dist/components/organisms/header/HeaderWrapper.vue.js +9 -9
  4. package/dist/composables/useHtmlValidator.js +84 -106
  5. package/dist/composables/useRecommendation.js +21 -54
  6. package/dist/composables/useSave.js +16 -12
  7. package/dist/composables/useStripo.js +58 -54
  8. package/dist/composables/useStripoEventHandler.js +27 -12
  9. package/dist/composables/useSyncModuleExtractor.js +33 -0
  10. package/dist/config/compiler/recommendationCompilerRules.js +39 -45
  11. package/dist/config/migrator/recommendationMigrator.js +2 -2
  12. package/dist/enums/extensions/recommendationBlock.js +1 -1
  13. package/dist/enums/recommendation.js +15 -16
  14. package/dist/enums/unsubscribe.js +25 -21
  15. package/dist/extensions/Blocks/Recommendation/block.js +9 -130
  16. package/dist/extensions/Blocks/Recommendation/cardCompositionControl.js +187 -0
  17. package/dist/extensions/Blocks/Recommendation/constants.js +13 -0
  18. package/dist/extensions/Blocks/Recommendation/control.js +336 -0
  19. package/dist/extensions/Blocks/Recommendation/controls/cardBackgroundColorControl.js +68 -0
  20. package/dist/extensions/Blocks/Recommendation/controls/index.js +245 -0
  21. package/dist/extensions/Blocks/Recommendation/controls/nameTextTrimControl.js +74 -0
  22. package/dist/extensions/Blocks/Recommendation/controls/{omnibusDiscount/textAfter.js → omnibusDiscountTextAfterControl.js} +14 -16
  23. package/dist/extensions/Blocks/Recommendation/controls/{omnibusDiscount/textBefore.js → omnibusDiscountTextBeforeControl.js} +14 -16
  24. package/dist/extensions/Blocks/Recommendation/controls/{omnibusPrice/textAfter.js → omnibusPriceTextAfterControl.js} +14 -16
  25. package/dist/extensions/Blocks/Recommendation/controls/{omnibusPrice/textBefore.js → omnibusPriceTextBeforeControl.js} +12 -14
  26. package/dist/extensions/Blocks/Recommendation/controls/spacingControl.js +188 -0
  27. package/dist/extensions/Blocks/Recommendation/extension.js +17 -40
  28. package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +3 -19
  29. package/dist/extensions/Blocks/Recommendation/recommendation.css.js +4 -13
  30. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +10 -21
  31. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +193 -230
  32. package/dist/extensions/Blocks/Recommendation/templates/blockTemplate.js +181 -0
  33. package/dist/extensions/Blocks/Recommendation/templates/migrationTemplate.js +189 -0
  34. package/dist/extensions/Blocks/Recommendation/templates/templateUtils.js +209 -0
  35. package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +9 -9
  36. package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +15 -26
  37. package/dist/extensions/Blocks/controlFactories.js +93 -125
  38. package/dist/guido.css +1 -1
  39. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +169 -223
  40. package/dist/services/recommendationApi.js +9 -10
  41. package/dist/services/stripoApi.js +50 -14
  42. package/dist/services/templateLibraryApi.js +13 -16
  43. package/dist/src/@types/events.d.ts +34 -2
  44. package/dist/src/components/wrappers/WpDrawer.vue.d.ts +1 -1
  45. package/dist/src/composables/useRecommendation.d.ts +0 -1
  46. package/dist/src/composables/useSyncModuleExtractor.d.ts +4 -0
  47. package/dist/src/enums/unsubscribe.d.ts +3 -0
  48. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +0 -67
  49. package/dist/src/extensions/Blocks/Recommendation/{controls/cardComposition/index.d.ts → cardCompositionControl.d.ts} +3 -23
  50. package/dist/src/extensions/Blocks/Recommendation/{constants/controlIds.d.ts → constants.d.ts} +24 -0
  51. package/dist/src/extensions/Blocks/Recommendation/control.d.ts +38 -0
  52. package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +589 -21
  53. package/dist/src/extensions/Blocks/Recommendation/controls/nameTextTrimControl.d.ts +16 -0
  54. package/dist/src/extensions/Blocks/Recommendation/extension.d.ts +0 -9
  55. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +468 -131
  56. package/dist/src/extensions/Blocks/Recommendation/templates/blockTemplate.d.ts +16 -0
  57. package/dist/src/extensions/Blocks/Recommendation/templates/{grid/migration.d.ts → migrationTemplate.d.ts} +4 -11
  58. package/dist/src/extensions/Blocks/Recommendation/templates/templateUtils.d.ts +52 -0
  59. package/dist/src/mock/api/settings.d.ts +2 -0
  60. package/dist/src/services/stripoApi.d.ts +5 -0
  61. package/dist/src/stores/editor.d.ts +23 -0
  62. package/dist/static/styles/components/notification.css.js +1 -0
  63. package/dist/static/styles/components/version-history.css.js +10 -2
  64. package/dist/static/styles/components/wide-panel.css.js +18 -2
  65. package/dist/static/styles/customEditorStyle.css.js +2 -25
  66. package/dist/stores/editor.js +2 -1
  67. package/dist/utils/pairProductVariables.js +56 -57
  68. package/dist/utils/templatePreparation.js +14 -15
  69. package/package.json +1 -1
  70. package/dist/config/compiler/utils/recommendationCompilerUtils.js +0 -116
  71. package/dist/extensions/Blocks/Recommendation/constants/blockIds.js +0 -4
  72. package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +0 -4
  73. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +0 -65
  74. package/dist/extensions/Blocks/Recommendation/constants/layout.js +0 -20
  75. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +0 -19
  76. package/dist/extensions/Blocks/Recommendation/controls/button/index.js +0 -64
  77. package/dist/extensions/Blocks/Recommendation/controls/cardBackground/index.js +0 -80
  78. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +0 -232
  79. package/dist/extensions/Blocks/Recommendation/controls/image/index.js +0 -19
  80. package/dist/extensions/Blocks/Recommendation/controls/layout/index.js +0 -92
  81. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +0 -102
  82. package/dist/extensions/Blocks/Recommendation/controls/main/currency.js +0 -209
  83. package/dist/extensions/Blocks/Recommendation/controls/main/filters.js +0 -52
  84. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +0 -217
  85. package/dist/extensions/Blocks/Recommendation/controls/main/locale.js +0 -70
  86. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +0 -110
  87. package/dist/extensions/Blocks/Recommendation/controls/main/shuffle.js +0 -67
  88. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +0 -286
  89. package/dist/extensions/Blocks/Recommendation/controls/name/index.js +0 -46
  90. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +0 -108
  91. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/index.js +0 -44
  92. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.js +0 -48
  93. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/index.js +0 -48
  94. package/dist/extensions/Blocks/Recommendation/controls/price/index.js +0 -44
  95. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +0 -222
  96. package/dist/extensions/Blocks/Recommendation/services/configService.js +0 -240
  97. package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +0 -233
  98. package/dist/extensions/Blocks/Recommendation/templates/grid/migration.js +0 -251
  99. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +0 -69
  100. package/dist/extensions/Blocks/Recommendation/templates/index.js +0 -12
  101. package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +0 -174
  102. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +0 -73
  103. package/dist/extensions/Blocks/Recommendation/templates/utils.js +0 -122
  104. package/dist/extensions/Blocks/Recommendation/types/nodeConfig.js +0 -6
  105. package/dist/extensions/Blocks/Recommendation/utils/priceFormatter.js +0 -29
  106. package/dist/extensions/Blocks/Recommendation/utils/tagName.js +0 -46
  107. package/dist/src/config/compiler/utils/recommendationCompilerUtils.d.ts +0 -17
  108. package/dist/src/extensions/Blocks/Recommendation/constants/blockIds.d.ts +0 -13
  109. package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +0 -49
  110. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +0 -13
  111. package/dist/src/extensions/Blocks/Recommendation/constants/layout.d.ts +0 -35
  112. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +0 -31
  113. package/dist/src/extensions/Blocks/Recommendation/controls/button/index.d.ts +0 -143
  114. package/dist/src/extensions/Blocks/Recommendation/controls/cardBackground/index.d.ts +0 -31
  115. package/dist/src/extensions/Blocks/Recommendation/controls/image/index.d.ts +0 -35
  116. package/dist/src/extensions/Blocks/Recommendation/controls/layout/index.d.ts +0 -37
  117. package/dist/src/extensions/Blocks/Recommendation/controls/main/algorithm.d.ts +0 -29
  118. package/dist/src/extensions/Blocks/Recommendation/controls/main/currency.d.ts +0 -52
  119. package/dist/src/extensions/Blocks/Recommendation/controls/main/filters.d.ts +0 -22
  120. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +0 -68
  121. package/dist/src/extensions/Blocks/Recommendation/controls/main/locale.d.ts +0 -24
  122. package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +0 -42
  123. package/dist/src/extensions/Blocks/Recommendation/controls/main/shuffle.d.ts +0 -23
  124. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +0 -214
  125. package/dist/src/extensions/Blocks/Recommendation/controls/name/index.d.ts +0 -97
  126. package/dist/src/extensions/Blocks/Recommendation/controls/name/textTrim.d.ts +0 -34
  127. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/index.d.ts +0 -95
  128. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.d.ts +0 -100
  129. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/textAfter.d.ts +0 -15
  130. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/textBefore.d.ts +0 -15
  131. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/index.d.ts +0 -100
  132. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/textAfter.d.ts +0 -15
  133. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/textBefore.d.ts +0 -15
  134. package/dist/src/extensions/Blocks/Recommendation/controls/price/index.d.ts +0 -95
  135. package/dist/src/extensions/Blocks/Recommendation/controls/spacing/index.d.ts +0 -83
  136. package/dist/src/extensions/Blocks/Recommendation/services/configService.d.ts +0 -151
  137. package/dist/src/extensions/Blocks/Recommendation/services/index.d.ts +0 -6
  138. package/dist/src/extensions/Blocks/Recommendation/templates/grid/elementRenderer.d.ts +0 -20
  139. package/dist/src/extensions/Blocks/Recommendation/templates/grid/template.d.ts +0 -33
  140. package/dist/src/extensions/Blocks/Recommendation/templates/index.d.ts +0 -39
  141. package/dist/src/extensions/Blocks/Recommendation/templates/list/elementRenderer.d.ts +0 -8
  142. package/dist/src/extensions/Blocks/Recommendation/templates/list/migration.d.ts +0 -25
  143. package/dist/src/extensions/Blocks/Recommendation/templates/list/template.d.ts +0 -18
  144. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +0 -57
  145. package/dist/src/extensions/Blocks/Recommendation/types/index.d.ts +0 -7
  146. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +0 -160
  147. package/dist/src/extensions/Blocks/Recommendation/utils/priceFormatter.d.ts +0 -33
  148. package/dist/src/extensions/Blocks/Recommendation/utils/stylePreserver.d.ts +0 -113
  149. package/dist/src/extensions/Blocks/Recommendation/utils/tagName.d.ts +0 -77
@@ -1,19 +0,0 @@
1
- import { createImageMarginsControl as m, createImageSizeControl as n } from "../../../controlFactories.js";
2
- import { RecommendationBlockId as o } from "../../constants/blockIds.js";
3
- import { RecommendationControlId as r } from "../../constants/controlIds.js";
4
- import { CONTAINER_SELECTOR as t } from "../../constants/selectors.js";
5
- const e = n(
6
- r.IMAGE_SIZE,
7
- o.IMAGE,
8
- t
9
- ), i = m(
10
- r.IMAGE_MARGINS,
11
- o.IMAGE,
12
- t
13
- ), C = {
14
- size: e,
15
- margins: i
16
- };
17
- export {
18
- C as ImageControls
19
- };
@@ -1,92 +0,0 @@
1
- var c = Object.defineProperty;
2
- var d = (o, e, t) => e in o ? c(o, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : o[e] = t;
3
- var n = (o, e, t) => d(o, typeof e != "symbol" ? e + "" : e, t);
4
- import { ModificationDescription as m } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
- import { CommonControl as h } from "../../../common-control.js";
6
- import { LAYOUT_OPTIONS as g } from "../../constants/layout.js";
7
- import { RecommendationConfigService as r } from "../../services/configService.js";
8
- import { useRecommendationExtensionStore as l } from "../../store/recommendation.js";
9
- import { getCurrentLayout as u, getBlockElement as f, regenerateProductRowsWithStyles as p } from "../main/utils.js";
10
- const L = "recommendation-layout-control", i = {
11
- LAYOUT: "layout"
12
- }, C = {
13
- LAYOUT: "data-layout"
14
- };
15
- class Y extends h {
16
- constructor() {
17
- super(...arguments);
18
- n(this, "store", l());
19
- n(this, "isChangingLayout", !1);
20
- }
21
- getId() {
22
- return L;
23
- }
24
- getTemplate() {
25
- return `
26
- <div class="layout-control-container">
27
- ${this._GuTwoColumns([
28
- this._GuLabel({ text: "Layout Orientation" }),
29
- this._GuRadioButton({
30
- name: i.LAYOUT,
31
- buttons: g
32
- })
33
- ])}
34
- </div>
35
- `;
36
- }
37
- onRender() {
38
- this._setFormValues(), this._listenToFormUpdates();
39
- }
40
- onTemplateNodeUpdated(t) {
41
- super.onTemplateNodeUpdated(t), this._setFormValues();
42
- }
43
- _setFormValues() {
44
- const s = r.getConfig(this.currentNode).layout || u(this.currentNode);
45
- this.api.updateValues({
46
- [i.LAYOUT]: s
47
- });
48
- }
49
- /**
50
- * Handles layout change
51
- * Updates node config, data attribute and regenerates product rows
52
- */
53
- _onLayoutChange(t) {
54
- if (this.isChangingLayout || !this.currentNode || (r.getConfig(this.currentNode).layout || u(this.currentNode)) === t)
55
- return;
56
- const a = f(this.currentNode);
57
- if (a) {
58
- this.isChangingLayout = !0;
59
- try {
60
- r.updateConfig(
61
- this.api,
62
- this.currentNode,
63
- { layout: t },
64
- `Changed layout to ${t}`
65
- ), this.store.patchCurrentBlockConfig({ orientation: t }), this.api.getDocumentModifier().modifyHtml(a).setAttribute(C.LAYOUT, t).apply(new m(`Update layout to ${t}`)), this._regenerateProductRows(t);
66
- } finally {
67
- this.isChangingLayout = !1;
68
- }
69
- }
70
- }
71
- /**
72
- * Regenerates product rows based on the selected layout
73
- * Uses unified style-preserving regeneration to maintain user customizations
74
- * @param layout - The layout to use for regeneration (passed explicitly to avoid stale DOM reads)
75
- */
76
- _regenerateProductRows(t) {
77
- this.currentNode && p({
78
- currentNode: this.currentNode,
79
- documentModifier: this.api.getDocumentModifier(),
80
- layout: t
81
- });
82
- }
83
- _listenToFormUpdates() {
84
- this.api.onValueChanged(i.LAYOUT, (t) => {
85
- this._onLayoutChange(t);
86
- });
87
- }
88
- }
89
- export {
90
- L as LAYOUT_CONTROL_ID,
91
- Y as LayoutControl
92
- };
@@ -1,102 +0,0 @@
1
- var d = Object.defineProperty;
2
- var l = (o, i, t) => i in o ? d(o, i, { enumerable: !0, configurable: !0, writable: !0, value: t }) : o[i] = t;
3
- var a = (o, i, t) => l(o, typeof i != "symbol" ? i + "" : i, t);
4
- import { UEAttr as c } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
- import { CommonControl as h } from "../../../common-control.js";
6
- import { RecommendationConfigService as n } from "../../services/configService.js";
7
- import { useRecommendationExtensionStore as m } from "../../store/recommendation.js";
8
- const u = "recommendation-algorithm-control", e = {
9
- ALGORITHM: "strategy",
10
- PRODUCT_IDS: "productIds"
11
- };
12
- class T extends h {
13
- constructor() {
14
- super(...arguments);
15
- // Store is used ONLY for API-fetched data (algorithms list), not for config
16
- a(this, "store", m());
17
- }
18
- getId() {
19
- return u;
20
- }
21
- getTemplate() {
22
- return `
23
- <div class="algorithm-control-container">
24
- ${this._GuTwoColumns([
25
- this._GuLabel({ text: "Recommendation Algorithm" }),
26
- this._GuSelect({
27
- name: e.ALGORITHM,
28
- placeholder: "Select Recommendation Algorithm",
29
- options: this.store.getActivePredictiveAlgorithms
30
- }),
31
- this._GuLabel({ text: "Product Ids", name: `${e.PRODUCT_IDS}_label` }),
32
- this._GuTextInput({
33
- name: e.PRODUCT_IDS,
34
- placeholder: "Enter Product Ids",
35
- className: "es-180w"
36
- })
37
- ])}
38
- </div>
39
- `;
40
- }
41
- onRender() {
42
- this._initializeSelectItems(), this._setFormValues(), this._listenToFormUpdates();
43
- }
44
- onTemplateNodeUpdated(t) {
45
- super.onTemplateNodeUpdated(t), this._setFormValues();
46
- }
47
- _setFormValues() {
48
- const t = n.getConfig(this.currentNode);
49
- this._setProductIdsVisibility(t.strategy), this.api.updateValues({
50
- [e.ALGORITHM]: t.strategy,
51
- [e.PRODUCT_IDS]: t.productIds.join(",")
52
- });
53
- }
54
- _initializeSelectItems() {
55
- var r;
56
- const t = (r = this.store) == null ? void 0 : r.getActivePredictiveAlgorithms;
57
- if (t != null && t.length)
58
- try {
59
- this.api.setUIEAttribute(
60
- e.ALGORITHM,
61
- c.SELECTPICKER.items,
62
- t
63
- );
64
- } catch (s) {
65
- console.warn("[AlgorithmControl] Failed to set algorithm options:", s);
66
- }
67
- }
68
- _setProductIdsVisibility(t) {
69
- const s = (t ?? n.getConfig(this.currentNode).strategy) === "manualMerchandising";
70
- this.api.setVisibility(e.PRODUCT_IDS, s), this.api.setVisibility(`${e.PRODUCT_IDS}_label`, s);
71
- }
72
- _onAlgorithmChange(t) {
73
- this.currentNode && (n.updateConfig(
74
- this.api,
75
- this.currentNode,
76
- { strategy: t },
77
- `Changed algorithm to ${t}`
78
- ), this.store.patchCurrentBlockConfig({ strategy: t }), this._setProductIdsVisibility(t));
79
- }
80
- _onProductIdsChange(t) {
81
- if (!this.currentNode)
82
- return;
83
- const r = t.split(",").map((s) => s.trim()).filter(Boolean);
84
- n.updateConfig(
85
- this.api,
86
- this.currentNode,
87
- { productIds: r },
88
- "Updated product IDs"
89
- ), this.store.patchCurrentBlockConfig({ productIds: r });
90
- }
91
- _listenToFormUpdates() {
92
- this.api.onValueChanged(e.ALGORITHM, (t) => {
93
- this._onAlgorithmChange(t);
94
- }), this.api.onValueChanged(e.PRODUCT_IDS, (t) => {
95
- this._onProductIdsChange(t);
96
- });
97
- }
98
- }
99
- export {
100
- u as ALGORITHM_CONTROL_ID,
101
- T as AlgorithmControl
102
- };
@@ -1,209 +0,0 @@
1
- var R = Object.defineProperty;
2
- var _ = (s, o, e) => o in s ? R(s, o, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[o] = e;
3
- var c = (s, o, e) => _(s, typeof o != "symbol" ? o + "" : o, e);
4
- import { currencyLocationMaps as l, currencyOperators as i, currencyDecimalCounts as h } from "../../../../../enums/extensions/recommendationBlock.js";
5
- import { UEAttr as m } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
6
- import { CommonControl as d } from "../../../common-control.js";
7
- import { RecommendationConfigService as C } from "../../services/configService.js";
8
- import { useRecommendationExtensionStore as p } from "../../store/recommendation.js";
9
- import { setCurrencyAttributes as S, updatePricesInPlace as E, regenerateProductRowsWithStyles as N } from "./utils.js";
10
- const y = "recommendation-currency-control", t = {
11
- CURRENCY: "currencyCode",
12
- CURRENCY_LOCATION: "currencyAlignment",
13
- CURRENCY_SYMBOL: "currencySymbol",
14
- CURRENCY_THOUSAND_SEPARATOR: "currencyThousandSeparator",
15
- CURRENCY_DECIMAL_SEPARATOR: "currencyDecimalSeparator",
16
- CURRENCY_DECIMAL_COUNT: "currencyDecimalCount"
17
- };
18
- class D extends d {
19
- constructor() {
20
- super(...arguments);
21
- // Store is used ONLY for API-fetched data (currency list), not for config
22
- c(this, "store", p());
23
- c(this, "storeUnsubscription", () => {
24
- });
25
- }
26
- getId() {
27
- return y;
28
- }
29
- getTemplate() {
30
- return `
31
- <div class="currency-control-container">
32
- ${this._GuTwoColumns([
33
- this._GuLabel({ text: "Currency" }),
34
- this._GuSelect({
35
- name: t.CURRENCY,
36
- placeholder: "Select Currency",
37
- options: this.store.currencyList
38
- }),
39
- this._GuLabel({ text: "Currency Location" }),
40
- this._GuSelect({
41
- name: t.CURRENCY_LOCATION,
42
- placeholder: "Select Currency Location",
43
- options: l
44
- }),
45
- this._GuLabel({ text: "Currency Symbol" }),
46
- this._GuTextInput({
47
- name: t.CURRENCY_SYMBOL,
48
- placeholder: "Enter Currency Symbol",
49
- className: "es-180w"
50
- }),
51
- this._GuLabel({ text: "Thousand Separator" }),
52
- this._GuSelect({
53
- name: t.CURRENCY_THOUSAND_SEPARATOR,
54
- placeholder: "Select Thousand Separator",
55
- options: i
56
- }),
57
- this._GuLabel({ text: "Decimal Separator" }),
58
- this._GuSelect({
59
- name: t.CURRENCY_DECIMAL_SEPARATOR,
60
- placeholder: "Select Decimal Separator",
61
- options: i
62
- }),
63
- this._GuLabel({ text: "Decimal Count" }),
64
- this._GuSelect({
65
- name: t.CURRENCY_DECIMAL_COUNT,
66
- placeholder: "Select Decimal Count",
67
- options: h
68
- })
69
- ])}
70
- </div>
71
- `;
72
- }
73
- onRender() {
74
- this._initializeSelectItems(), this._setFormValues(), setTimeout(() => {
75
- this._listenToFormUpdates();
76
- }, 0), this._subscribeToStoreChanges();
77
- }
78
- onTemplateNodeUpdated(e) {
79
- super.onTemplateNodeUpdated(e), this._setFormValues();
80
- }
81
- onDestroy() {
82
- this.storeUnsubscription();
83
- }
84
- _setFormValues() {
85
- const e = C.getConfig(this.currentNode), { currency: r } = e;
86
- this.api.updateValues({
87
- [t.CURRENCY]: `price.${r.code}`,
88
- [t.CURRENCY_LOCATION]: r.alignment === "before" ? "0" : "1",
89
- [t.CURRENCY_SYMBOL]: r.symbol,
90
- [t.CURRENCY_THOUSAND_SEPARATOR]: r.thousandSeparator,
91
- [t.CURRENCY_DECIMAL_SEPARATOR]: r.decimalSeparator,
92
- [t.CURRENCY_DECIMAL_COUNT]: r.decimalCount.toString()
93
- });
94
- }
95
- _initializeSelectItems() {
96
- const { store: e } = this, r = {
97
- [t.CURRENCY]: e.currencyList,
98
- [t.CURRENCY_LOCATION]: l,
99
- [t.CURRENCY_THOUSAND_SEPARATOR]: i,
100
- [t.CURRENCY_DECIMAL_SEPARATOR]: i,
101
- [t.CURRENCY_DECIMAL_COUNT]: h
102
- };
103
- Object.entries(r).forEach(([u, n]) => {
104
- this.api.setUIEAttribute(u, m.SELECTPICKER.items, n);
105
- });
106
- }
107
- /**
108
- * Applies currency updates to node config, HTML attributes, Pinia store, and DOM.
109
- * @param updates - Partial currency config to merge
110
- * @param triggerRefetch - Whether to trigger a product API refetch.
111
- * true for currency code changes (different prices from API),
112
- * false for display-only changes (symbol, separators, alignment, decimal count).
113
- */
114
- _updateCurrency(e, r = !1) {
115
- if (!this.currentNode)
116
- return;
117
- const n = { ...C.getConfig(this.currentNode).currency, ...e };
118
- C.updateConfig(
119
- this.api,
120
- this.currentNode,
121
- { currency: n },
122
- "Updated currency settings"
123
- );
124
- const a = this.api.getDocumentModifier();
125
- S({
126
- currentNode: this.currentNode,
127
- documentModifier: a,
128
- currency: n
129
- }), this.store.patchCurrentBlockConfig({
130
- currencySettings: {
131
- name: n.code,
132
- value: n.code,
133
- symbol: n.symbol,
134
- alignment: n.alignment === "before" ? "0" : "1",
135
- decimalCount: n.decimalCount.toString(),
136
- decimalSeparator: n.decimalSeparator,
137
- thousandSeparator: n.thousandSeparator
138
- }
139
- }, { triggerRefetch: r }), E({
140
- currentNode: this.currentNode,
141
- documentModifier: a
142
- }) || N({
143
- currentNode: this.currentNode,
144
- documentModifier: a
145
- });
146
- }
147
- _onCurrencyChange(e) {
148
- const [, r] = e.includes(".") ? e.split(".") : [null, e];
149
- this._updateCurrency({
150
- code: r,
151
- symbol: r
152
- }, !0), this.api.updateValues({
153
- [t.CURRENCY_SYMBOL]: r
154
- });
155
- }
156
- _onCurrencyLocationChange(e) {
157
- this._updateCurrency({
158
- alignment: e === "0" ? "before" : "after"
159
- });
160
- }
161
- _onCurrencySymbolChange(e) {
162
- this._updateCurrency({ symbol: e });
163
- }
164
- _onThousandSeparatorChange(e) {
165
- this._updateCurrency({
166
- thousandSeparator: e
167
- });
168
- }
169
- _onDecimalSeparatorChange(e) {
170
- this._updateCurrency({
171
- decimalSeparator: e
172
- });
173
- }
174
- _onDecimalCountChange(e) {
175
- this._updateCurrency({
176
- decimalCount: parseInt(e) || 2
177
- });
178
- }
179
- _listenToFormUpdates() {
180
- this.api.onValueChanged(t.CURRENCY, (e) => {
181
- this._onCurrencyChange(e);
182
- }), this.api.onValueChanged(t.CURRENCY_LOCATION, (e) => {
183
- this._onCurrencyLocationChange(e);
184
- }), this.api.onValueChanged(t.CURRENCY_SYMBOL, (e) => {
185
- this._onCurrencySymbolChange(e);
186
- }), this.api.onValueChanged(t.CURRENCY_THOUSAND_SEPARATOR, (e) => {
187
- this._onThousandSeparatorChange(e);
188
- }), this.api.onValueChanged(t.CURRENCY_DECIMAL_SEPARATOR, (e) => {
189
- this._onDecimalSeparatorChange(e);
190
- }), this.api.onValueChanged(t.CURRENCY_DECIMAL_COUNT, (e) => {
191
- this._onDecimalCountChange(e);
192
- });
193
- }
194
- /**
195
- * Subscribe to store changes to update currency selects when API data arrives
196
- * This handles the case where the control renders before currency list is loaded
197
- */
198
- _subscribeToStoreChanges() {
199
- let e = this.store.currencyList.length;
200
- this.storeUnsubscription = this.store.$subscribe(() => {
201
- const r = this.store.currencyList.length;
202
- r > 0 && r !== e && (e = r, this._initializeSelectItems(), this._setFormValues());
203
- });
204
- }
205
- }
206
- export {
207
- y as CURRENCY_CONTROL_ID,
208
- D as CurrencyControl
209
- };
@@ -1,52 +0,0 @@
1
- var n = Object.defineProperty;
2
- var o = (i, e, t) => e in i ? n(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t;
3
- var r = (i, e, t) => o(i, typeof e != "symbol" ? e + "" : e, t);
4
- import { CommonControl as s } from "../../../common-control.js";
5
- import { useRecommendationExtensionStore as l } from "../../store/recommendation.js";
6
- const d = "recommendation-filters-control", a = {
7
- FILTERS: "filterStatus"
8
- };
9
- class h extends s {
10
- constructor() {
11
- super(...arguments);
12
- r(this, "store", l());
13
- r(this, "addFilterListener", () => {
14
- });
15
- r(this, "addFilterButton", null);
16
- }
17
- getId() {
18
- return d;
19
- }
20
- getTemplate() {
21
- return `
22
- <div class="filters-control-container">
23
- ${this._GuTwoColumns([
24
- this._GuLabel({ text: "Filters" }),
25
- this._GuButton({
26
- name: a.FILTERS,
27
- label: "Add Filter",
28
- id: "guido__btn-add-filter"
29
- })
30
- ])}
31
- </div>
32
- `;
33
- }
34
- onRender() {
35
- this._setupButtonListener();
36
- }
37
- onDestroy() {
38
- var t;
39
- (t = this.addFilterButton) == null || t.removeEventListener("click", this.addFilterListener);
40
- }
41
- _onFilterSelectClick() {
42
- this.store.openFilterDrawer();
43
- }
44
- _setupButtonListener() {
45
- var t;
46
- this.addFilterListener = this._onFilterSelectClick.bind(this), this.addFilterButton = this.getContainer().querySelector("#guido__btn-add-filter"), (t = this.addFilterButton) == null || t.addEventListener("click", this.addFilterListener);
47
- }
48
- }
49
- export {
50
- d as FILTERS_CONTROL_ID,
51
- h as FiltersControl
52
- };
@@ -1,217 +0,0 @@
1
- var d = Object.defineProperty;
2
- var m = (l, n, t) => n in l ? d(l, n, { enumerable: !0, configurable: !0, writable: !0, value: t }) : l[n] = t;
3
- var i = (l, n, t) => m(l, typeof n != "symbol" ? n + "" : n, t);
4
- import { CommonControl as h } from "../../../common-control.js";
5
- import { useRecommendationExtensionStore as C } from "../../store/recommendation.js";
6
- import { AlgorithmControl as f } from "./algorithm.js";
7
- import { ALGORITHM_CONTROL_ID as M } from "./algorithm.js";
8
- import { CurrencyControl as p } from "./currency.js";
9
- import { CURRENCY_CONTROL_ID as W } from "./currency.js";
10
- import { FiltersControl as g } from "./filters.js";
11
- import { FILTERS_CONTROL_ID as H } from "./filters.js";
12
- import { LocaleControl as R } from "./locale.js";
13
- import { LOCALE_CONTROL_ID as j } from "./locale.js";
14
- import { ProductLayoutControl as _ } from "./productLayout.js";
15
- import { PRODUCT_LAYOUT_CONTROL_ID as K } from "./productLayout.js";
16
- import { ShuffleControl as N } from "./shuffle.js";
17
- import { SHUFFLE_CONTROL_ID as J } from "./shuffle.js";
18
- import { regenerateProductRowsWithStyles as P, getBlockElement as b, updateProductContentInPlace as y } from "./utils.js";
19
- import { formatProductPrice as X, getCardComposition as Z, getCurrentLayout as tt, reapplySpacing as et, regenerateProductRows as ot, setCurrencyAttributes as rt, updatePricesInPlace as it, updateSingleProductContent as nt } from "./utils.js";
20
- import { useDebounceFn as c } from "../../../../../node_modules/@vueuse/shared/index.js";
21
- const T = "recommendation-id", L = "ui-elements-recommendation-block";
22
- class x extends h {
23
- constructor() {
24
- super(...arguments);
25
- i(this, "store", C());
26
- i(this, "storeUnsubscription", () => {
27
- });
28
- // Track if initial data has been fetched per block ID to avoid redundant API calls
29
- i(this, "initializedBlocks", /* @__PURE__ */ new Map());
30
- // Sub-control instances for lifecycle management
31
- i(this, "algorithmControl", null);
32
- i(this, "localeControl", null);
33
- i(this, "currencyControl", null);
34
- i(this, "productLayoutControl", null);
35
- i(this, "filtersControl", null);
36
- i(this, "shuffleControl", null);
37
- /**
38
- * Debounced product fetch to prevent rapid API calls during config changes
39
- */
40
- i(this, "_debouncedFetchProducts", c(() => {
41
- this.store.fetchRecommendationProducts();
42
- }, 500));
43
- /**
44
- * Debounced regeneration when products arrive from API
45
- * Tries in-place update first to preserve styles, falls back to full regeneration
46
- */
47
- i(this, "_debouncedRegenerateWithProducts", c(() => {
48
- const t = this.store.recommendationProducts;
49
- if (!this.currentNode || !this.api)
50
- return;
51
- const e = this.api.getDocumentModifier();
52
- y({
53
- currentNode: this.currentNode,
54
- documentModifier: e,
55
- products: t
56
- }) || this._regenerateWithProducts(t);
57
- }, 100));
58
- }
59
- getId() {
60
- return L;
61
- }
62
- getTemplate() {
63
- return this.algorithmControl = new f(), this.localeControl = new R(), this.currencyControl = new p(), this.productLayoutControl = new _(), this.filtersControl = new g(), this.shuffleControl = new N(), `
64
- <div class="recommendation-controls-container">
65
- ${this.algorithmControl.getTemplate()}
66
- ${this.localeControl.getTemplate()}
67
- ${this.currencyControl.getTemplate()}
68
- ${this.filtersControl.getTemplate()}
69
- ${this.productLayoutControl.getTemplate()}
70
- ${this.shuffleControl.getTemplate()}
71
- </div>
72
- `;
73
- }
74
- async onRender() {
75
- const t = this._getRecommendationIdFromNode(this.currentNode) ?? this.store.currentRecommendationId;
76
- if (t !== null && this.store.setCurrentBlock(t), this._listenStateUpdates(), t !== null && this.initializedBlocks.get(t)) {
77
- this._initializeSubControls();
78
- return;
79
- }
80
- await this._fetchBlockData(t), this._initializeSubControls();
81
- }
82
- /**
83
- * Immediately regenerate products with styles (no debounce)
84
- * Used for initial load after fetch completes
85
- */
86
- _regenerateWithProducts(t) {
87
- if (!this.currentNode || !this.api) {
88
- console.warn("[Recommendation] Cannot regenerate - missing currentNode or api");
89
- return;
90
- }
91
- P({
92
- currentNode: this.currentNode,
93
- documentModifier: this.api.getDocumentModifier(),
94
- products: t
95
- });
96
- }
97
- onTemplateNodeUpdated(t) {
98
- super.onTemplateNodeUpdated(t);
99
- const e = this._getRecommendationIdFromNode(t);
100
- e !== null && e !== this.store.currentRecommendationId && this.store.setCurrentBlock(e), e !== null && !this.initializedBlocks.get(e) && this._fetchBlockData(e), [
101
- this.algorithmControl,
102
- this.localeControl,
103
- this.currencyControl,
104
- this.productLayoutControl,
105
- this.filtersControl,
106
- this.shuffleControl
107
- ].forEach((r) => {
108
- var s;
109
- r != null && r.api && (r.currentNode = t, (s = r.onTemplateNodeUpdated) == null || s.call(r, t));
110
- });
111
- }
112
- onDestroy() {
113
- this.storeUnsubscription(), [
114
- this.algorithmControl,
115
- this.localeControl,
116
- this.currencyControl,
117
- this.productLayoutControl,
118
- this.filtersControl,
119
- this.shuffleControl
120
- ].forEach((e) => {
121
- var o;
122
- return (o = e == null ? void 0 : e.onDestroy) == null ? void 0 : o.call(e);
123
- });
124
- }
125
- /**
126
- * Initialize all sub-controls with the shared API context
127
- * Each sub-control manages its own form values and event listeners
128
- */
129
- _initializeSubControls() {
130
- [
131
- this.algorithmControl,
132
- this.localeControl,
133
- this.currencyControl,
134
- this.productLayoutControl,
135
- this.filtersControl,
136
- this.shuffleControl
137
- ].forEach((e) => {
138
- var o;
139
- e && (e.api = this.api, e.currentNode = this.currentNode, (o = e.onRender) == null || o.call(e));
140
- });
141
- }
142
- /**
143
- * Fetches initial data for a block (filters, algorithms, products).
144
- * Shared by onRender() and onTemplateNodeUpdated() to avoid duplication.
145
- * Marks the block as initialized to prevent redundant fetches on re-selection.
146
- */
147
- async _fetchBlockData(t) {
148
- t !== null && this.initializedBlocks.set(t, !0), (await Promise.allSettled([
149
- this.store.fetchRecommendationFilters(),
150
- this.store.fetchRecommendationCreateData(),
151
- this.store.fetchRecommendationProducts()
152
- ])).forEach((o, r) => {
153
- o.status === "rejected" && console.warn(`Recommendation block: ${[
154
- "fetchRecommendationFilters",
155
- "fetchRecommendationCreateData",
156
- "fetchRecommendationProducts"
157
- ][r]} failed`, o.reason);
158
- });
159
- }
160
- /**
161
- * Reads the recommendation-id attribute from the block element within the node
162
- */
163
- _getRecommendationIdFromNode(t) {
164
- const e = b(t);
165
- if (!e || !("getAttribute" in e))
166
- return null;
167
- const o = e.getAttribute(T);
168
- if (!o)
169
- return null;
170
- const r = parseInt(o);
171
- return Number.isNaN(r) ? null : r;
172
- }
173
- /**
174
- * Listen to store changes that require product refresh or regeneration.
175
- *
176
- * Uses configVersion counter (incremented only by patchCurrentBlockConfig)
177
- * to distinguish user-initiated config changes from internal mutations
178
- * (e.g., fetchRecommendationCreateData setting preferred currency).
179
- */
180
- _listenStateUpdates() {
181
- const { store: t } = this;
182
- let e = t.recommendationProducts, o = t.$state.configVersion;
183
- this.storeUnsubscription = t.$subscribe(() => {
184
- const r = t.$state.configVersion;
185
- r !== o && (o = r, this._debouncedFetchProducts());
186
- const s = t.recommendationProducts, a = s !== e, u = Array.isArray(s) && s.length > 0;
187
- a && u && (e = s, this._debouncedRegenerateWithProducts());
188
- });
189
- }
190
- }
191
- export {
192
- M as ALGORITHM_CONTROL_ID,
193
- f as AlgorithmControl,
194
- L as CONTROL_BLOCK_ID,
195
- W as CURRENCY_CONTROL_ID,
196
- p as CurrencyControl,
197
- H as FILTERS_CONTROL_ID,
198
- g as FiltersControl,
199
- j as LOCALE_CONTROL_ID,
200
- R as LocaleControl,
201
- K as PRODUCT_LAYOUT_CONTROL_ID,
202
- _ as ProductLayoutControl,
203
- x as RecommendationBlockControl,
204
- J as SHUFFLE_CONTROL_ID,
205
- N as ShuffleControl,
206
- X as formatProductPrice,
207
- b as getBlockElement,
208
- Z as getCardComposition,
209
- tt as getCurrentLayout,
210
- et as reapplySpacing,
211
- ot as regenerateProductRows,
212
- P as regenerateProductRowsWithStyles,
213
- rt as setCurrencyAttributes,
214
- it as updatePricesInPlace,
215
- y as updateProductContentInPlace,
216
- nt as updateSingleProductContent
217
- };