@useinsider/guido 3.18.2-beta.fc246a7 → 3.18.2-beta.fc87f65

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 (57) hide show
  1. package/dist/components/Guido.vue.js +3 -3
  2. package/dist/components/Guido.vue2.js +30 -30
  3. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +13 -11
  4. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +76 -57
  5. package/dist/components/organisms/extensions/recommendation/RemoveStrategyModal.vue2.js +23 -37
  6. package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +20 -18
  7. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.js +21 -0
  8. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue2.js +47 -0
  9. package/dist/components/organisms/save-as-template/SaveAsTemplateDrawer.vue2.js +34 -34
  10. package/dist/composables/useCustomInterfaceAppearance.js +56 -46
  11. package/dist/composables/useHtmlValidator.js +87 -82
  12. package/dist/composables/useHttp.js +24 -22
  13. package/dist/composables/useRecommendation.js +40 -35
  14. package/dist/composables/useStripo.js +30 -30
  15. package/dist/config/migrator/itemsBlockMigrator.js +167 -257
  16. package/dist/enums/extensions/recommendationBlock.js +38 -31
  17. package/dist/extensions/Blocks/Items/controls/name/trimming.js +17 -18
  18. package/dist/extensions/Blocks/Items/controls/settingsControl.js +105 -114
  19. package/dist/extensions/Blocks/Items/enums/productEnums.js +9 -14
  20. package/dist/extensions/Blocks/Items/layouts/horizontal.html.js +9 -11
  21. package/dist/extensions/Blocks/Items/template.js +204 -219
  22. package/dist/extensions/Blocks/Recommendation/block.js +43 -39
  23. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +21 -20
  24. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +40 -35
  25. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +84 -52
  26. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +74 -74
  27. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +194 -91
  28. package/dist/extensions/Blocks/Recommendation/utils/nodeConfigWriter.js +26 -16
  29. package/dist/extensions/Blocks/Recommendation/utils/strategyCommit.js +24 -0
  30. package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +21 -12
  31. package/dist/guido.css +1 -1
  32. package/dist/services/templateLibraryApi.js +17 -14
  33. package/dist/src/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.d.ts +2 -0
  34. package/dist/src/enums/extensions/recommendationBlock.d.ts +2 -0
  35. package/dist/src/extensions/Blocks/Items/enums/productEnums.d.ts +0 -3
  36. package/dist/src/extensions/Blocks/Items/template.d.ts +0 -19
  37. package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +1 -0
  38. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
  39. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +2 -0
  40. package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +9 -0
  41. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +7 -2
  42. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +79 -0
  43. package/dist/src/extensions/Blocks/Recommendation/utils/strategyCommit.d.ts +14 -0
  44. package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +4 -0
  45. package/dist/src/stores/onboarding.d.ts +377 -0
  46. package/dist/src/utils/genericUtil.d.ts +6 -0
  47. package/dist/src/utils/liquidDynamicContent.d.ts +20 -0
  48. package/dist/static/styles/components/recommendation-strategy.css.js +34 -4
  49. package/dist/static/styles/components/skeleton.css.js +23 -0
  50. package/dist/stores/onboarding.js +41 -36
  51. package/dist/utils/genericUtil.js +63 -54
  52. package/dist/utils/liquidDynamicContent.js +15 -0
  53. package/dist/utils/pairProductVariables.js +71 -71
  54. package/dist/utils/templatePreparation.js +61 -60
  55. package/package.json +5 -5
  56. package/dist/extensions/Blocks/Items/constants/cardLayout.js +0 -20
  57. package/dist/src/extensions/Blocks/Items/constants/cardLayout.d.ts +0 -44
@@ -1,37 +1,37 @@
1
- var R = Object.defineProperty;
2
- var B = (a, c, t) => c in a ? R(a, c, { enumerable: !0, configurable: !0, writable: !0, value: t }) : a[c] = t;
3
- var p = (a, c, t) => B(a, typeof c != "symbol" ? c + "" : c, t);
4
- import { useConfig as D } from "../../../composables/useConfig.js";
5
- import { BlockId as y } from "../../../enums/block.js";
6
- import { getMigrationBannerHtml as C } from "../../../utils/migrationBannerHtml.js";
7
- import { Block as b, BlockCompositionType as A, ModificationDescription as g } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
8
- import { CURRENT_CONFIG_VERSION as E, PRE_RRS_CONFIG_VERSION as S } from "./constants/defaultConfig.js";
1
+ var D = Object.defineProperty;
2
+ var y = (l, c, t) => c in l ? D(l, c, { enumerable: !0, configurable: !0, writable: !0, value: t }) : l[c] = t;
3
+ var f = (l, c, t) => y(l, typeof c != "symbol" ? c + "" : c, t);
4
+ import { useConfig as C } from "../../../composables/useConfig.js";
5
+ import { BlockId as b } from "../../../enums/block.js";
6
+ import { getMigrationBannerHtml as A } from "../../../utils/migrationBannerHtml.js";
7
+ import { Block as E, BlockCompositionType as S, ModificationDescription as g } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
8
+ import { CURRENT_CONFIG_VERSION as N, PRE_RRS_CONFIG_VERSION as O } from "./constants/defaultConfig.js";
9
9
  import { RECOMMENDATION_ID_ATTR as m } from "./constants/selectors.js";
10
- import { regenerateMobileProductRows as N } from "./controls/main/utils.js";
11
- import { ensureMobileCssRulesExist as h, setMobileLayoutOptOut as f, hasMobileLayoutOptOut as O } from "./controls/mobileLayout/cssRules.js";
10
+ import { regenerateMobileProductRows as M } from "./controls/main/utils.js";
11
+ import { ensureMobileCssRulesExist as _, setMobileLayoutOptOut as I, hasMobileLayoutOptOut as w } from "./controls/mobileLayout/cssRules.js";
12
12
  import { RecommendationConfigService as s } from "./services/configService.js";
13
13
  import { useRecommendationExtensionStore as d } from "./store/recommendation.js";
14
- import { getDefaultTemplate as M } from "./templates/grid/template.js";
15
- import { useRecommendationBlockWarning as w } from "./useRecommendationBlockWarning.js";
16
- const _ = y.Recommendation, u = "recommendation-block-v2", I = "hide-price";
17
- let k = !1;
18
- class W extends b {
14
+ import { getDefaultTemplate as x } from "./templates/grid/template.js";
15
+ import { useRecommendationBlockWarning as H } from "./useRecommendationBlockWarning.js";
16
+ const k = b.Recommendation, u = "recommendation-block-v2", R = "hide-price";
17
+ let B = !1;
18
+ class j extends E {
19
19
  constructor() {
20
20
  super();
21
21
  /**
22
22
  * Stores the ID generated in getTemplate() so onCreated() can reuse it.
23
23
  * This avoids generating a new (different) ID in onCreated().
24
24
  */
25
- p(this, "_pendingBlockId", null);
25
+ f(this, "_pendingBlockId", null);
26
26
  }
27
27
  getId() {
28
- return _;
28
+ return k;
29
29
  }
30
30
  getIcon() {
31
31
  return "recommendation-icon";
32
32
  }
33
33
  getBlockCompositionType() {
34
- return A.CONTAINER;
34
+ return S.CONTAINER;
35
35
  }
36
36
  getName() {
37
37
  return this.api.translate("Recommendation Block");
@@ -42,8 +42,8 @@ class W extends b {
42
42
  );
43
43
  }
44
44
  getSettingsPanelTitleHtml() {
45
- return C(
46
- _,
45
+ return A(
46
+ k,
47
47
  this.api.translate("Recommendation Block"),
48
48
  this.api.translate("This block is switched from the Old Version to the New Version. We recommend you check the Recommendation block and test your message to ensure it works properly.")
49
49
  );
@@ -66,7 +66,7 @@ class W extends b {
66
66
  */
67
67
  getTemplate() {
68
68
  const t = this._generateNextId();
69
- return this._pendingBlockId = t, M(t);
69
+ return this._pendingBlockId = t, x(t);
70
70
  }
71
71
  /**
72
72
  * Called when a new block is dropped into the template
@@ -89,23 +89,27 @@ class W extends b {
89
89
  }
90
90
  const i = this._pendingBlockId ?? this._generateNextId();
91
91
  this._pendingBlockId = null, this._assignRecommendationId(t, i);
92
- const { config: n, wasFreshDrop: o } = s.initializeConfig(
92
+ const n = C().isFeatureEnabled("reusableRecommendationStrategy"), o = n && !s.hasConfig(t), { config: r, wasFreshDrop: a } = s.initializeConfig(
93
93
  this.api,
94
94
  t,
95
95
  {
96
96
  recommendationId: i,
97
- configVersion: D().isFeatureEnabled("reusableRecommendationStrategy") ? E : S
97
+ configVersion: n ? N : O,
98
+ // An RRS block picks a strategy, not an algorithm, and its algorithm control is
99
+ // hidden. Keeping the `mostPopular` default would bake a most-popular feed URL
100
+ // at save for a block the user never configured.
101
+ ...o ? { strategy: "" } : {}
98
102
  }
99
- ), r = d();
100
- if (r.setCurrentBlock(i), this._stampHidePrice(t, n.priceHideIfSameAsDiscounted), o) {
101
- h(this.api);
102
- const l = this._getBlockElement(t);
103
- l && (f(this.api, l, !0), N({
103
+ ), p = d();
104
+ if (p.setCurrentBlock(i), this._stampHidePrice(t, r.priceHideIfSameAsDiscounted), a) {
105
+ _(this.api);
106
+ const h = this._getBlockElement(t);
107
+ h && (I(this.api, h, !0), M({
104
108
  currentNode: t,
105
109
  documentModifier: this.api.getDocumentModifier()
106
110
  }));
107
111
  }
108
- r.patchCurrentBlockConfig({ language: n.language }, { triggerRefetch: !1 }), this._warnIfMultipleBlocks();
112
+ p.patchCurrentBlockConfig({ language: r.language }, { triggerRefetch: !1 }), this._warnIfMultipleBlocks();
109
113
  }
110
114
  /**
111
115
  * Called when the document changes or template is loaded
@@ -127,11 +131,11 @@ class W extends b {
127
131
  }
128
132
  this._healLingeringDuplicate(t), s.needsMigration(t) && this._migrateFromLegacy(t), this._healHidePriceAttr(t);
129
133
  try {
130
- k || (h(this.api), k = !0);
134
+ B || (_(this.api), B = !0);
131
135
  const e = s.getConfig(t), i = this._getBlockElement(t);
132
136
  if (i) {
133
137
  const n = !e.mobileLayoutEnabled;
134
- O(i) !== n && f(this.api, i, n);
138
+ w(i) !== n && I(this.api, i, n);
135
139
  }
136
140
  } catch {
137
141
  }
@@ -161,7 +165,7 @@ class W extends b {
161
165
  */
162
166
  _warnIfMultipleBlocks() {
163
167
  try {
164
- w().warnIfMultipleBlocks(this.api.getDocumentRootHtmlNode());
168
+ H().warnIfMultipleBlocks(this.api.getDocumentRootHtmlNode());
165
169
  } catch {
166
170
  }
167
171
  }
@@ -211,9 +215,9 @@ class W extends b {
211
215
  if (!o)
212
216
  return;
213
217
  let r = -1;
214
- for (let l = 0; l < n.length; l++)
215
- if (n[l] === o) {
216
- r = l;
218
+ for (let a = 0; a < n.length; a++)
219
+ if (n[a] === o) {
220
+ r = a;
217
221
  break;
218
222
  }
219
223
  if (r <= 0)
@@ -293,7 +297,7 @@ class W extends b {
293
297
  */
294
298
  _stampHidePrice(t, e) {
295
299
  const i = this._getBlockElement(t);
296
- i && this.api.getDocumentModifier().modifyHtml(i).setAttribute(I, String(e)).apply(new g("Stamp hide-price"));
300
+ i && this.api.getDocumentModifier().modifyHtml(i).setAttribute(R, String(e)).apply(new g("Stamp hide-price"));
297
301
  }
298
302
  /**
299
303
  * Stamps `hide-price` from config only when the block lacks the attribute —
@@ -301,7 +305,7 @@ class W extends b {
301
305
  */
302
306
  _healHidePriceAttr(t) {
303
307
  const e = this._getBlockElement(t);
304
- if (!e || !("getAttribute" in e) || e.getAttribute(I) !== null)
308
+ if (!e || !("getAttribute" in e) || e.getAttribute(R) !== null)
305
309
  return;
306
310
  const { priceHideIfSameAsDiscounted: i } = s.getConfig(t);
307
311
  this._stampHidePrice(t, i);
@@ -338,6 +342,6 @@ class W extends b {
338
342
  }
339
343
  }
340
344
  export {
341
- _ as BLOCK_ID,
342
- W as RecommendationBlock
345
+ k as BLOCK_ID,
346
+ j as RecommendationBlock
343
347
  };
@@ -1,13 +1,13 @@
1
- import { DEFAULT_COLUMN_SPACING as R, DEFAULT_ROW_SPACING as s, DEFAULT_MOBILE_ROW_SPACING as n, DEFAULT_MOBILE_COLUMN_SPACING as O, DEFAULT_MOBILE_CARDS_IN_ROW as e, DEFAULT_CARDS_IN_ROW as C } from "./layout.js";
2
- import { ATTR_PRODUCT_IMAGE as o, ATTR_PRODUCT_NAME as t, ATTR_PRODUCT_OLD_PRICE as _, ATTR_PRODUCT_PRICE as T, ATTR_PRODUCT_OMNIBUS_PRICE as r, ATTR_PRODUCT_OMNIBUS_DISCOUNT as I, ATTR_PRODUCT_BUTTON as i, ATTR_RECOMMENDATION_TITLE as U } from "./selectors.js";
3
- const A = 1, u = 2, D = {
1
+ import { DEFAULT_COLUMN_SPACING as i, DEFAULT_ROW_SPACING as s, DEFAULT_MOBILE_ROW_SPACING as n, DEFAULT_MOBILE_COLUMN_SPACING as O, DEFAULT_MOBILE_CARDS_IN_ROW as e, DEFAULT_CARDS_IN_ROW as C } from "./layout.js";
2
+ import { ATTR_PRODUCT_IMAGE as o, ATTR_PRODUCT_NAME as t, ATTR_PRODUCT_OLD_PRICE as _, ATTR_PRODUCT_PRICE as T, ATTR_PRODUCT_OMNIBUS_PRICE as I, ATTR_PRODUCT_OMNIBUS_DISCOUNT as R, ATTR_PRODUCT_BUTTON as r, ATTR_RECOMMENDATION_TITLE as E } from "./selectors.js";
3
+ const U = 1, u = 2, m = 2, A = {
4
4
  code: "USD",
5
5
  symbol: "USD",
6
6
  alignment: "after",
7
7
  decimalCount: 2,
8
8
  decimalSeparator: ".",
9
9
  thousandSeparator: ","
10
- }, E = {
10
+ }, D = {
11
11
  textBefore: "",
12
12
  textAfter: ""
13
13
  }, a = {
@@ -18,26 +18,26 @@ const A = 1, u = 2, D = {
18
18
  t,
19
19
  _,
20
20
  T,
21
- r,
22
21
  I,
23
- i
22
+ R,
23
+ r
24
24
  ], N = {
25
- [U]: !0,
25
+ [E]: !0,
26
26
  [o]: !0,
27
27
  [t]: !0,
28
28
  [T]: !0,
29
29
  [_]: !0,
30
- [r]: !1,
31
30
  [I]: !1,
32
- [i]: !0
33
- }, m = {
31
+ [R]: !1,
32
+ [r]: !0
33
+ }, L = {
34
34
  // Settings
35
35
  strategy: "mostPopular",
36
36
  productIds: [],
37
37
  size: "6",
38
38
  shuffleProducts: !1,
39
39
  language: "en_US",
40
- currency: D,
40
+ currency: A,
41
41
  filters: [],
42
42
  strategyId: "",
43
43
  // Layout
@@ -46,7 +46,7 @@ const A = 1, u = 2, D = {
46
46
  mobileCardsInRow: e,
47
47
  mobileLayoutEnabled: !1,
48
48
  previousMobileCardsInRow: e,
49
- columnSpacing: R,
49
+ columnSpacing: i,
50
50
  rowSpacing: s,
51
51
  mobileColumnSpacing: O,
52
52
  mobileRowSpacing: n,
@@ -55,7 +55,7 @@ const A = 1, u = 2, D = {
55
55
  visibility: N,
56
56
  previousTitleHtml: "",
57
57
  // Element settings
58
- omnibusPrice: E,
58
+ omnibusPrice: D,
59
59
  omnibusDiscount: a,
60
60
  textTrimming: !1,
61
61
  // Price placement (block-level, affects all cards)
@@ -66,17 +66,18 @@ const A = 1, u = 2, D = {
66
66
  // of "false" (the actual hiding happens server-side at send).
67
67
  priceHideIfSameAsDiscounted: !1,
68
68
  // Meta
69
- configVersion: A,
69
+ configVersion: U,
70
70
  recommendationId: 0
71
- }, L = [11, 12];
71
+ }, P = [11, 12];
72
72
  export {
73
73
  u as CURRENT_CONFIG_VERSION,
74
74
  c as DEFAULT_COMPOSITION,
75
- D as DEFAULT_CURRENCY,
76
- m as DEFAULT_NODE_CONFIG,
75
+ A as DEFAULT_CURRENCY,
76
+ L as DEFAULT_NODE_CONFIG,
77
77
  a as DEFAULT_OMNIBUS_DISCOUNT,
78
- E as DEFAULT_OMNIBUS_PRICE,
78
+ D as DEFAULT_OMNIBUS_PRICE,
79
79
  N as DEFAULT_VISIBILITY,
80
- L as EXCLUDED_ALGORITHM_IDS,
81
- A as PRE_RRS_CONFIG_VERSION
80
+ P as EXCLUDED_ALGORITHM_IDS,
81
+ U as PRE_RRS_CONFIG_VERSION,
82
+ m as RRS_CONFIG_VERSION
82
83
  };
@@ -1,27 +1,27 @@
1
1
  var m = Object.defineProperty;
2
- var C = (h, l, t) => l in h ? m(h, l, { enumerable: !0, configurable: !0, writable: !0, value: t }) : h[l] = t;
3
- var n = (h, l, t) => C(h, typeof l != "symbol" ? l + "" : l, t);
2
+ var C = (g, c, t) => c in g ? m(g, c, { enumerable: !0, configurable: !0, writable: !0, value: t }) : g[c] = t;
3
+ var n = (g, c, t) => C(g, typeof c != "symbol" ? c + "" : c, t);
4
4
  import { useConfig as p } 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 { CURRENT_CONFIG_VERSION as _, DEFAULT_NODE_CONFIG as a } 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 c } from "../../services/configService.js";
9
+ import { RecommendationConfigService as l } from "../../services/configService.js";
10
10
  import { useRecommendationExtensionStore as R } from "../../store/recommendation.js";
11
11
  import { registerNodeConfigWriter as b } from "../../utils/nodeConfigWriter.js";
12
12
  import { AlgorithmControl as T } from "./algorithm.js";
13
13
  import { ALGORITHM_CONTROL_ID as ut } from "./algorithm.js";
14
14
  import { CurrencyControl as P } from "./currency.js";
15
- import { CURRENCY_CONTROL_ID as ht } from "./currency.js";
15
+ import { CURRENCY_CONTROL_ID as gt } from "./currency.js";
16
16
  import { FiltersControl as S } from "./filters.js";
17
- import { FILTERS_CONTROL_ID as gt } from "./filters.js";
17
+ import { FILTERS_CONTROL_ID as ft } from "./filters.js";
18
18
  import { LayoutOrientationControl as O } from "./layoutOrientation.js";
19
19
  import { LAYOUT_ORIENTATION_CONTROL_ID as Ct } from "./layoutOrientation.js";
20
20
  import { LocaleControl as L } from "./locale.js";
21
21
  import { LOCALE_CONTROL_ID as yt } from "./locale.js";
22
- import { PricePlacementControl as E } from "./pricePlacement.js";
22
+ import { PricePlacementControl as k } from "./pricePlacement.js";
23
23
  import { PRICE_PLACEMENT_CONTROL_ID as _t } from "./pricePlacement.js";
24
- import { ProductCountControl as k } from "./productCount.js";
24
+ import { ProductCountControl as E } from "./productCount.js";
25
25
  import { PRODUCT_COUNT_CONTROL_ID as Rt } from "./productCount.js";
26
26
  import { ProductLayoutControl as F } from "./productLayout.js";
27
27
  import { PRODUCT_LAYOUT_CONTROL_ID as Tt } from "./productLayout.js";
@@ -30,9 +30,9 @@ import { SHUFFLE_CONTROL_ID as St } from "./shuffle.js";
30
30
  import { StrategyControl as w } from "./strategy.js";
31
31
  import { STRATEGY_CONTROL_ID as Lt } from "./strategy.js";
32
32
  import { setCurrencyAttributes as A, getBlockElement as v, isPartnerManagedBlock as x, updateProductContentInPlace as B, regenerateProductRowsWithStyles as U } from "./utils.js";
33
- import { adjustProductsToSize as kt, formatProductPrice as Ft, getCardComposition as Dt, getCurrentLayout as wt, getMainContainerTbody as At, regenerateMobileProductRows as vt, updatePricesInPlace as xt, updateSingleProductContent as Bt } from "./utils.js";
34
- import { useDebounceFn as f } from "../../../../../node_modules/@vueuse/shared/index.js";
35
- const $ = "ui-elements-recommendation-block";
33
+ import { adjustProductsToSize as Et, formatProductPrice as Ft, getCardComposition as Dt, getCurrentLayout as wt, getMainContainerTbody as At, regenerateMobileProductRows as vt, updatePricesInPlace as xt, updateSingleProductContent as Bt } from "./utils.js";
34
+ import { useDebounceFn as h } from "../../../../../node_modules/@vueuse/shared/index.js";
35
+ const W = "ui-elements-recommendation-block";
36
36
  class at extends N {
37
37
  constructor() {
38
38
  super(...arguments);
@@ -58,7 +58,7 @@ class at extends N {
58
58
  /**
59
59
  * Debounced product fetch to prevent rapid API calls during config changes
60
60
  */
61
- n(this, "_debouncedFetchProducts", f(async () => {
61
+ n(this, "_debouncedFetchProducts", h(async () => {
62
62
  try {
63
63
  await this.store.fetchRecommendationProducts();
64
64
  } finally {
@@ -76,7 +76,7 @@ class at extends N {
76
76
  * count. The store pads products to the configured size, so in-place only
77
77
  * fails when the size actually changed.
78
78
  */
79
- n(this, "_debouncedRegenerateWithProducts", f(() => {
79
+ n(this, "_debouncedRegenerateWithProducts", h(() => {
80
80
  const t = this.store.recommendationProducts;
81
81
  if (!this.currentNode || !this.api)
82
82
  return;
@@ -97,7 +97,7 @@ class at extends N {
97
97
  }, 100));
98
98
  }
99
99
  getId() {
100
- return $;
100
+ return W;
101
101
  }
102
102
  get _subControls() {
103
103
  return [
@@ -118,7 +118,7 @@ class at extends N {
118
118
  return this.rrsEnabled = p().isFeatureEnabled("reusableRecommendationStrategy"), this._subControls.forEach((e) => {
119
119
  var o;
120
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 k(), this.productLayoutControl = new F(), this.filtersControl = new S(), this.shuffleControl = new D(), this.pricePlacementControl = new E(), this.layoutOrientationControl = new O(), this.strategyControl = this.rrsEnabled ? new w() : null, this._subControls.forEach((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
122
  e && (e.api = this.api);
123
123
  }), `
124
124
  <div class="recommendation-controls-container">
@@ -140,14 +140,14 @@ class at extends N {
140
140
  const e = (i = this.getContainer()) == null ? void 0 : i.querySelector(".recommendation-controls-container");
141
141
  if (!e)
142
142
  return;
143
- const o = this._getRecommendationIdFromNode(t) === null ? null : c.getConfig(t), r = this.rrsEnabled && !!o && (!!(o != null && o.strategyId) || ((o == null ? void 0 : o.configVersion) ?? 0) >= _);
143
+ const o = this._getRecommendationIdFromNode(t) === null ? null : l.getConfig(t), r = this.rrsEnabled && !!o && (!!(o != null && o.strategyId) || ((o == null ? void 0 : o.configVersion) ?? 0) >= _);
144
144
  e.classList.toggle("strategy-block", r);
145
145
  }
146
146
  async onRender() {
147
147
  var o;
148
148
  b(this.api);
149
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), e !== null && ((o = this.store.blockStates[e]) != null && o.isInitialized)) {
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)) {
151
151
  this._initializeSubControls();
152
152
  return;
153
153
  }
@@ -209,18 +209,23 @@ class at extends N {
209
209
  const e = this.store.blockStates[t];
210
210
  if (!e)
211
211
  return;
212
- const o = JSON.stringify(c.getConfig(this.currentNode)), r = e.syncedConfigFingerprint;
212
+ const o = JSON.stringify(l.getConfig(this.currentNode)), r = e.syncedConfigFingerprint;
213
213
  e.syncedConfigFingerprint = o, r !== o && (this.pendingNodeConfigWrite || this._syncNodeConfigToStore());
214
214
  }
215
+ /** Whether the deferred write would move the node's strategyId — see the caller (SD-149916). */
216
+ _isPendingStrategyIdChange() {
217
+ const t = this.pendingNodeConfigWrite;
218
+ return t ? l.getConfig(this.currentNode).strategyId !== t.updates.strategyId : !1;
219
+ }
215
220
  _capturePendingNodeConfigWrite() {
216
221
  const t = this.store.currentRecommendationId;
217
222
  if (!this.currentNode || !this.api || t === null)
218
223
  return;
219
- const { filters: e, strategyId: o, size: r } = this.store.recommendationConfigs;
224
+ const { filters: e, strategy: o, strategyId: r, size: i } = this.store.recommendationConfigs;
220
225
  this.pendingNodeConfigWrite = {
221
226
  blockId: t,
222
227
  node: this.currentNode,
223
- updates: { filters: e, strategyId: o, size: r }
228
+ updates: { filters: e, strategy: o, strategyId: r, size: i }
224
229
  };
225
230
  }
226
231
  /**
@@ -235,7 +240,7 @@ class at extends N {
235
240
  */
236
241
  _stagePendingNodeConfig(t) {
237
242
  const e = this.pendingNodeConfigWrite;
238
- return !e || !this.currentNode ? !1 : (c.stageConfig(t, this.currentNode, e.updates), !0);
243
+ return !e || !this.currentNode ? !1 : (l.stageConfig(t, this.currentNode, e.updates), !0);
239
244
  }
240
245
  /**
241
246
  * Arms the guaranteed fallback write, once the product fetch has settled. The
@@ -259,12 +264,12 @@ class at extends N {
259
264
  const t = this.pendingNodeConfigWrite;
260
265
  if (this.pendingNodeConfigWrite = null, this._clearConfigFlush(), !t || !this.api)
261
266
  return;
262
- const e = t.blockId === this.store.currentRecommendationId && this.currentNode ? this.currentNode : t.node, o = c.getConfig(e);
263
- JSON.stringify(o.filters) === JSON.stringify(t.updates.filters) && o.strategyId === t.updates.strategyId && o.size === t.updates.size || c.updateConfig(this.api, e, t.updates, "Update recommendation filters");
267
+ const e = t.blockId === this.store.currentRecommendationId && this.currentNode ? this.currentNode : t.node, o = l.getConfig(e);
268
+ JSON.stringify(o.filters) === JSON.stringify(t.updates.filters) && o.strategy === t.updates.strategy && o.strategyId === t.updates.strategyId && o.size === t.updates.size || l.updateConfig(this.api, e, t.updates, "Update recommendation filters");
264
269
  }
265
270
  _syncNodeConfigToStore() {
266
271
  var r;
267
- const t = c.getConfig(this.currentNode), e = this.store.currentRecommendationId, o = e !== null && ((r = this.store.blockStates[e]) == null ? void 0 : r.isInitialized);
272
+ const t = l.getConfig(this.currentNode), e = this.store.currentRecommendationId, o = e !== null && ((r = this.store.blockStates[e]) == null ? void 0 : r.isInitialized);
268
273
  this.store.patchCurrentBlockConfig({
269
274
  strategy: t.strategy,
270
275
  strategyId: t.strategyId,
@@ -328,7 +333,7 @@ class at extends N {
328
333
  _applySmartDefaults() {
329
334
  if (!this.currentNode || !this.api)
330
335
  return;
331
- const t = c.getConfig(this.currentNode), e = {};
336
+ const t = l.getConfig(this.currentNode), e = {};
332
337
  let o = null, r = null, i = null;
333
338
  if (t.currency.code === a.currency.code) {
334
339
  const { currencyList: s } = this.store;
@@ -352,7 +357,7 @@ class at extends N {
352
357
  (d) => d.value === a.language
353
358
  ) || (i = s[0].value, e.language = i));
354
359
  }
355
- !o && !r && !i || (c.updateConfig(
360
+ !o && !r && !i || (l.updateConfig(
356
361
  this.api,
357
362
  this.currentNode,
358
363
  e,
@@ -413,19 +418,19 @@ class at extends N {
413
418
  return;
414
419
  }
415
420
  const s = t.$state.configVersion;
416
- s !== o && (o = s, this._capturePendingNodeConfigWrite(), this._debouncedFetchProducts());
417
- const u = t.recommendationProducts, d = u !== e, g = Array.isArray(u) && u.length > 0;
418
- d && g && (e = u, this._debouncedRegenerateWithProducts());
421
+ s !== o && (o = s, this._capturePendingNodeConfigWrite(), this._isPendingStrategyIdChange() && this._flushPendingNodeConfig(), this._debouncedFetchProducts());
422
+ const u = t.recommendationProducts, d = u !== e, f = Array.isArray(u) && u.length > 0;
423
+ d && f && (e = u, this._debouncedRegenerateWithProducts());
419
424
  });
420
425
  }
421
426
  }
422
427
  export {
423
428
  ut as ALGORITHM_CONTROL_ID,
424
429
  T as AlgorithmControl,
425
- $ as CONTROL_BLOCK_ID,
426
- ht as CURRENCY_CONTROL_ID,
430
+ W as CONTROL_BLOCK_ID,
431
+ gt as CURRENCY_CONTROL_ID,
427
432
  P as CurrencyControl,
428
- gt as FILTERS_CONTROL_ID,
433
+ ft as FILTERS_CONTROL_ID,
429
434
  S as FiltersControl,
430
435
  Ct as LAYOUT_ORIENTATION_CONTROL_ID,
431
436
  yt as LOCALE_CONTROL_ID,
@@ -434,15 +439,15 @@ export {
434
439
  _t as PRICE_PLACEMENT_CONTROL_ID,
435
440
  Rt as PRODUCT_COUNT_CONTROL_ID,
436
441
  Tt as PRODUCT_LAYOUT_CONTROL_ID,
437
- E as PricePlacementControl,
438
- k as ProductCountControl,
442
+ k as PricePlacementControl,
443
+ E as ProductCountControl,
439
444
  F as ProductLayoutControl,
440
445
  at as RecommendationBlockControl,
441
446
  St as SHUFFLE_CONTROL_ID,
442
447
  Lt as STRATEGY_CONTROL_ID,
443
448
  D as ShuffleControl,
444
449
  w as StrategyControl,
445
- kt as adjustProductsToSize,
450
+ Et as adjustProductsToSize,
446
451
  Ft as formatProductPrice,
447
452
  v as getBlockElement,
448
453
  Dt as getCardComposition,