@useinsider/guido 3.18.2-beta.dfce34a → 3.18.2-beta.ec1fd57
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.
- package/dist/components/Guido.vue.js +3 -3
- package/dist/components/Guido.vue2.js +30 -30
- package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +11 -13
- package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +52 -76
- package/dist/components/organisms/extensions/recommendation/RemoveStrategyModal.vue2.js +37 -23
- package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +18 -20
- package/dist/composables/useCustomInterfaceAppearance.js +46 -56
- package/dist/composables/useHtmlValidator.js +82 -87
- package/dist/composables/useRecommendation.js +35 -40
- package/dist/composables/useStripo.js +30 -30
- package/dist/config/migrator/itemsBlockMigrator.js +257 -167
- package/dist/enums/extensions/recommendationBlock.js +31 -38
- package/dist/extensions/Blocks/Items/constants/cardLayout.js +20 -0
- package/dist/extensions/Blocks/Items/controls/name/trimming.js +18 -17
- package/dist/extensions/Blocks/Items/controls/settingsControl.js +114 -105
- package/dist/extensions/Blocks/Items/enums/productEnums.js +14 -9
- package/dist/extensions/Blocks/Items/layouts/horizontal.html.js +11 -9
- package/dist/extensions/Blocks/Items/template.js +219 -204
- package/dist/extensions/Blocks/Recommendation/block.js +42 -61
- package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +20 -21
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +35 -40
- package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +52 -84
- package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +74 -74
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +140 -254
- package/dist/extensions/Blocks/Recommendation/utils/nodeConfigWriter.js +16 -26
- package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +12 -21
- package/dist/guido.css +1 -1
- package/dist/src/enums/extensions/recommendationBlock.d.ts +0 -2
- package/dist/src/extensions/Blocks/Items/constants/cardLayout.d.ts +44 -0
- package/dist/src/extensions/Blocks/Items/enums/productEnums.d.ts +3 -0
- package/dist/src/extensions/Blocks/Items/template.d.ts +19 -0
- package/dist/src/extensions/Blocks/Recommendation/block.d.ts +0 -10
- package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +0 -1
- package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +0 -2
- package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +0 -9
- package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +2 -7
- package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +0 -86
- package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +0 -4
- package/dist/src/stores/onboarding.d.ts +0 -377
- package/dist/static/styles/components/recommendation-strategy.css.js +4 -34
- package/dist/stores/onboarding.js +36 -41
- package/dist/utils/pairProductVariables.js +71 -71
- package/dist/utils/templatePreparation.js +55 -55
- package/package.json +1 -1
- package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.js +0 -21
- package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue2.js +0 -47
- package/dist/extensions/Blocks/Recommendation/utils/strategyCommit.js +0 -24
- package/dist/src/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.d.ts +0 -2
- package/dist/src/extensions/Blocks/Recommendation/utils/strategyCommit.d.ts +0 -14
- package/dist/static/styles/components/skeleton.css.js +0 -23
|
@@ -1,39 +1,37 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import { useConfig as
|
|
5
|
-
import { BlockId as
|
|
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
6
|
import { getMigrationBannerHtml as C } from "../../../utils/migrationBannerHtml.js";
|
|
7
|
-
import { Block as
|
|
8
|
-
import { CURRENT_CONFIG_VERSION as
|
|
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";
|
|
9
9
|
import { RECOMMENDATION_ID_ATTR as m } from "./constants/selectors.js";
|
|
10
|
-
import { regenerateMobileProductRows as
|
|
11
|
-
import { ensureMobileCssRulesExist as
|
|
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";
|
|
12
12
|
import { RecommendationConfigService as s } from "./services/configService.js";
|
|
13
13
|
import { useRecommendationExtensionStore as d } from "./store/recommendation.js";
|
|
14
|
-
import { getDefaultTemplate as
|
|
15
|
-
import { useRecommendationBlockWarning as
|
|
16
|
-
const
|
|
17
|
-
let
|
|
18
|
-
class
|
|
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 {
|
|
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
|
-
|
|
26
|
-
/** Ids already reset under their new name, so the deferred pass skips their stale snapshot. */
|
|
27
|
-
g(this, "_resetSourceIds", /* @__PURE__ */ new Set());
|
|
25
|
+
p(this, "_pendingBlockId", null);
|
|
28
26
|
}
|
|
29
27
|
getId() {
|
|
30
|
-
return
|
|
28
|
+
return _;
|
|
31
29
|
}
|
|
32
30
|
getIcon() {
|
|
33
31
|
return "recommendation-icon";
|
|
34
32
|
}
|
|
35
33
|
getBlockCompositionType() {
|
|
36
|
-
return
|
|
34
|
+
return A.CONTAINER;
|
|
37
35
|
}
|
|
38
36
|
getName() {
|
|
39
37
|
return this.api.translate("Recommendation Block");
|
|
@@ -45,7 +43,7 @@ class j extends E {
|
|
|
45
43
|
}
|
|
46
44
|
getSettingsPanelTitleHtml() {
|
|
47
45
|
return C(
|
|
48
|
-
|
|
46
|
+
_,
|
|
49
47
|
this.api.translate("Recommendation Block"),
|
|
50
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.")
|
|
51
49
|
);
|
|
@@ -68,7 +66,7 @@ class j extends E {
|
|
|
68
66
|
*/
|
|
69
67
|
getTemplate() {
|
|
70
68
|
const t = this._generateNextId();
|
|
71
|
-
return this._pendingBlockId = t,
|
|
69
|
+
return this._pendingBlockId = t, M(t);
|
|
72
70
|
}
|
|
73
71
|
/**
|
|
74
72
|
* Called when a new block is dropped into the template
|
|
@@ -81,37 +79,33 @@ class j extends E {
|
|
|
81
79
|
const e = this._getRecommendationId(t);
|
|
82
80
|
if (e !== null && e > 0) {
|
|
83
81
|
if (this._detectDuplicate(e)) {
|
|
84
|
-
this._handleDuplicate(t, e)
|
|
82
|
+
this._handleDuplicate(t, e);
|
|
85
83
|
return;
|
|
86
84
|
}
|
|
87
85
|
this._pendingBlockId === null && setTimeout(() => {
|
|
88
86
|
this._getBlockElement(t) && this._detectDuplicate(e) && this._handleDuplicate(t, e);
|
|
89
|
-
}, 0)
|
|
87
|
+
}, 0);
|
|
90
88
|
return;
|
|
91
89
|
}
|
|
92
90
|
const i = this._pendingBlockId ?? this._generateNextId();
|
|
93
91
|
this._pendingBlockId = null, this._assignRecommendationId(t, i);
|
|
94
|
-
const
|
|
92
|
+
const { config: n, wasFreshDrop: o } = s.initializeConfig(
|
|
95
93
|
this.api,
|
|
96
94
|
t,
|
|
97
95
|
{
|
|
98
96
|
recommendationId: i,
|
|
99
|
-
configVersion:
|
|
100
|
-
// An RRS block picks a strategy, not an algorithm, and its algorithm control is
|
|
101
|
-
// hidden. Keeping the `mostPopular` default would bake a most-popular feed URL
|
|
102
|
-
// at save for a block the user never configured.
|
|
103
|
-
...o ? { strategy: "" } : {}
|
|
97
|
+
configVersion: D().isFeatureEnabled("reusableRecommendationStrategy") ? E : S
|
|
104
98
|
}
|
|
105
|
-
),
|
|
106
|
-
if (
|
|
107
|
-
|
|
108
|
-
const
|
|
109
|
-
|
|
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({
|
|
110
104
|
currentNode: t,
|
|
111
105
|
documentModifier: this.api.getDocumentModifier()
|
|
112
106
|
}));
|
|
113
107
|
}
|
|
114
|
-
|
|
108
|
+
r.patchCurrentBlockConfig({ language: n.language }, { triggerRefetch: !1 }), this._warnIfMultipleBlocks();
|
|
115
109
|
}
|
|
116
110
|
/**
|
|
117
111
|
* Called when the document changes or template is loaded
|
|
@@ -133,11 +127,11 @@ class j extends E {
|
|
|
133
127
|
}
|
|
134
128
|
this._healLingeringDuplicate(t), s.needsMigration(t) && this._migrateFromLegacy(t), this._healHidePriceAttr(t);
|
|
135
129
|
try {
|
|
136
|
-
|
|
130
|
+
k || (h(this.api), k = !0);
|
|
137
131
|
const e = s.getConfig(t), i = this._getBlockElement(t);
|
|
138
132
|
if (i) {
|
|
139
133
|
const n = !e.mobileLayoutEnabled;
|
|
140
|
-
|
|
134
|
+
O(i) !== n && f(this.api, i, n);
|
|
141
135
|
}
|
|
142
136
|
} catch {
|
|
143
137
|
}
|
|
@@ -167,7 +161,7 @@ class j extends E {
|
|
|
167
161
|
*/
|
|
168
162
|
_warnIfMultipleBlocks() {
|
|
169
163
|
try {
|
|
170
|
-
|
|
164
|
+
w().warnIfMultipleBlocks(this.api.getDocumentRootHtmlNode());
|
|
171
165
|
} catch {
|
|
172
166
|
}
|
|
173
167
|
}
|
|
@@ -189,19 +183,6 @@ class j extends E {
|
|
|
189
183
|
}
|
|
190
184
|
return t + 1;
|
|
191
185
|
}
|
|
192
|
-
/**
|
|
193
|
-
* Drops the "already fetched" claims of a block that arrived holding a baked id
|
|
194
|
-
* (saved module, paste, duplicate), so the settings panel reads its strategy again.
|
|
195
|
-
*
|
|
196
|
-
* Deferred a tick: the collision handlers rename a sibling first, and either sibling can be
|
|
197
|
-
* the renamed one depending on where the module was dropped (SD-149916).
|
|
198
|
-
*/
|
|
199
|
-
_scheduleArrivalReset(t) {
|
|
200
|
-
h().isFeatureEnabled("reusableRecommendationStrategy") && setTimeout(() => {
|
|
201
|
-
const e = this._getRecommendationId(t);
|
|
202
|
-
e !== null && e > 0 && !this._resetSourceIds.delete(e) && d().resetArrivedBlock(e);
|
|
203
|
-
}, 0);
|
|
204
|
-
}
|
|
205
186
|
/**
|
|
206
187
|
* Heals a duplicate that slipped past the create-time `_detectDuplicate`
|
|
207
188
|
* scan (or that was persisted by an older template before SD-142352).
|
|
@@ -230,9 +211,9 @@ class j extends E {
|
|
|
230
211
|
if (!o)
|
|
231
212
|
return;
|
|
232
213
|
let r = -1;
|
|
233
|
-
for (let
|
|
234
|
-
if (n[
|
|
235
|
-
r =
|
|
214
|
+
for (let l = 0; l < n.length; l++)
|
|
215
|
+
if (n[l] === o) {
|
|
216
|
+
r = l;
|
|
236
217
|
break;
|
|
237
218
|
}
|
|
238
219
|
if (r <= 0)
|
|
@@ -256,7 +237,7 @@ class j extends E {
|
|
|
256
237
|
/** Assigns a fresh id to a duplicated block and syncs DOM, node config and store. */
|
|
257
238
|
_handleDuplicate(t, e) {
|
|
258
239
|
const i = this._reassignDuplicateId(t, e), n = d();
|
|
259
|
-
n.cloneBlockState(e, i), n.setCurrentBlock(i),
|
|
240
|
+
n.cloneBlockState(e, i), n.setCurrentBlock(i), this._warnIfMultipleBlocks();
|
|
260
241
|
}
|
|
261
242
|
/**
|
|
262
243
|
* Core id-reassignment for a duplicated block: rewrites the DOM
|
|
@@ -289,7 +270,7 @@ class j extends E {
|
|
|
289
270
|
if (!("getAttribute" in t))
|
|
290
271
|
return;
|
|
291
272
|
const n = `ins-recommendation-v3-block-${e}`, o = `ins-recommendation-v3-block-${i}`, r = this.api.getDocumentModifier();
|
|
292
|
-
r.modifyHtml(t).removeClass(n).setClass(o), r.apply(new
|
|
273
|
+
r.modifyHtml(t).removeClass(n).setClass(o), r.apply(new g(
|
|
293
274
|
`Reassign recommendation instance class ${n} -> ${o}`
|
|
294
275
|
));
|
|
295
276
|
}
|
|
@@ -304,7 +285,7 @@ class j extends E {
|
|
|
304
285
|
if (!i)
|
|
305
286
|
return;
|
|
306
287
|
const n = this.api.getDocumentModifier();
|
|
307
|
-
n.modifyHtml(i).setAttribute(m, e.toString()), n.apply(new
|
|
288
|
+
n.modifyHtml(i).setAttribute(m, e.toString()), n.apply(new g(`Assign recommendation ID ${e}`));
|
|
308
289
|
}
|
|
309
290
|
/**
|
|
310
291
|
* Stamps the `hide-price` attribute (read by email-service at send time) on
|
|
@@ -312,7 +293,7 @@ class j extends E {
|
|
|
312
293
|
*/
|
|
313
294
|
_stampHidePrice(t, e) {
|
|
314
295
|
const i = this._getBlockElement(t);
|
|
315
|
-
i && this.api.getDocumentModifier().modifyHtml(i).setAttribute(
|
|
296
|
+
i && this.api.getDocumentModifier().modifyHtml(i).setAttribute(I, String(e)).apply(new g("Stamp hide-price"));
|
|
316
297
|
}
|
|
317
298
|
/**
|
|
318
299
|
* Stamps `hide-price` from config only when the block lacks the attribute —
|
|
@@ -320,7 +301,7 @@ class j extends E {
|
|
|
320
301
|
*/
|
|
321
302
|
_healHidePriceAttr(t) {
|
|
322
303
|
const e = this._getBlockElement(t);
|
|
323
|
-
if (!e || !("getAttribute" in e) || e.getAttribute(
|
|
304
|
+
if (!e || !("getAttribute" in e) || e.getAttribute(I) !== null)
|
|
324
305
|
return;
|
|
325
306
|
const { priceHideIfSameAsDiscounted: i } = s.getConfig(t);
|
|
326
307
|
this._stampHidePrice(t, i);
|
|
@@ -357,6 +338,6 @@ class j extends E {
|
|
|
357
338
|
}
|
|
358
339
|
}
|
|
359
340
|
export {
|
|
360
|
-
|
|
361
|
-
|
|
341
|
+
_ as BLOCK_ID,
|
|
342
|
+
W as RecommendationBlock
|
|
362
343
|
};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { DEFAULT_COLUMN_SPACING as
|
|
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
|
|
3
|
-
const
|
|
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 = {
|
|
4
4
|
code: "USD",
|
|
5
5
|
symbol: "USD",
|
|
6
6
|
alignment: "after",
|
|
7
7
|
decimalCount: 2,
|
|
8
8
|
decimalSeparator: ".",
|
|
9
9
|
thousandSeparator: ","
|
|
10
|
-
},
|
|
10
|
+
}, E = {
|
|
11
11
|
textBefore: "",
|
|
12
12
|
textAfter: ""
|
|
13
13
|
}, a = {
|
|
@@ -18,26 +18,26 @@ const U = 1, u = 2, m = 2, A = {
|
|
|
18
18
|
t,
|
|
19
19
|
_,
|
|
20
20
|
T,
|
|
21
|
+
r,
|
|
21
22
|
I,
|
|
22
|
-
|
|
23
|
-
r
|
|
23
|
+
i
|
|
24
24
|
], N = {
|
|
25
|
-
[
|
|
25
|
+
[U]: !0,
|
|
26
26
|
[o]: !0,
|
|
27
27
|
[t]: !0,
|
|
28
28
|
[T]: !0,
|
|
29
29
|
[_]: !0,
|
|
30
|
+
[r]: !1,
|
|
30
31
|
[I]: !1,
|
|
31
|
-
[
|
|
32
|
-
|
|
33
|
-
}, L = {
|
|
32
|
+
[i]: !0
|
|
33
|
+
}, m = {
|
|
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:
|
|
40
|
+
currency: D,
|
|
41
41
|
filters: [],
|
|
42
42
|
strategyId: "",
|
|
43
43
|
// Layout
|
|
@@ -46,7 +46,7 @@ const U = 1, u = 2, m = 2, A = {
|
|
|
46
46
|
mobileCardsInRow: e,
|
|
47
47
|
mobileLayoutEnabled: !1,
|
|
48
48
|
previousMobileCardsInRow: e,
|
|
49
|
-
columnSpacing:
|
|
49
|
+
columnSpacing: R,
|
|
50
50
|
rowSpacing: s,
|
|
51
51
|
mobileColumnSpacing: O,
|
|
52
52
|
mobileRowSpacing: n,
|
|
@@ -55,7 +55,7 @@ const U = 1, u = 2, m = 2, A = {
|
|
|
55
55
|
visibility: N,
|
|
56
56
|
previousTitleHtml: "",
|
|
57
57
|
// Element settings
|
|
58
|
-
omnibusPrice:
|
|
58
|
+
omnibusPrice: E,
|
|
59
59
|
omnibusDiscount: a,
|
|
60
60
|
textTrimming: !1,
|
|
61
61
|
// Price placement (block-level, affects all cards)
|
|
@@ -66,18 +66,17 @@ const U = 1, u = 2, m = 2, A = {
|
|
|
66
66
|
// of "false" (the actual hiding happens server-side at send).
|
|
67
67
|
priceHideIfSameAsDiscounted: !1,
|
|
68
68
|
// Meta
|
|
69
|
-
configVersion:
|
|
69
|
+
configVersion: A,
|
|
70
70
|
recommendationId: 0
|
|
71
|
-
},
|
|
71
|
+
}, L = [11, 12];
|
|
72
72
|
export {
|
|
73
73
|
u as CURRENT_CONFIG_VERSION,
|
|
74
74
|
c as DEFAULT_COMPOSITION,
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
D as DEFAULT_CURRENCY,
|
|
76
|
+
m as DEFAULT_NODE_CONFIG,
|
|
77
77
|
a as DEFAULT_OMNIBUS_DISCOUNT,
|
|
78
|
-
|
|
78
|
+
E as DEFAULT_OMNIBUS_PRICE,
|
|
79
79
|
N as DEFAULT_VISIBILITY,
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
m as RRS_CONFIG_VERSION
|
|
80
|
+
L as EXCLUDED_ALGORITHM_IDS,
|
|
81
|
+
A as PRE_RRS_CONFIG_VERSION
|
|
83
82
|
};
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
var m = Object.defineProperty;
|
|
2
|
-
var C = (
|
|
3
|
-
var n = (
|
|
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);
|
|
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 {
|
|
7
|
+
import { CURRENT_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
|
|
9
|
+
import { RecommendationConfigService as c } 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
|
|
15
|
+
import { CURRENCY_CONTROL_ID as ht } from "./currency.js";
|
|
16
16
|
import { FiltersControl as S } from "./filters.js";
|
|
17
|
-
import { FILTERS_CONTROL_ID as
|
|
17
|
+
import { FILTERS_CONTROL_ID as gt } 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
|
|
22
|
+
import { PricePlacementControl as E } from "./pricePlacement.js";
|
|
23
23
|
import { PRICE_PLACEMENT_CONTROL_ID as _t } from "./pricePlacement.js";
|
|
24
|
-
import { ProductCountControl as
|
|
24
|
+
import { ProductCountControl as k } 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
|
|
34
|
-
import { useDebounceFn as
|
|
35
|
-
const
|
|
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";
|
|
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",
|
|
61
|
+
n(this, "_debouncedFetchProducts", f(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",
|
|
79
|
+
n(this, "_debouncedRegenerateWithProducts", f(() => {
|
|
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 $;
|
|
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
|
|
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) => {
|
|
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 :
|
|
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) >= _);
|
|
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),
|
|
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)) {
|
|
151
151
|
this._initializeSubControls();
|
|
152
152
|
return;
|
|
153
153
|
}
|
|
@@ -209,23 +209,18 @@ class at extends N {
|
|
|
209
209
|
const e = this.store.blockStates[t];
|
|
210
210
|
if (!e)
|
|
211
211
|
return;
|
|
212
|
-
const o = JSON.stringify(
|
|
212
|
+
const o = JSON.stringify(c.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
|
-
}
|
|
220
215
|
_capturePendingNodeConfigWrite() {
|
|
221
216
|
const t = this.store.currentRecommendationId;
|
|
222
217
|
if (!this.currentNode || !this.api || t === null)
|
|
223
218
|
return;
|
|
224
|
-
const { filters: e,
|
|
219
|
+
const { filters: e, strategyId: o, size: r } = this.store.recommendationConfigs;
|
|
225
220
|
this.pendingNodeConfigWrite = {
|
|
226
221
|
blockId: t,
|
|
227
222
|
node: this.currentNode,
|
|
228
|
-
updates: { filters: e,
|
|
223
|
+
updates: { filters: e, strategyId: o, size: r }
|
|
229
224
|
};
|
|
230
225
|
}
|
|
231
226
|
/**
|
|
@@ -240,7 +235,7 @@ class at extends N {
|
|
|
240
235
|
*/
|
|
241
236
|
_stagePendingNodeConfig(t) {
|
|
242
237
|
const e = this.pendingNodeConfigWrite;
|
|
243
|
-
return !e || !this.currentNode ? !1 : (
|
|
238
|
+
return !e || !this.currentNode ? !1 : (c.stageConfig(t, this.currentNode, e.updates), !0);
|
|
244
239
|
}
|
|
245
240
|
/**
|
|
246
241
|
* Arms the guaranteed fallback write, once the product fetch has settled. The
|
|
@@ -264,12 +259,12 @@ class at extends N {
|
|
|
264
259
|
const t = this.pendingNodeConfigWrite;
|
|
265
260
|
if (this.pendingNodeConfigWrite = null, this._clearConfigFlush(), !t || !this.api)
|
|
266
261
|
return;
|
|
267
|
-
const e = t.blockId === this.store.currentRecommendationId && this.currentNode ? this.currentNode : t.node, o =
|
|
268
|
-
JSON.stringify(o.filters) === JSON.stringify(t.updates.filters) && o.
|
|
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");
|
|
269
264
|
}
|
|
270
265
|
_syncNodeConfigToStore() {
|
|
271
266
|
var r;
|
|
272
|
-
const t =
|
|
267
|
+
const t = c.getConfig(this.currentNode), e = this.store.currentRecommendationId, o = e !== null && ((r = this.store.blockStates[e]) == null ? void 0 : r.isInitialized);
|
|
273
268
|
this.store.patchCurrentBlockConfig({
|
|
274
269
|
strategy: t.strategy,
|
|
275
270
|
strategyId: t.strategyId,
|
|
@@ -333,7 +328,7 @@ class at extends N {
|
|
|
333
328
|
_applySmartDefaults() {
|
|
334
329
|
if (!this.currentNode || !this.api)
|
|
335
330
|
return;
|
|
336
|
-
const t =
|
|
331
|
+
const t = c.getConfig(this.currentNode), e = {};
|
|
337
332
|
let o = null, r = null, i = null;
|
|
338
333
|
if (t.currency.code === a.currency.code) {
|
|
339
334
|
const { currencyList: s } = this.store;
|
|
@@ -357,7 +352,7 @@ class at extends N {
|
|
|
357
352
|
(d) => d.value === a.language
|
|
358
353
|
) || (i = s[0].value, e.language = i));
|
|
359
354
|
}
|
|
360
|
-
!o && !r && !i || (
|
|
355
|
+
!o && !r && !i || (c.updateConfig(
|
|
361
356
|
this.api,
|
|
362
357
|
this.currentNode,
|
|
363
358
|
e,
|
|
@@ -418,19 +413,19 @@ class at extends N {
|
|
|
418
413
|
return;
|
|
419
414
|
}
|
|
420
415
|
const s = t.$state.configVersion;
|
|
421
|
-
s !== o && (o = s, this._capturePendingNodeConfigWrite(), this.
|
|
422
|
-
const u = t.recommendationProducts, d = u !== e,
|
|
423
|
-
d &&
|
|
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());
|
|
424
419
|
});
|
|
425
420
|
}
|
|
426
421
|
}
|
|
427
422
|
export {
|
|
428
423
|
ut as ALGORITHM_CONTROL_ID,
|
|
429
424
|
T as AlgorithmControl,
|
|
430
|
-
|
|
431
|
-
|
|
425
|
+
$ as CONTROL_BLOCK_ID,
|
|
426
|
+
ht as CURRENCY_CONTROL_ID,
|
|
432
427
|
P as CurrencyControl,
|
|
433
|
-
|
|
428
|
+
gt as FILTERS_CONTROL_ID,
|
|
434
429
|
S as FiltersControl,
|
|
435
430
|
Ct as LAYOUT_ORIENTATION_CONTROL_ID,
|
|
436
431
|
yt as LOCALE_CONTROL_ID,
|
|
@@ -439,15 +434,15 @@ export {
|
|
|
439
434
|
_t as PRICE_PLACEMENT_CONTROL_ID,
|
|
440
435
|
Rt as PRODUCT_COUNT_CONTROL_ID,
|
|
441
436
|
Tt as PRODUCT_LAYOUT_CONTROL_ID,
|
|
442
|
-
|
|
443
|
-
|
|
437
|
+
E as PricePlacementControl,
|
|
438
|
+
k as ProductCountControl,
|
|
444
439
|
F as ProductLayoutControl,
|
|
445
440
|
at as RecommendationBlockControl,
|
|
446
441
|
St as SHUFFLE_CONTROL_ID,
|
|
447
442
|
Lt as STRATEGY_CONTROL_ID,
|
|
448
443
|
D as ShuffleControl,
|
|
449
444
|
w as StrategyControl,
|
|
450
|
-
|
|
445
|
+
kt as adjustProductsToSize,
|
|
451
446
|
Ft as formatProductPrice,
|
|
452
447
|
v as getBlockElement,
|
|
453
448
|
Dt as getCardComposition,
|