@useinsider/guido 3.20.0-beta.af394f2 → 3.20.0

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.
@@ -1,72 +1,66 @@
1
1
  var C = Object.defineProperty;
2
- var p = (h, u, e) => u in h ? C(h, u, { enumerable: !0, configurable: !0, writable: !0, value: e }) : h[u] = e;
3
- var r = (h, u, e) => p(h, typeof u != "symbol" ? u + "" : u, e);
4
- import { useConfig as f } from "../../../../../composables/useConfig.js";
2
+ var p = (g, u, t) => u in g ? C(g, u, { enumerable: !0, configurable: !0, writable: !0, value: t }) : g[u] = t;
3
+ var i = (g, u, t) => p(g, typeof u != "symbol" ? u + "" : u, t);
4
+ import { useConfig as h } from "../../../../../composables/useConfig.js";
5
5
  import { ModificationDescription as y } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
6
6
  import { CommonControl as N } from "../../../common-control.js";
7
- import { RRS_CONFIG_VERSION as _, DEFAULT_NODE_CONFIG as c } from "../../constants/defaultConfig.js";
7
+ import { RRS_CONFIG_VERSION as _, DEFAULT_NODE_CONFIG as a } from "../../constants/defaultConfig.js";
8
8
  import { RECOMMENDATION_ID_ATTR as I } from "../../constants/selectors.js";
9
- import { RecommendationConfigService as d } from "../../services/configService.js";
9
+ import { RecommendationConfigService as c } from "../../services/configService.js";
10
10
  import { useRecommendationExtensionStore as R } from "../../store/recommendation.js";
11
- import { registerNodeConfigWriter as b, commitBlockChangeOutsidePanel as P } from "../../utils/nodeConfigWriter.js";
12
- import { AlgorithmControl as S } from "./algorithm.js";
13
- import { ALGORITHM_CONTROL_ID as ue } from "./algorithm.js";
14
- import { CurrencyControl as T } from "./currency.js";
15
- import { CURRENCY_CONTROL_ID as ge } from "./currency.js";
16
- import { FiltersControl as O } from "./filters.js";
17
- import { FILTERS_CONTROL_ID as me } from "./filters.js";
18
- import { LayoutOrientationControl as k } from "./layoutOrientation.js";
19
- import { LAYOUT_ORIENTATION_CONTROL_ID as pe } from "./layoutOrientation.js";
11
+ import { registerNodeConfigWriter as b } from "../../utils/nodeConfigWriter.js";
12
+ import { AlgorithmControl as T } from "./algorithm.js";
13
+ import { ALGORITHM_CONTROL_ID as ut } from "./algorithm.js";
14
+ import { CurrencyControl as P } from "./currency.js";
15
+ import { CURRENCY_CONTROL_ID as gt } from "./currency.js";
16
+ import { FiltersControl as S } from "./filters.js";
17
+ import { FILTERS_CONTROL_ID as ft } from "./filters.js";
18
+ import { LayoutOrientationControl as O } from "./layoutOrientation.js";
19
+ import { LAYOUT_ORIENTATION_CONTROL_ID as Ct } from "./layoutOrientation.js";
20
20
  import { LocaleControl as L } from "./locale.js";
21
- import { LOCALE_CONTROL_ID as Ne } from "./locale.js";
22
- import { PricePlacementControl as E } from "./pricePlacement.js";
23
- import { PRICE_PLACEMENT_CONTROL_ID as Ie } from "./pricePlacement.js";
24
- import { ProductCountControl as F } from "./productCount.js";
25
- import { PRODUCT_COUNT_CONTROL_ID as be } from "./productCount.js";
26
- import { ProductLayoutControl as D } from "./productLayout.js";
27
- import { PRODUCT_LAYOUT_CONTROL_ID as Se } from "./productLayout.js";
28
- import { ShuffleControl as w } from "./shuffle.js";
29
- import { SHUFFLE_CONTROL_ID as Oe } from "./shuffle.js";
30
- import { StrategyControl as B } from "./strategy.js";
31
- import { STRATEGY_CONTROL_ID as Le } from "./strategy.js";
32
- import { setCurrencyAttributes as U, getBlockElement as v, isPartnerManagedBlock as A, updateProductContentInPlace as x, regenerateProductRowsWithStyles as V } from "./utils.js";
33
- import { adjustProductsToSize as Fe, formatProductPrice as De, getCardComposition as we, getCurrentLayout as Be, getMainContainerTbody as Ue, regenerateMobileProductRows as ve, updatePricesInPlace as Ae, updateSingleProductContent as xe } from "./utils.js";
34
- import { useDebounceFn as m } from "../../../../../node_modules/@vueuse/shared/index.js";
21
+ import { LOCALE_CONTROL_ID as yt } from "./locale.js";
22
+ import { PricePlacementControl as k } from "./pricePlacement.js";
23
+ import { PRICE_PLACEMENT_CONTROL_ID as _t } from "./pricePlacement.js";
24
+ import { ProductCountControl as E } from "./productCount.js";
25
+ import { PRODUCT_COUNT_CONTROL_ID as Rt } from "./productCount.js";
26
+ import { ProductLayoutControl as F } from "./productLayout.js";
27
+ import { PRODUCT_LAYOUT_CONTROL_ID as Tt } from "./productLayout.js";
28
+ import { ShuffleControl as D } from "./shuffle.js";
29
+ import { SHUFFLE_CONTROL_ID as St } from "./shuffle.js";
30
+ import { StrategyControl as w } from "./strategy.js";
31
+ import { STRATEGY_CONTROL_ID as Lt } from "./strategy.js";
32
+ import { setCurrencyAttributes as v, getBlockElement as A, isPartnerManagedBlock as B, updateProductContentInPlace as x, regenerateProductRowsWithStyles as U } from "./utils.js";
33
+ import { adjustProductsToSize as Et, formatProductPrice as Ft, getCardComposition as Dt, getCurrentLayout as wt, getMainContainerTbody as vt, regenerateMobileProductRows as At, updatePricesInPlace as Bt, updateSingleProductContent as xt } from "./utils.js";
34
+ import { useDebounceFn as f } from "../../../../../node_modules/@vueuse/shared/index.js";
35
35
  const W = "ui-elements-recommendation-block";
36
- class ce extends N {
36
+ class at extends N {
37
37
  constructor() {
38
38
  super(...arguments);
39
- r(this, "store", R());
40
- r(this, "storeUnsubscription", () => {
39
+ i(this, "store", R());
40
+ i(this, "storeUnsubscription", () => {
41
41
  });
42
42
  // A config change waiting to reach the node config. Deferred so it can ride the
43
43
  // re-render's single apply() — one user action must cost one undo press.
44
- r(this, "pendingNodeConfigWrite", null);
45
- r(this, "pendingConfigFlushTimer", null);
46
- // Last configVersion the subscription handled, and whether its products still
47
- // have to reach the canvas — both read on destroy to finish that work.
48
- r(this, "seenConfigVersion", 0);
49
- r(this, "fetchedConfigVersion", 0);
50
- r(this, "hasUnappliedConfigChange", !1);
44
+ i(this, "pendingNodeConfigWrite", null);
45
+ i(this, "pendingConfigFlushTimer", null);
51
46
  // Sub-control instances for lifecycle management
52
- r(this, "algorithmControl", null);
53
- r(this, "localeControl", null);
54
- r(this, "currencyControl", null);
55
- r(this, "productCountControl", null);
56
- r(this, "productLayoutControl", null);
57
- r(this, "filtersControl", null);
58
- r(this, "shuffleControl", null);
59
- r(this, "pricePlacementControl", null);
60
- r(this, "layoutOrientationControl", null);
61
- r(this, "strategyControl", null);
62
- r(this, "rrsEnabled", !1);
47
+ i(this, "algorithmControl", null);
48
+ i(this, "localeControl", null);
49
+ i(this, "currencyControl", null);
50
+ i(this, "productCountControl", null);
51
+ i(this, "productLayoutControl", null);
52
+ i(this, "filtersControl", null);
53
+ i(this, "shuffleControl", null);
54
+ i(this, "pricePlacementControl", null);
55
+ i(this, "layoutOrientationControl", null);
56
+ i(this, "strategyControl", null);
57
+ i(this, "rrsEnabled", !1);
63
58
  /**
64
59
  * Debounced product fetch to prevent rapid API calls during config changes
65
60
  */
66
- r(this, "_debouncedFetchProducts", m(async () => {
67
- const { configVersion: e } = this.store.$state;
61
+ i(this, "_debouncedFetchProducts", f(async () => {
68
62
  try {
69
- await this.store.fetchRecommendationProducts(), this.fetchedConfigVersion = e;
63
+ await this.store.fetchRecommendationProducts();
70
64
  } finally {
71
65
  this._scheduleConfigFlush();
72
66
  }
@@ -82,24 +76,23 @@ class ce extends N {
82
76
  * count. The store pads products to the configured size, so in-place only
83
77
  * fails when the size actually changed.
84
78
  */
85
- r(this, "_debouncedRegenerateWithProducts", m(() => {
86
- const e = this.store.recommendationProducts;
79
+ i(this, "_debouncedRegenerateWithProducts", f(() => {
80
+ const t = this.store.recommendationProducts;
87
81
  if (!this.currentNode || !this.api)
88
82
  return;
89
- this.fetchedConfigVersion === this.seenConfigVersion && (this.hasUnappliedConfigChange = !1);
90
- const t = this.api.getDocumentModifier(), o = this._stagePendingNodeConfig(t);
91
- if (A(this.currentNode)) {
92
- o && (t.apply(new y("Update recommendation configuration")), this.pendingNodeConfigWrite = null, this._clearConfigFlush());
83
+ const e = this.api.getDocumentModifier(), o = this._stagePendingNodeConfig(e);
84
+ if (B(this.currentNode)) {
85
+ o && (e.apply(new y("Update recommendation configuration")), this.pendingNodeConfigWrite = null, this._clearConfigFlush());
93
86
  return;
94
87
  }
95
88
  x({
96
89
  currentNode: this.currentNode,
97
- documentModifier: t,
98
- products: e
99
- }) || V({
90
+ documentModifier: e,
91
+ products: t
92
+ }) || U({
100
93
  currentNode: this.currentNode,
101
- documentModifier: t,
102
- products: e
94
+ documentModifier: e,
95
+ products: t
103
96
  });
104
97
  }, 100));
105
98
  }
@@ -121,15 +114,15 @@ class ce extends N {
121
114
  ];
122
115
  }
123
116
  getTemplate() {
124
- var e;
125
- return this.rrsEnabled = f().isFeatureEnabled("reusableRecommendationStrategy"), this._subControls.forEach((t) => {
117
+ var t;
118
+ return this.rrsEnabled = h().isFeatureEnabled("reusableRecommendationStrategy"), this._subControls.forEach((e) => {
126
119
  var o;
127
- return (o = t == null ? void 0 : t.onDestroy) == null ? void 0 : o.call(t);
128
- }), this.algorithmControl = new S(), this.localeControl = new L(), this.currencyControl = new T(), this.productCountControl = new F(), this.productLayoutControl = new D(), this.filtersControl = new O(), this.shuffleControl = new w(), this.pricePlacementControl = new E(), this.layoutOrientationControl = new k(), this.strategyControl = this.rrsEnabled ? new B() : null, this._subControls.forEach((t) => {
129
- t && (t.api = this.api);
120
+ return (o = e == null ? void 0 : e.onDestroy) == null ? void 0 : o.call(e);
121
+ }), this.algorithmControl = new T(), this.localeControl = new L(), this.currencyControl = new P(), this.productCountControl = new E(), this.productLayoutControl = new F(), this.filtersControl = new S(), this.shuffleControl = new D(), this.pricePlacementControl = new k(), this.layoutOrientationControl = new O(), this.strategyControl = this.rrsEnabled ? new w() : null, this._subControls.forEach((e) => {
122
+ e && (e.api = this.api);
130
123
  }), `
131
124
  <div class="recommendation-controls-container">
132
- ${((e = this.strategyControl) == null ? void 0 : e.getTemplate()) ?? ""}
125
+ ${((t = this.strategyControl) == null ? void 0 : t.getTemplate()) ?? ""}
133
126
  ${this.layoutOrientationControl.getTemplate()}
134
127
  ${this.productCountControl.getTemplate()}
135
128
  ${this.productLayoutControl.getTemplate()}
@@ -142,40 +135,39 @@ class ce extends N {
142
135
  </div>
143
136
  `;
144
137
  }
145
- _showControlsForBlock(e) {
146
- var i;
147
- const t = (i = this.getContainer()) == null ? void 0 : i.querySelector(".recommendation-controls-container");
148
- if (!t)
138
+ _showControlsForBlock(t) {
139
+ var r;
140
+ const e = (r = this.getContainer()) == null ? void 0 : r.querySelector(".recommendation-controls-container");
141
+ if (!e)
149
142
  return;
150
- const o = this._getRecommendationIdFromNode(e) === null ? null : d.getConfig(e), n = this.rrsEnabled && !!o && (!!(o != null && o.strategyId) || ((o == null ? void 0 : o.configVersion) ?? 0) >= _), s = this.rrsEnabled && !!o && !n;
151
- t.classList.toggle("strategy-block", n), t.classList.toggle("legacy-strategy-block", s);
143
+ const o = this._getRecommendationIdFromNode(t) === null ? null : c.getConfig(t), n = this.rrsEnabled && !!o && (!!(o != null && o.strategyId) || ((o == null ? void 0 : o.configVersion) ?? 0) >= _), s = this.rrsEnabled && !!o && !n;
144
+ e.classList.toggle("strategy-block", n), e.classList.toggle("legacy-strategy-block", s);
152
145
  }
153
146
  async onRender() {
154
147
  var o;
155
148
  b(this.api);
156
- const e = this._getRecommendationIdFromNode(this.currentNode), t = e ?? this.store.currentRecommendationId;
157
- if (t !== null && this.store.setCurrentBlock(t), e !== null && this._syncNodeConfigIfChanged(e), this._listenStateUpdates(), this._showControlsForBlock(this.currentNode), e !== null && this.strategyControl && (this.strategyControl.api = this.api, this.strategyControl.currentNode = this.currentNode, this.strategyControl.onRender()), t !== null && ((o = this.store.blockStates[t]) != null && o.isInitialized)) {
149
+ const t = this._getRecommendationIdFromNode(this.currentNode), e = t ?? this.store.currentRecommendationId;
150
+ if (e !== null && this.store.setCurrentBlock(e), t !== null && this._syncNodeConfigIfChanged(t), this._listenStateUpdates(), this._showControlsForBlock(this.currentNode), t !== null && this.strategyControl && (this.strategyControl.api = this.api, this.strategyControl.currentNode = this.currentNode, this.strategyControl.onRender()), e !== null && ((o = this.store.blockStates[e]) != null && o.isInitialized)) {
158
151
  this._initializeSubControls();
159
152
  return;
160
153
  }
161
- await this._fetchBlockData(t), this._initializeSubControls();
154
+ await this._fetchBlockData(e), this._initializeSubControls();
162
155
  }
163
- onTemplateNodeUpdated(e) {
156
+ onTemplateNodeUpdated(t) {
164
157
  var o;
165
- super.onTemplateNodeUpdated(e);
166
- const t = this._getRecommendationIdFromNode(e);
167
- t !== null && t !== this.store.currentRecommendationId && this.store.setCurrentBlock(t), t !== null && this._syncNodeConfigIfChanged(t), this._showControlsForBlock(e), t !== null && !((o = this.store.blockStates[t]) != null && o.isInitialized) && this._fetchBlockData(t).then(() => {
158
+ super.onTemplateNodeUpdated(t);
159
+ const e = this._getRecommendationIdFromNode(t);
160
+ e !== null && e !== this.store.currentRecommendationId && this.store.setCurrentBlock(e), e !== null && this._syncNodeConfigIfChanged(e), this._showControlsForBlock(t), e !== null && !((o = this.store.blockStates[e]) != null && o.isInitialized) && this._fetchBlockData(e).then(() => {
168
161
  this._initializeSubControls();
169
162
  }), this._subControls.forEach((n) => {
170
163
  var s;
171
- n != null && n.api && (n.currentNode = e, (s = n.onTemplateNodeUpdated) == null || s.call(n, e));
164
+ n != null && n.api && (n.currentNode = t, (s = n.onTemplateNodeUpdated) == null || s.call(n, t));
172
165
  });
173
166
  }
174
167
  onDestroy() {
175
- const e = this.hasUnappliedConfigChange || this.store.$state.configVersion !== this.seenConfigVersion;
176
- this.storeUnsubscription(), e ? this._refreshProductsOutsidePanel() : this._flushPendingNodeConfig(), this._subControls.forEach((t) => {
177
- var o;
178
- return (o = t == null ? void 0 : t.onDestroy) == null ? void 0 : o.call(t);
168
+ this.storeUnsubscription(), this._flushPendingNodeConfig(), this._subControls.forEach((t) => {
169
+ var e;
170
+ return (e = t == null ? void 0 : t.onDestroy) == null ? void 0 : e.call(t);
179
171
  });
180
172
  }
181
173
  /**
@@ -183,9 +175,9 @@ class ce extends N {
183
175
  * Each sub-control manages its own form values and event listeners
184
176
  */
185
177
  _initializeSubControls() {
186
- this._subControls.forEach((e) => {
187
- var t;
188
- e && (e.api = this.api, e.currentNode = this.currentNode, (t = e.onRender) == null || t.call(e));
178
+ this._subControls.forEach((t) => {
179
+ var e;
180
+ t && (t.api = this.api, t.currentNode = this.currentNode, (e = t.onRender) == null || e.call(t));
189
181
  });
190
182
  }
191
183
  /**
@@ -212,34 +204,34 @@ class ce extends N {
212
204
  * that state and made a re-dropped saved module keep the defaults its wiped
213
205
  * state was rebuilt with (SD-150347).
214
206
  */
215
- _syncNodeConfigIfChanged(e) {
216
- this.pendingNodeConfigWrite && this.pendingNodeConfigWrite.blockId !== e && this._flushPendingNodeConfig();
217
- const t = this.store.blockStates[e];
218
- if (!t)
207
+ _syncNodeConfigIfChanged(t) {
208
+ this.pendingNodeConfigWrite && this.pendingNodeConfigWrite.blockId !== t && this._flushPendingNodeConfig();
209
+ const e = this.store.blockStates[t];
210
+ if (!e)
219
211
  return;
220
- const o = JSON.stringify(d.getConfig(this.currentNode)), n = t.syncedConfigFingerprint;
221
- t.syncedConfigFingerprint = o, n !== o && (this.pendingNodeConfigWrite || this._syncNodeConfigToStore());
212
+ const o = JSON.stringify(c.getConfig(this.currentNode)), n = e.syncedConfigFingerprint;
213
+ e.syncedConfigFingerprint = o, n !== o && (this.pendingNodeConfigWrite || this._syncNodeConfigToStore());
222
214
  }
223
215
  /** Whether the deferred write would move the node's strategyId — see the caller (SD-149916). */
224
216
  _isPendingStrategyIdChange() {
225
- const e = this.pendingNodeConfigWrite;
226
- return e ? d.getConfig(this.currentNode).strategyId !== e.updates.strategyId : !1;
217
+ const t = this.pendingNodeConfigWrite;
218
+ return t ? c.getConfig(this.currentNode).strategyId !== t.updates.strategyId : !1;
227
219
  }
228
- _capturePendingNodeConfigWrite(e = this.store.currentRecommendationId) {
229
- const t = e === null ? void 0 : this.store.blockStates[e];
230
- if (!this.currentNode || !this.api || e === null || !t)
220
+ _capturePendingNodeConfigWrite() {
221
+ const t = this.store.currentRecommendationId;
222
+ if (!this.currentNode || !this.api || t === null)
231
223
  return;
232
- const { filters: o, strategy: n, strategyId: s, size: i, nodeConfigVersion: l } = t.recommendationConfigs, { partnerName: a } = f();
224
+ const { filters: e, strategy: o, strategyId: n, size: s, nodeConfigVersion: r } = this.store.recommendationConfigs, { partnerName: l } = h();
233
225
  this.pendingNodeConfigWrite = {
234
- blockId: e,
226
+ blockId: t,
235
227
  node: this.currentNode,
236
228
  updates: {
237
- filters: o,
238
- strategy: n,
239
- strategyId: s,
240
- size: i,
241
- configVersion: l,
242
- ...a.value ? { partnerName: a.value } : {}
229
+ filters: e,
230
+ strategy: o,
231
+ strategyId: n,
232
+ size: s,
233
+ configVersion: r,
234
+ ...l.value ? { partnerName: l.value } : {}
243
235
  }
244
236
  };
245
237
  }
@@ -253,9 +245,9 @@ class ce extends N {
253
245
  * @param documentModifier - The batch to accumulate into
254
246
  * @returns Whether anything was staged
255
247
  */
256
- _stagePendingNodeConfig(e) {
257
- const t = this.pendingNodeConfigWrite;
258
- return !t || !this.currentNode ? !1 : (d.stageConfig(e, this.currentNode, t.updates), !0);
248
+ _stagePendingNodeConfig(t) {
249
+ const e = this.pendingNodeConfigWrite;
250
+ return !e || !this.currentNode ? !1 : (c.stageConfig(t, this.currentNode, e.updates), !0);
259
251
  }
260
252
  /**
261
253
  * Arms the guaranteed fallback write, once the product fetch has settled. The
@@ -276,41 +268,41 @@ class ce extends N {
276
268
  * snapshot the intervening re-render staled, and saveConfig swallows that failure.
277
269
  */
278
270
  _flushPendingNodeConfig() {
279
- const e = this.pendingNodeConfigWrite;
280
- if (this.pendingNodeConfigWrite = null, this._clearConfigFlush(), !e || !this.api)
271
+ const t = this.pendingNodeConfigWrite;
272
+ if (this.pendingNodeConfigWrite = null, this._clearConfigFlush(), !t || !this.api)
281
273
  return;
282
- const t = e.blockId === this.store.currentRecommendationId && this.currentNode ? this.currentNode : e.node, o = d.getConfig(t);
283
- JSON.stringify(o.filters) === JSON.stringify(e.updates.filters) && o.strategy === e.updates.strategy && o.strategyId === e.updates.strategyId && o.size === e.updates.size || d.updateConfig(this.api, t, e.updates, "Update recommendation filters");
274
+ const e = t.blockId === this.store.currentRecommendationId && this.currentNode ? this.currentNode : t.node, o = c.getConfig(e);
275
+ JSON.stringify(o.filters) === JSON.stringify(t.updates.filters) && o.strategy === t.updates.strategy && o.strategyId === t.updates.strategyId && o.size === t.updates.size || c.updateConfig(this.api, e, t.updates, "Update recommendation filters");
284
276
  }
285
277
  _syncNodeConfigToStore() {
286
278
  var n;
287
- const e = d.getConfig(this.currentNode), t = this.store.currentRecommendationId, o = t !== null && ((n = this.store.blockStates[t]) == null ? void 0 : n.isInitialized);
279
+ const t = c.getConfig(this.currentNode), e = this.store.currentRecommendationId, o = e !== null && ((n = this.store.blockStates[e]) == null ? void 0 : n.isInitialized);
288
280
  this.store.patchCurrentBlockConfig({
289
- strategy: e.strategy,
290
- strategyId: e.strategyId,
291
- nodeConfigVersion: e.configVersion,
292
- language: e.language,
293
- size: e.size,
294
- productIds: e.productIds,
295
- cardsInRow: e.cardsInRow,
296
- mobileCardsInRow: e.mobileCardsInRow,
297
- mobileLayoutEnabled: e.mobileLayoutEnabled,
298
- orientation: e.layout,
281
+ strategy: t.strategy,
282
+ strategyId: t.strategyId,
283
+ nodeConfigVersion: t.configVersion,
284
+ language: t.language,
285
+ size: t.size,
286
+ productIds: t.productIds,
287
+ cardsInRow: t.cardsInRow,
288
+ mobileCardsInRow: t.mobileCardsInRow,
289
+ mobileLayoutEnabled: t.mobileLayoutEnabled,
290
+ orientation: t.layout,
299
291
  // Only sync filters from node config during initial load.
300
292
  // After initialization, the Pinia store is the source of truth
301
293
  // for filters (edited via the filter drawer).
302
- ...o ? {} : { filters: e.filters },
303
- shuffleProducts: e.shuffleProducts,
304
- priceMovedToNextLine: e.priceMovedToNextLine,
305
- priceHideIfSameAsDiscounted: e.priceHideIfSameAsDiscounted,
294
+ ...o ? {} : { filters: t.filters },
295
+ shuffleProducts: t.shuffleProducts,
296
+ priceMovedToNextLine: t.priceMovedToNextLine,
297
+ priceHideIfSameAsDiscounted: t.priceHideIfSameAsDiscounted,
306
298
  currencySettings: {
307
- name: e.currency.code,
308
- value: e.currency.code,
309
- symbol: e.currency.symbol,
310
- alignment: e.currency.alignment === "before" ? "0" : "1",
311
- decimalCount: e.currency.decimalCount.toString(),
312
- decimalSeparator: e.currency.decimalSeparator,
313
- thousandSeparator: e.currency.thousandSeparator
299
+ name: t.currency.code,
300
+ value: t.currency.code,
301
+ symbol: t.currency.symbol,
302
+ alignment: t.currency.alignment === "before" ? "0" : "1",
303
+ decimalCount: t.currency.decimalCount.toString(),
304
+ decimalSeparator: t.currency.decimalSeparator,
305
+ thousandSeparator: t.currency.thousandSeparator
314
306
  }
315
307
  }, { triggerRefetch: !1 });
316
308
  }
@@ -323,8 +315,8 @@ class ce extends N {
323
315
  * Shared by onRender() and onTemplateNodeUpdated() to avoid duplication.
324
316
  * Marks the block as initialized to prevent redundant fetches on re-selection.
325
317
  */
326
- async _fetchBlockData(e) {
327
- e !== null && this.store.markBlockInitialized(e), (await Promise.allSettled([
318
+ async _fetchBlockData(t) {
319
+ t !== null && this.store.markBlockInitialized(t), (await Promise.allSettled([
328
320
  this.store.fetchRecommendationCreateData(),
329
321
  this.store.fetchRecommendationFilters()
330
322
  ])).forEach((o, n) => {
@@ -349,49 +341,49 @@ class ce extends N {
349
341
  _applySmartDefaults() {
350
342
  if (!this.currentNode || !this.api)
351
343
  return;
352
- const e = d.getConfig(this.currentNode), t = {};
344
+ const t = c.getConfig(this.currentNode), e = {};
353
345
  let o = null, n = null, s = null;
354
- if (e.currency.code === c.currency.code) {
355
- const { currencyList: i } = this.store;
356
- i.length > 0 && (i.some(
357
- (a) => a.value === `price.${c.currency.code}`
358
- ) || (o = i[0].value.replace("price.", ""), t.currency = {
359
- ...c.currency,
346
+ if (t.currency.code === a.currency.code) {
347
+ const { currencyList: r } = this.store;
348
+ r.length > 0 && (r.some(
349
+ (d) => d.value === `price.${a.currency.code}`
350
+ ) || (o = r[0].value.replace("price.", ""), e.currency = {
351
+ ...a.currency,
360
352
  code: o,
361
353
  symbol: o
362
354
  }));
363
355
  }
364
- if (e.strategy === c.strategy) {
365
- const i = this.store.getActivePredictiveAlgorithms;
366
- i.length > 0 && (i.some(
367
- (a) => a.value === c.strategy
368
- ) || (n = i[0].value, t.strategy = n));
356
+ if (t.strategy === a.strategy) {
357
+ const r = this.store.getActivePredictiveAlgorithms;
358
+ r.length > 0 && (r.some(
359
+ (d) => d.value === a.strategy
360
+ ) || (n = r[0].value, e.strategy = n));
369
361
  }
370
- if (e.language === c.language) {
371
- const i = this.store.getLanguages;
372
- i.length > 0 && (i.some(
373
- (a) => a.value === c.language
374
- ) || (s = i[0].value, t.language = s));
362
+ if (t.language === a.language) {
363
+ const r = this.store.getLanguages;
364
+ r.length > 0 && (r.some(
365
+ (d) => d.value === a.language
366
+ ) || (s = r[0].value, e.language = s));
375
367
  }
376
- !o && !n && !s || (d.updateConfig(
368
+ !o && !n && !s || (c.updateConfig(
377
369
  this.api,
378
370
  this.currentNode,
379
- t,
371
+ e,
380
372
  "Applied smart defaults"
381
- ), o && t.currency && U({
373
+ ), o && e.currency && v({
382
374
  currentNode: this.currentNode,
383
375
  documentModifier: this.api.getDocumentModifier(),
384
- currency: t.currency
376
+ currency: e.currency
385
377
  }), this.store.patchCurrentBlockConfig({
386
378
  ...o ? {
387
379
  currencySettings: {
388
380
  name: o,
389
381
  value: o,
390
382
  symbol: o,
391
- alignment: c.currency.alignment === "before" ? "0" : "1",
392
- decimalCount: c.currency.decimalCount.toString(),
393
- decimalSeparator: c.currency.decimalSeparator,
394
- thousandSeparator: c.currency.thousandSeparator
383
+ alignment: a.currency.alignment === "before" ? "0" : "1",
384
+ decimalCount: a.currency.decimalCount.toString(),
385
+ decimalSeparator: a.currency.decimalSeparator,
386
+ thousandSeparator: a.currency.thousandSeparator
395
387
  }
396
388
  } : {},
397
389
  ...n ? { strategy: n } : {},
@@ -401,51 +393,16 @@ class ce extends N {
401
393
  /**
402
394
  * Reads the recommendation-id attribute from the block element within the node
403
395
  */
404
- _getRecommendationIdFromNode(e) {
405
- const t = v(e);
406
- if (!t || !("getAttribute" in t))
396
+ _getRecommendationIdFromNode(t) {
397
+ const e = A(t);
398
+ if (!e || !("getAttribute" in e))
407
399
  return null;
408
- const o = t.getAttribute(I);
400
+ const o = e.getAttribute(I);
409
401
  if (!o)
410
402
  return null;
411
403
  const n = parseInt(o);
412
404
  return Number.isNaN(n) ? null : n;
413
405
  }
414
- /**
415
- * Fetches and renders the block's products without the panel, carrying the
416
- * deferred config write so both still land as one undo entry.
417
- */
418
- async _refreshProductsOutsidePanel() {
419
- var a;
420
- const e = this.store.currentRecommendationId, t = this._getRecommendationIdFromNode(this.currentNode), o = t !== null && t !== e ? t : e;
421
- if (((a = this.pendingNodeConfigWrite) == null ? void 0 : a.blockId) !== o && this._flushPendingNodeConfig(), o === null)
422
- return;
423
- if (this._capturePendingNodeConfigWrite(o), o !== e) {
424
- this._flushPendingNodeConfig();
425
- return;
426
- }
427
- const n = this.pendingNodeConfigWrite;
428
- try {
429
- await this.store.fetchRecommendationProducts();
430
- } catch (g) {
431
- console.warn("Recommendation block: fetchRecommendationProducts failed", g);
432
- }
433
- const s = this.pendingNodeConfigWrite === n, i = s ? (n == null ? void 0 : n.updates) ?? {} : {}, l = this.store.blockStates[e];
434
- try {
435
- if (l && P(
436
- e,
437
- i,
438
- l.recommendationProducts,
439
- "Update recommendation configuration"
440
- )) {
441
- s && (this.pendingNodeConfigWrite = null, this._clearConfigFlush());
442
- return;
443
- }
444
- s && this._flushPendingNodeConfig();
445
- } catch (g) {
446
- console.error("Recommendation block: refresh outside the panel failed", g);
447
- }
448
- }
449
406
  /**
450
407
  * Listen to store changes that require product refresh or regeneration.
451
408
  *
@@ -460,55 +417,55 @@ class ce extends N {
460
417
  * We skip that tick and update tracking references instead.
461
418
  */
462
419
  _listenStateUpdates() {
463
- const { store: e } = this;
464
- let t = e.recommendationProducts, o = e.currentRecommendationId;
465
- this.seenConfigVersion = e.$state.configVersion, this.hasUnappliedConfigChange = !1, this.storeUnsubscription = e.$subscribe(() => {
466
- const n = e.currentRecommendationId;
467
- if (n !== o) {
468
- o = n, t = e.recommendationProducts, this.seenConfigVersion = e.$state.configVersion, this.hasUnappliedConfigChange = !1;
420
+ const { store: t } = this;
421
+ let e = t.recommendationProducts, o = t.$state.configVersion, n = t.currentRecommendationId;
422
+ this.storeUnsubscription = t.$subscribe(() => {
423
+ const s = t.currentRecommendationId;
424
+ if (s !== n) {
425
+ n = s, e = t.recommendationProducts, o = t.$state.configVersion;
469
426
  return;
470
427
  }
471
- const s = e.$state.configVersion;
472
- s !== this.seenConfigVersion && (this.seenConfigVersion = s, this.hasUnappliedConfigChange = !0, this._capturePendingNodeConfigWrite(), this._isPendingStrategyIdChange() && this._flushPendingNodeConfig(), this._debouncedFetchProducts());
473
- const i = e.recommendationProducts, l = i !== t, a = Array.isArray(i) && i.length > 0;
474
- l && a && (t = i, this._debouncedRegenerateWithProducts());
428
+ const r = t.$state.configVersion;
429
+ r !== o && (o = r, this._capturePendingNodeConfigWrite(), this._isPendingStrategyIdChange() && this._flushPendingNodeConfig(), this._debouncedFetchProducts());
430
+ const l = t.recommendationProducts, d = l !== e, m = Array.isArray(l) && l.length > 0;
431
+ d && m && (e = l, this._debouncedRegenerateWithProducts());
475
432
  });
476
433
  }
477
434
  }
478
435
  export {
479
- ue as ALGORITHM_CONTROL_ID,
480
- S as AlgorithmControl,
436
+ ut as ALGORITHM_CONTROL_ID,
437
+ T as AlgorithmControl,
481
438
  W as CONTROL_BLOCK_ID,
482
- ge as CURRENCY_CONTROL_ID,
483
- T as CurrencyControl,
484
- me as FILTERS_CONTROL_ID,
485
- O as FiltersControl,
486
- pe as LAYOUT_ORIENTATION_CONTROL_ID,
487
- Ne as LOCALE_CONTROL_ID,
488
- k as LayoutOrientationControl,
439
+ gt as CURRENCY_CONTROL_ID,
440
+ P as CurrencyControl,
441
+ ft as FILTERS_CONTROL_ID,
442
+ S as FiltersControl,
443
+ Ct as LAYOUT_ORIENTATION_CONTROL_ID,
444
+ yt as LOCALE_CONTROL_ID,
445
+ O as LayoutOrientationControl,
489
446
  L as LocaleControl,
490
- Ie as PRICE_PLACEMENT_CONTROL_ID,
491
- be as PRODUCT_COUNT_CONTROL_ID,
492
- Se as PRODUCT_LAYOUT_CONTROL_ID,
493
- E as PricePlacementControl,
494
- F as ProductCountControl,
495
- D as ProductLayoutControl,
496
- ce as RecommendationBlockControl,
497
- Oe as SHUFFLE_CONTROL_ID,
498
- Le as STRATEGY_CONTROL_ID,
499
- w as ShuffleControl,
500
- B as StrategyControl,
501
- Fe as adjustProductsToSize,
502
- De as formatProductPrice,
503
- v as getBlockElement,
504
- we as getCardComposition,
505
- Be as getCurrentLayout,
506
- Ue as getMainContainerTbody,
507
- A as isPartnerManagedBlock,
508
- ve as regenerateMobileProductRows,
509
- V as regenerateProductRowsWithStyles,
510
- U as setCurrencyAttributes,
511
- Ae as updatePricesInPlace,
447
+ _t as PRICE_PLACEMENT_CONTROL_ID,
448
+ Rt as PRODUCT_COUNT_CONTROL_ID,
449
+ Tt as PRODUCT_LAYOUT_CONTROL_ID,
450
+ k as PricePlacementControl,
451
+ E as ProductCountControl,
452
+ F as ProductLayoutControl,
453
+ at as RecommendationBlockControl,
454
+ St as SHUFFLE_CONTROL_ID,
455
+ Lt as STRATEGY_CONTROL_ID,
456
+ D as ShuffleControl,
457
+ w as StrategyControl,
458
+ Et as adjustProductsToSize,
459
+ Ft as formatProductPrice,
460
+ A as getBlockElement,
461
+ Dt as getCardComposition,
462
+ wt as getCurrentLayout,
463
+ vt as getMainContainerTbody,
464
+ B as isPartnerManagedBlock,
465
+ At as regenerateMobileProductRows,
466
+ U as regenerateProductRowsWithStyles,
467
+ v as setCurrencyAttributes,
468
+ Bt as updatePricesInPlace,
512
469
  x as updateProductContentInPlace,
513
- xe as updateSingleProductContent
470
+ xt as updateSingleProductContent
514
471
  };
@@ -22,9 +22,6 @@ export declare class RecommendationBlockControl extends CommonControl {
22
22
  private storeUnsubscription;
23
23
  private pendingNodeConfigWrite;
24
24
  private pendingConfigFlushTimer;
25
- private seenConfigVersion;
26
- private fetchedConfigVersion;
27
- private hasUnappliedConfigChange;
28
25
  private algorithmControl;
29
26
  private localeControl;
30
27
  private currencyControl;
@@ -130,11 +127,6 @@ export declare class RecommendationBlockControl extends CommonControl {
130
127
  * Debounced product fetch to prevent rapid API calls during config changes
131
128
  */
132
129
  private _debouncedFetchProducts;
133
- /**
134
- * Fetches and renders the block's products without the panel, carrying the
135
- * deferred config write so both still land as one undo entry.
136
- */
137
- private _refreshProductsOutsidePanel;
138
130
  /**
139
131
  * Debounced content update when products arrive from API.
140
132
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useinsider/guido",
3
- "version": "3.20.0-beta.af394f2",
3
+ "version": "3.20.0",
4
4
  "description": "Guido is a Vue + TypeScript wrapper for Email Plugin. Easily embed the email editor in your Vue applications.",
5
5
  "main": "./dist/guido.umd.cjs",
6
6
  "module": "./dist/library.js",