@useinsider/guido 2.1.0-beta.f30d59a → 2.1.0-beta.f869a80

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 (148) hide show
  1. package/dist/@types/config/schemas.js +1 -1
  2. package/dist/components/organisms/extensions/recommendation/FilterItem.vue.js +11 -13
  3. package/dist/components/organisms/extensions/recommendation/FilterItem.vue2.js +54 -23
  4. package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue.js +7 -5
  5. package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue2.js +37 -23
  6. package/dist/components/organisms/extensions/recommendation/Filters.vue.js +11 -11
  7. package/dist/components/organisms/extensions/recommendation/Filters.vue2.js +48 -36
  8. package/dist/components/organisms/extensions/recommendation/LogicAdapter.vue2.js +11 -9
  9. package/dist/composables/useHtmlValidator.js +114 -104
  10. package/dist/composables/useRecommendation.js +54 -21
  11. package/dist/config/compiler/recommendationCompilerRules.js +45 -39
  12. package/dist/config/compiler/utils/recommendationCompilerUtils.js +121 -0
  13. package/dist/config/migrator/itemsBlockMigrator.js +101 -97
  14. package/dist/config/migrator/recommendationMigrator.js +2 -2
  15. package/dist/enums/extensions/recommendationBlock.js +1 -1
  16. package/dist/enums/recommendation.js +16 -15
  17. package/dist/extensions/Blocks/Recommendation/block.js +133 -9
  18. package/dist/extensions/Blocks/Recommendation/constants/blockIds.js +4 -0
  19. package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +4 -0
  20. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +66 -0
  21. package/dist/extensions/Blocks/Recommendation/constants/layout.js +22 -0
  22. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +21 -0
  23. package/dist/extensions/Blocks/Recommendation/controls/button/index.js +64 -0
  24. package/dist/extensions/Blocks/Recommendation/controls/cardBackground/index.js +80 -0
  25. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +232 -0
  26. package/dist/extensions/Blocks/Recommendation/controls/image/index.js +19 -0
  27. package/dist/extensions/Blocks/Recommendation/controls/layout/index.js +92 -0
  28. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +102 -0
  29. package/dist/extensions/Blocks/Recommendation/controls/main/currency.js +209 -0
  30. package/dist/extensions/Blocks/Recommendation/controls/main/filters.js +52 -0
  31. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +269 -0
  32. package/dist/extensions/Blocks/Recommendation/controls/main/locale.js +70 -0
  33. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +160 -0
  34. package/dist/extensions/Blocks/Recommendation/controls/main/shuffle.js +67 -0
  35. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +307 -0
  36. package/dist/extensions/Blocks/Recommendation/controls/mobileLayout/cssRules.js +21 -0
  37. package/dist/extensions/Blocks/Recommendation/controls/name/index.js +46 -0
  38. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +108 -0
  39. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/index.js +44 -0
  40. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.js +48 -0
  41. package/dist/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextAfterControl.js → omnibusDiscount/textAfter.js} +16 -14
  42. package/dist/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextBeforeControl.js → omnibusDiscount/textBefore.js} +16 -14
  43. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/index.js +48 -0
  44. package/dist/extensions/Blocks/Recommendation/controls/{omnibusPriceTextAfterControl.js → omnibusPrice/textAfter.js} +16 -14
  45. package/dist/extensions/Blocks/Recommendation/controls/{omnibusPriceTextBeforeControl.js → omnibusPrice/textBefore.js} +14 -12
  46. package/dist/extensions/Blocks/Recommendation/controls/price/index.js +44 -0
  47. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +222 -0
  48. package/dist/extensions/Blocks/Recommendation/extension.js +40 -17
  49. package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +19 -3
  50. package/dist/extensions/Blocks/Recommendation/recommendation.css.js +13 -4
  51. package/dist/extensions/Blocks/Recommendation/services/configService.js +240 -0
  52. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +21 -10
  53. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +311 -218
  54. package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +228 -0
  55. package/dist/extensions/Blocks/Recommendation/templates/grid/migration.js +251 -0
  56. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +66 -0
  57. package/dist/extensions/Blocks/Recommendation/templates/index.js +12 -0
  58. package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +169 -0
  59. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +73 -0
  60. package/dist/extensions/Blocks/Recommendation/templates/utils.js +134 -0
  61. package/dist/extensions/Blocks/Recommendation/types/nodeConfig.js +6 -0
  62. package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +12 -12
  63. package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +26 -15
  64. package/dist/extensions/Blocks/Recommendation/utils/priceFormatter.js +29 -0
  65. package/dist/extensions/Blocks/Recommendation/utils/tagName.js +46 -0
  66. package/dist/extensions/Blocks/Recommendation/validation/filterSchema.js +29 -0
  67. package/dist/extensions/Blocks/controlFactories.js +125 -93
  68. package/dist/guido.css +1 -1
  69. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +242 -186
  70. package/dist/services/recommendationApi.js +11 -8
  71. package/dist/services/stripoApi.js +20 -17
  72. package/dist/services/templateLibraryApi.js +16 -13
  73. package/dist/src/components/organisms/extensions/recommendation/FilterItem.vue.d.ts +1 -0
  74. package/dist/src/components/organisms/extensions/recommendation/Filters.vue.d.ts +17 -1
  75. package/dist/src/components/wrappers/WpDrawer.vue.d.ts +1 -1
  76. package/dist/src/composables/useRecommendation.d.ts +1 -0
  77. package/dist/src/config/compiler/utils/recommendationCompilerUtils.d.ts +17 -0
  78. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +67 -0
  79. package/dist/src/extensions/Blocks/Recommendation/constants/blockIds.d.ts +13 -0
  80. package/dist/src/extensions/Blocks/Recommendation/{constants.d.ts → constants/controlIds.d.ts} +0 -24
  81. package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +49 -0
  82. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +13 -0
  83. package/dist/src/extensions/Blocks/Recommendation/constants/layout.d.ts +41 -0
  84. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +35 -0
  85. package/dist/src/extensions/Blocks/Recommendation/controls/button/index.d.ts +143 -0
  86. package/dist/src/extensions/Blocks/Recommendation/controls/cardBackground/index.d.ts +31 -0
  87. package/dist/src/extensions/Blocks/Recommendation/{cardCompositionControl.d.ts → controls/cardComposition/index.d.ts} +23 -3
  88. package/dist/src/extensions/Blocks/Recommendation/controls/image/index.d.ts +35 -0
  89. package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +21 -589
  90. package/dist/src/extensions/Blocks/Recommendation/controls/layout/index.d.ts +37 -0
  91. package/dist/src/extensions/Blocks/Recommendation/controls/main/algorithm.d.ts +29 -0
  92. package/dist/src/extensions/Blocks/Recommendation/controls/main/currency.d.ts +52 -0
  93. package/dist/src/extensions/Blocks/Recommendation/controls/main/filters.d.ts +22 -0
  94. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +84 -0
  95. package/dist/src/extensions/Blocks/Recommendation/controls/main/locale.d.ts +24 -0
  96. package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +60 -0
  97. package/dist/src/extensions/Blocks/Recommendation/controls/main/shuffle.d.ts +23 -0
  98. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +221 -0
  99. package/dist/src/extensions/Blocks/Recommendation/controls/mobileLayout/cssRules.d.ts +29 -0
  100. package/dist/src/extensions/Blocks/Recommendation/controls/name/index.d.ts +97 -0
  101. package/dist/src/extensions/Blocks/Recommendation/controls/name/textTrim.d.ts +34 -0
  102. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/index.d.ts +95 -0
  103. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.d.ts +100 -0
  104. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/textAfter.d.ts +15 -0
  105. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/textBefore.d.ts +15 -0
  106. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/index.d.ts +100 -0
  107. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/textAfter.d.ts +15 -0
  108. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/textBefore.d.ts +15 -0
  109. package/dist/src/extensions/Blocks/Recommendation/controls/price/index.d.ts +95 -0
  110. package/dist/src/extensions/Blocks/Recommendation/controls/spacing/index.d.ts +83 -0
  111. package/dist/src/extensions/Blocks/Recommendation/extension.d.ts +9 -0
  112. package/dist/src/extensions/Blocks/Recommendation/services/configService.d.ts +151 -0
  113. package/dist/src/extensions/Blocks/Recommendation/services/index.d.ts +6 -0
  114. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +154 -468
  115. package/dist/src/extensions/Blocks/Recommendation/templates/grid/elementRenderer.d.ts +20 -0
  116. package/dist/src/extensions/Blocks/Recommendation/templates/{migrationTemplate.d.ts → grid/migration.d.ts} +11 -4
  117. package/dist/src/extensions/Blocks/Recommendation/templates/grid/template.d.ts +33 -0
  118. package/dist/src/extensions/Blocks/Recommendation/templates/index.d.ts +41 -0
  119. package/dist/src/extensions/Blocks/Recommendation/templates/list/elementRenderer.d.ts +8 -0
  120. package/dist/src/extensions/Blocks/Recommendation/templates/list/migration.d.ts +25 -0
  121. package/dist/src/extensions/Blocks/Recommendation/templates/list/template.d.ts +18 -0
  122. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +66 -0
  123. package/dist/src/extensions/Blocks/Recommendation/types/index.d.ts +7 -0
  124. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +166 -0
  125. package/dist/src/extensions/Blocks/Recommendation/utils/priceFormatter.d.ts +33 -0
  126. package/dist/src/extensions/Blocks/Recommendation/utils/stylePreserver.d.ts +113 -0
  127. package/dist/src/extensions/Blocks/Recommendation/utils/tagName.d.ts +77 -0
  128. package/dist/src/extensions/Blocks/Recommendation/validation/filterSchema.d.ts +15 -0
  129. package/dist/static/styles/customEditorStyle.css.js +35 -11
  130. package/dist/static/templates/empty/index.html.js +74 -0
  131. package/dist/static/templates/empty/style.css.js +779 -0
  132. package/dist/utils/pairProductVariables.js +57 -56
  133. package/dist/utils/templatePreparation.js +15 -14
  134. package/package.json +1 -1
  135. package/dist/extensions/Blocks/Recommendation/cardCompositionControl.js +0 -187
  136. package/dist/extensions/Blocks/Recommendation/constants.js +0 -13
  137. package/dist/extensions/Blocks/Recommendation/control.js +0 -336
  138. package/dist/extensions/Blocks/Recommendation/controls/cardBackgroundColorControl.js +0 -68
  139. package/dist/extensions/Blocks/Recommendation/controls/index.js +0 -245
  140. package/dist/extensions/Blocks/Recommendation/controls/nameTextTrimControl.js +0 -74
  141. package/dist/extensions/Blocks/Recommendation/controls/spacingControl.js +0 -188
  142. package/dist/extensions/Blocks/Recommendation/templates/blockTemplate.js +0 -181
  143. package/dist/extensions/Blocks/Recommendation/templates/migrationTemplate.js +0 -189
  144. package/dist/extensions/Blocks/Recommendation/templates/templateUtils.js +0 -209
  145. package/dist/src/extensions/Blocks/Recommendation/control.d.ts +0 -38
  146. package/dist/src/extensions/Blocks/Recommendation/controls/nameTextTrimControl.d.ts +0 -16
  147. package/dist/src/extensions/Blocks/Recommendation/templates/blockTemplate.d.ts +0 -16
  148. package/dist/src/extensions/Blocks/Recommendation/templates/templateUtils.d.ts +0 -52
@@ -0,0 +1,209 @@
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
+ };
@@ -0,0 +1,52 @@
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
+ };
@@ -0,0 +1,269 @@
1
+ var m = Object.defineProperty;
2
+ var h = (c, s, t) => s in c ? m(c, s, { enumerable: !0, configurable: !0, writable: !0, value: t }) : c[s] = t;
3
+ var n = (c, s, t) => h(c, typeof s != "symbol" ? s + "" : s, t);
4
+ import { CommonControl as f } from "../../../common-control.js";
5
+ import { RecommendationConfigService as l } from "../../services/configService.js";
6
+ import { useRecommendationExtensionStore as C } from "../../store/recommendation.js";
7
+ import { AlgorithmControl as p } from "./algorithm.js";
8
+ import { ALGORITHM_CONTROL_ID as W } from "./algorithm.js";
9
+ import { CurrencyControl as g } from "./currency.js";
10
+ import { CURRENCY_CONTROL_ID as H } from "./currency.js";
11
+ import { FiltersControl as R } from "./filters.js";
12
+ import { FILTERS_CONTROL_ID as j } from "./filters.js";
13
+ import { LocaleControl as N } from "./locale.js";
14
+ import { LOCALE_CONTROL_ID as K } from "./locale.js";
15
+ import { ProductLayoutControl as y } from "./productLayout.js";
16
+ import { PRODUCT_LAYOUT_CONTROL_ID as J } from "./productLayout.js";
17
+ import { ShuffleControl as _ } from "./shuffle.js";
18
+ import { SHUFFLE_CONTROL_ID as X } from "./shuffle.js";
19
+ import { regenerateProductRowsWithStyles as b, getBlockElement as I, updateProductContentInPlace as P } from "./utils.js";
20
+ import { formatProductPrice as tt, getCardComposition as et, getCurrentLayout as ot, reapplySpacing as rt, regenerateMobileProductRows as it, regenerateProductRows as nt, setCurrencyAttributes as st, updatePricesInPlace as ct, updateSingleProductContent as at } from "./utils.js";
21
+ import { useDebounceFn as u } from "../../../../../node_modules/@vueuse/shared/index.js";
22
+ const T = "recommendation-id", S = "ui-elements-recommendation-block";
23
+ class z extends f {
24
+ constructor() {
25
+ super(...arguments);
26
+ n(this, "store", C());
27
+ n(this, "storeUnsubscription", () => {
28
+ });
29
+ // Sub-control instances for lifecycle management
30
+ n(this, "algorithmControl", null);
31
+ n(this, "localeControl", null);
32
+ n(this, "currencyControl", null);
33
+ n(this, "productLayoutControl", null);
34
+ n(this, "filtersControl", null);
35
+ n(this, "shuffleControl", null);
36
+ /**
37
+ * Debounced product fetch to prevent rapid API calls during config changes
38
+ */
39
+ n(this, "_debouncedFetchProducts", u(() => {
40
+ this.store.fetchRecommendationProducts();
41
+ }, 500));
42
+ /**
43
+ * Debounced regeneration when products arrive from API
44
+ * Tries in-place update first to preserve styles, falls back to full regeneration
45
+ */
46
+ n(this, "_debouncedRegenerateWithProducts", u(() => {
47
+ const t = this.store.recommendationProducts;
48
+ if (!this.currentNode || !this.api)
49
+ return;
50
+ const e = this.api.getDocumentModifier();
51
+ P({
52
+ currentNode: this.currentNode,
53
+ documentModifier: e,
54
+ products: t
55
+ }) || this._regenerateWithProducts(t);
56
+ }, 100));
57
+ }
58
+ getId() {
59
+ return S;
60
+ }
61
+ getTemplate() {
62
+ return this.algorithmControl = new p(), this.localeControl = new N(), this.currencyControl = new g(), this.productLayoutControl = new y(), this.filtersControl = new R(), this.shuffleControl = new _(), `
63
+ <div class="recommendation-controls-container">
64
+ ${this.algorithmControl.getTemplate()}
65
+ ${this.localeControl.getTemplate()}
66
+ ${this.currencyControl.getTemplate()}
67
+ ${this.filtersControl.getTemplate()}
68
+ ${this.productLayoutControl.getTemplate()}
69
+ ${this.shuffleControl.getTemplate()}
70
+ </div>
71
+ `;
72
+ }
73
+ async onRender() {
74
+ var e;
75
+ const t = this._getRecommendationIdFromNode(this.currentNode) ?? this.store.currentRecommendationId;
76
+ if (t !== null && this.store.setCurrentBlock(t), this._listenStateUpdates(), t !== null && ((e = this.store.blockStates[t]) != null && e.isInitialized)) {
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
+ b({
92
+ currentNode: this.currentNode,
93
+ documentModifier: this.api.getDocumentModifier(),
94
+ products: t
95
+ });
96
+ }
97
+ onTemplateNodeUpdated(t) {
98
+ var r;
99
+ super.onTemplateNodeUpdated(t);
100
+ const e = this._getRecommendationIdFromNode(t);
101
+ e !== null && e !== this.store.currentRecommendationId && this.store.setCurrentBlock(e), this._syncNodeConfigToStore(), e !== null && !((r = this.store.blockStates[e]) != null && r.isInitialized) && this._fetchBlockData(e), [
102
+ this.algorithmControl,
103
+ this.localeControl,
104
+ this.currencyControl,
105
+ this.productLayoutControl,
106
+ this.filtersControl,
107
+ this.shuffleControl
108
+ ].forEach((i) => {
109
+ var a;
110
+ i != null && i.api && (i.currentNode = t, (a = i.onTemplateNodeUpdated) == null || a.call(i, t));
111
+ });
112
+ }
113
+ onDestroy() {
114
+ this.storeUnsubscription(), [
115
+ this.algorithmControl,
116
+ this.localeControl,
117
+ this.currencyControl,
118
+ this.productLayoutControl,
119
+ this.filtersControl,
120
+ this.shuffleControl
121
+ ].forEach((e) => {
122
+ var o;
123
+ return (o = e == null ? void 0 : e.onDestroy) == null ? void 0 : o.call(e);
124
+ });
125
+ }
126
+ /**
127
+ * Initialize all sub-controls with the shared API context
128
+ * Each sub-control manages its own form values and event listeners
129
+ */
130
+ _initializeSubControls() {
131
+ [
132
+ this.algorithmControl,
133
+ this.localeControl,
134
+ this.currencyControl,
135
+ this.productLayoutControl,
136
+ this.filtersControl,
137
+ this.shuffleControl
138
+ ].forEach((e) => {
139
+ var o;
140
+ e && (e.api = this.api, e.currentNode = this.currentNode, (o = e.onRender) == null || o.call(e));
141
+ });
142
+ }
143
+ /**
144
+ * Syncs persisted node config into the Pinia store's block state.
145
+ *
146
+ * setCurrentBlock() creates a default entry (USD, en_US, mostPopular).
147
+ * For saved templates, the real config lives in the node (e.g., TRY, tr_TR).
148
+ * This method reads it and patches the store so fetchRecommendationProducts()
149
+ * uses the correct values.
150
+ *
151
+ * Uses triggerRefetch: false because the fetch hasn't happened yet —
152
+ * values are being prepared for the upcoming initial fetch.
153
+ */
154
+ _syncNodeConfigToStore() {
155
+ var r;
156
+ const t = l.getConfig(this.currentNode), e = this.store.currentRecommendationId, o = e !== null && ((r = this.store.blockStates[e]) == null ? void 0 : r.isInitialized);
157
+ this.store.patchCurrentBlockConfig({
158
+ strategy: t.strategy,
159
+ language: t.language,
160
+ size: t.size,
161
+ productIds: t.productIds,
162
+ // Only sync filters from node config during initial load.
163
+ // After initialization, the Pinia store is the source of truth
164
+ // for filters (edited via the filter drawer).
165
+ ...o ? {} : { filters: t.filters },
166
+ shuffleProducts: t.shuffleProducts,
167
+ currencySettings: {
168
+ name: t.currency.code,
169
+ value: t.currency.code,
170
+ symbol: t.currency.symbol,
171
+ alignment: t.currency.alignment === "before" ? "0" : "1",
172
+ decimalCount: t.currency.decimalCount.toString(),
173
+ decimalSeparator: t.currency.decimalSeparator,
174
+ thousandSeparator: t.currency.thousandSeparator
175
+ }
176
+ }, { triggerRefetch: !1 });
177
+ }
178
+ /**
179
+ * Fetches initial data for a block (filters, algorithms, products).
180
+ * Shared by onRender() and onTemplateNodeUpdated() to avoid duplication.
181
+ * Marks the block as initialized to prevent redundant fetches on re-selection.
182
+ */
183
+ async _fetchBlockData(t) {
184
+ t !== null && this.store.markBlockInitialized(t), (await Promise.allSettled([
185
+ this.store.fetchRecommendationFilters(),
186
+ this.store.fetchRecommendationCreateData(),
187
+ this.store.fetchRecommendationProducts()
188
+ ])).forEach((o, r) => {
189
+ o.status === "rejected" && console.warn(`Recommendation block: ${[
190
+ "fetchRecommendationFilters",
191
+ "fetchRecommendationCreateData",
192
+ "fetchRecommendationProducts"
193
+ ][r]} failed`, o.reason);
194
+ });
195
+ }
196
+ /**
197
+ * Reads the recommendation-id attribute from the block element within the node
198
+ */
199
+ _getRecommendationIdFromNode(t) {
200
+ const e = I(t);
201
+ if (!e || !("getAttribute" in e))
202
+ return null;
203
+ const o = e.getAttribute(T);
204
+ if (!o)
205
+ return null;
206
+ const r = parseInt(o);
207
+ return Number.isNaN(r) ? null : r;
208
+ }
209
+ /**
210
+ * Listen to store changes that require product refresh or regeneration.
211
+ *
212
+ * Uses configVersion counter (incremented only by patchCurrentBlockConfig)
213
+ * to distinguish user-initiated config changes from internal mutations
214
+ * (e.g., fetchRecommendationCreateData setting preferred currency).
215
+ */
216
+ _listenStateUpdates() {
217
+ const { store: t } = this;
218
+ let e = t.recommendationProducts, o = t.$state.configVersion;
219
+ this.storeUnsubscription = t.$subscribe(() => {
220
+ const r = t.$state.configVersion;
221
+ r !== o && (o = r, this._persistFiltersToNodeConfig(), this._debouncedFetchProducts());
222
+ const i = t.recommendationProducts, a = i !== e, d = Array.isArray(i) && i.length > 0;
223
+ a && d && (e = i, this._debouncedRegenerateWithProducts());
224
+ });
225
+ }
226
+ /**
227
+ * Persists the current filter state from Pinia store to the Stripo node config.
228
+ * This ensures filters survive template save/reload cycles.
229
+ */
230
+ _persistFiltersToNodeConfig() {
231
+ if (!this.currentNode || !this.api)
232
+ return;
233
+ const { filters: t } = this.store.recommendationConfigs;
234
+ l.updateConfig(
235
+ this.api,
236
+ this.currentNode,
237
+ { filters: t },
238
+ "Update recommendation filters"
239
+ );
240
+ }
241
+ }
242
+ export {
243
+ W as ALGORITHM_CONTROL_ID,
244
+ p as AlgorithmControl,
245
+ S as CONTROL_BLOCK_ID,
246
+ H as CURRENCY_CONTROL_ID,
247
+ g as CurrencyControl,
248
+ j as FILTERS_CONTROL_ID,
249
+ R as FiltersControl,
250
+ K as LOCALE_CONTROL_ID,
251
+ N as LocaleControl,
252
+ J as PRODUCT_LAYOUT_CONTROL_ID,
253
+ y as ProductLayoutControl,
254
+ z as RecommendationBlockControl,
255
+ X as SHUFFLE_CONTROL_ID,
256
+ _ as ShuffleControl,
257
+ tt as formatProductPrice,
258
+ I as getBlockElement,
259
+ et as getCardComposition,
260
+ ot as getCurrentLayout,
261
+ rt as reapplySpacing,
262
+ it as regenerateMobileProductRows,
263
+ nt as regenerateProductRows,
264
+ b as regenerateProductRowsWithStyles,
265
+ st as setCurrencyAttributes,
266
+ ct as updatePricesInPlace,
267
+ P as updateProductContentInPlace,
268
+ at as updateSingleProductContent
269
+ };
@@ -0,0 +1,70 @@
1
+ var s = Object.defineProperty;
2
+ var r = (o, t, e) => t in o ? s(o, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : o[t] = e;
3
+ var a = (o, t, e) => r(o, typeof t != "symbol" ? t + "" : t, e);
4
+ import { UEAttr as l } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
+ import { CommonControl as m } from "../../../common-control.js";
6
+ import { RecommendationConfigService as i } from "../../services/configService.js";
7
+ import { useRecommendationExtensionStore as c } from "../../store/recommendation.js";
8
+ const g = "recommendation-locale-control", n = {
9
+ LOCALE: "language"
10
+ };
11
+ class C extends m {
12
+ constructor() {
13
+ super(...arguments);
14
+ // Store is used ONLY for API-fetched data (language options), not for config
15
+ a(this, "store", c());
16
+ }
17
+ getId() {
18
+ return g;
19
+ }
20
+ getTemplate() {
21
+ return `
22
+ <div class="locale-control-container">
23
+ ${this._GuTwoColumns([
24
+ this._GuLabel({ text: "Recommendation Locale" }),
25
+ this._GuSelect({
26
+ name: n.LOCALE,
27
+ placeholder: "Select Recommendation Locale",
28
+ options: this.store.getLanguages
29
+ })
30
+ ])}
31
+ </div>
32
+ `;
33
+ }
34
+ onRender() {
35
+ this._initializeSelectItems(), this._setFormValues(), this._listenToFormUpdates();
36
+ }
37
+ onTemplateNodeUpdated(e) {
38
+ super.onTemplateNodeUpdated(e), this._setFormValues();
39
+ }
40
+ _setFormValues() {
41
+ const e = i.getConfig(this.currentNode);
42
+ this.api.updateValues({
43
+ [n.LOCALE]: e.language
44
+ });
45
+ }
46
+ _initializeSelectItems() {
47
+ this.api.setUIEAttribute(
48
+ n.LOCALE,
49
+ l.SELECTPICKER.items,
50
+ this.store.getLanguages
51
+ );
52
+ }
53
+ _onLocaleChange(e) {
54
+ this.currentNode && (i.updateConfig(
55
+ this.api,
56
+ this.currentNode,
57
+ { language: e },
58
+ `Changed language to ${e}`
59
+ ), this.store.patchCurrentBlockConfig({ language: e }));
60
+ }
61
+ _listenToFormUpdates() {
62
+ this.api.onValueChanged(n.LOCALE, (e) => {
63
+ this._onLocaleChange(e);
64
+ });
65
+ }
66
+ }
67
+ export {
68
+ g as LOCALE_CONTROL_ID,
69
+ C as LocaleControl
70
+ };