@useinsider/guido 3.16.0-beta.c615198 → 3.16.0-beta.ca26c4e
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/composables/useRecommendation.js +19 -20
- package/dist/config/migrator/itemsBlockMigrator.js +1 -1
- package/dist/enums/recommendation.js +17 -17
- package/dist/extensions/Blocks/Items/enums/productEnums.js +45 -45
- package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +26 -37
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +21 -21
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +12 -13
- package/package.json +1 -1
- package/dist/extensions/Blocks/Recommendation/utils/productIds.js +0 -6
- package/dist/src/extensions/Blocks/Recommendation/utils/productIds.d.ts +0 -6
|
@@ -3,21 +3,20 @@ import { MinDeviceViewport as C, DefaultPadding as b } from "../enums/recommenda
|
|
|
3
3
|
import { useRecommendationExtensionStore as l } from "../extensions/Blocks/Recommendation/store/recommendation.js";
|
|
4
4
|
import { generateCompleteFilterQuery as h } from "../extensions/Blocks/Recommendation/utils/filterUtil.js";
|
|
5
5
|
import { getPartnerRecommendationParams as y } from "../extensions/Blocks/Recommendation/utils/partnerCustomizations.js";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
const B = () => ({
|
|
6
|
+
import { useConfigStore as x } from "../stores/config.js";
|
|
7
|
+
const k = () => ({
|
|
9
8
|
calculateCardWidth: ({
|
|
10
9
|
mobileLeftPadding: a,
|
|
11
10
|
mobileRightPadding: s,
|
|
12
11
|
cardsInRow: c,
|
|
13
|
-
unresponsive:
|
|
12
|
+
unresponsive: o
|
|
14
13
|
}) => {
|
|
15
|
-
const r =
|
|
14
|
+
const r = o ? c : 1, e = a + s + (r - 1) * b;
|
|
16
15
|
return (C - e) / r;
|
|
17
16
|
},
|
|
18
17
|
getRecommendationCampaignData: (a) => {
|
|
19
|
-
const s = l(), c = Number(a),
|
|
20
|
-
if (!
|
|
18
|
+
const s = l(), c = Number(a), o = s.blockStates[c];
|
|
19
|
+
if (!o)
|
|
21
20
|
return {
|
|
22
21
|
textTrimming: !1,
|
|
23
22
|
orientation: "vertical",
|
|
@@ -30,7 +29,7 @@ const B = () => ({
|
|
|
30
29
|
discountBeforeTextValue: "",
|
|
31
30
|
discountAfterTextValue: ""
|
|
32
31
|
};
|
|
33
|
-
const { recommendationConfigs: r } =
|
|
32
|
+
const { recommendationConfigs: r } = o, e = r.orientation === "grid" ? "vertical" : "horizontal";
|
|
34
33
|
return {
|
|
35
34
|
textTrimming: r.textTrimming,
|
|
36
35
|
orientation: e,
|
|
@@ -46,7 +45,7 @@ const B = () => ({
|
|
|
46
45
|
},
|
|
47
46
|
buildCampaignUrl: (a, s) => {
|
|
48
47
|
var m;
|
|
49
|
-
const c = l(),
|
|
48
|
+
const c = l(), o = x(), r = Number(a);
|
|
50
49
|
let e;
|
|
51
50
|
if (s)
|
|
52
51
|
e = s;
|
|
@@ -54,25 +53,25 @@ const B = () => ({
|
|
|
54
53
|
const i = c.blockStates[r];
|
|
55
54
|
if (!i)
|
|
56
55
|
return "";
|
|
57
|
-
const { recommendationConfigs:
|
|
56
|
+
const { recommendationConfigs: n } = i;
|
|
58
57
|
e = {
|
|
59
|
-
strategy:
|
|
60
|
-
language:
|
|
61
|
-
currencyCode:
|
|
62
|
-
size:
|
|
63
|
-
productIds:
|
|
64
|
-
filters:
|
|
65
|
-
shuffleProducts:
|
|
58
|
+
strategy: n.strategy,
|
|
59
|
+
language: n.language,
|
|
60
|
+
currencyCode: n.currencySettings.value,
|
|
61
|
+
size: n.size,
|
|
62
|
+
productIds: n.productIds,
|
|
63
|
+
filters: n.filters,
|
|
64
|
+
shuffleProducts: n.shuffleProducts
|
|
66
65
|
};
|
|
67
66
|
}
|
|
68
67
|
const f = ((m = I().find((i) => i.key === e.strategy)) == null ? void 0 : m.path) || "", t = new URLSearchParams();
|
|
69
|
-
t.set("locale", e.language), t.set("currency", e.currencyCode), t.set("partnerName",
|
|
68
|
+
t.set("locale", e.language), t.set("currency", e.currencyCode), t.set("partnerName", o.partnerName), t.set("size", e.size), t.set("details", "true"), t.set("campaignId", o.variationId), e.strategy === "manualMerchandising" ? t.set("productId", e.productIds.join(",")) : e.strategy === "similarViewed" && t.set("productId", "{itemId}"), e.strategy === "userBased" && t.set("userId", "{user_id}");
|
|
70
69
|
const g = e.filters.filter((i) => i.isValid), d = h(g);
|
|
71
|
-
d && t.set("filter", d), e.shuffleProducts && t.set("shuffle", "true"), Object.entries(y(
|
|
70
|
+
d && t.set("filter", d), e.shuffleProducts && t.set("shuffle", "true"), Object.entries(y(o.partnerName, e.strategy)).forEach(([i, n]) => t.set(i, n));
|
|
72
71
|
const p = decodeURIComponent(t.toString()), u = `${R.RECOMMENDATION_API_URL}/v2/${f}?${p}`;
|
|
73
72
|
return c.recommendationCampaignUrls[a] = u, u;
|
|
74
73
|
}
|
|
75
74
|
});
|
|
76
75
|
export {
|
|
77
|
-
|
|
76
|
+
k as useRecommendation
|
|
78
77
|
};
|
|
@@ -381,7 +381,7 @@ class H {
|
|
|
381
381
|
* Supports all block types by detecting prefix and using appropriate type:
|
|
382
382
|
*
|
|
383
383
|
* Examples:
|
|
384
|
-
* - {{ins_apr_img_1}} → https://
|
|
384
|
+
* - {{ins_apr_img_1}} → https://web-image.useinsider.com/.../img_1.jpeg (CART_ITEMS)
|
|
385
385
|
* - {{browsed_item_name_2}} → 'Set of Sprite Yoga Straps' (BROWSED_ITEMS)
|
|
386
386
|
* - {{purchased_item_formattedprice_5}} → '1,490.49' (PURCHASED_ITEMS)
|
|
387
387
|
*/
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
const e = 20,
|
|
1
|
+
const e = 20, t = 320, s = "vertical", m = {
|
|
2
2
|
CART_ABANDONMENT: {
|
|
3
|
-
ins_apr_img_1: "https://
|
|
4
|
-
ins_apr_img_2: "https://
|
|
5
|
-
ins_apr_img_3: "https://
|
|
6
|
-
ins_apr_img_4: "https://
|
|
3
|
+
ins_apr_img_1: "https://web-image.useinsider.com/email-assets/dummyImages/ins_apr_img_1.png",
|
|
4
|
+
ins_apr_img_2: "https://web-image.useinsider.com/email-assets/dummyImages/ins_apr_img_2.png",
|
|
5
|
+
ins_apr_img_3: "https://web-image.useinsider.com/email-assets/dummyImages/ins_apr_img_3.png",
|
|
6
|
+
ins_apr_img_4: "https://web-image.useinsider.com/email-assets/dummyImages/ins_apr_img_4.png"
|
|
7
7
|
},
|
|
8
8
|
BROWSE_ABANDONMENT: {
|
|
9
|
-
browsed_item_img_1: "https://
|
|
10
|
-
browsed_item_img_2: "https://
|
|
11
|
-
browsed_item_img_3: "https://
|
|
12
|
-
browsed_item_img_4: "https://
|
|
9
|
+
browsed_item_img_1: "https://web-image.useinsider.com/email-assets/dummyImages/browsed_item_img_1.jpg",
|
|
10
|
+
browsed_item_img_2: "https://web-image.useinsider.com/email-assets/dummyImages/browsed_item_img_2.jpg",
|
|
11
|
+
browsed_item_img_3: "https://web-image.useinsider.com/email-assets/dummyImages/browsed_item_img_3.jpg",
|
|
12
|
+
browsed_item_img_4: "https://web-image.useinsider.com/email-assets/dummyImages/browsed_item_img_4.jpg"
|
|
13
13
|
}
|
|
14
14
|
}, i = {
|
|
15
15
|
DISCOUNT: "discount",
|
|
@@ -23,7 +23,7 @@ const e = 20, s = 320, t = "vertical", m = {
|
|
|
23
23
|
},
|
|
24
24
|
ELSE: "{% else %}",
|
|
25
25
|
END_IF: "{% endif %}"
|
|
26
|
-
},
|
|
26
|
+
}, n = {
|
|
27
27
|
ID: /recommendation-id="(.*?)"/gi,
|
|
28
28
|
ATTRIBUTE_PARAGRAPH: /<p[^>]*?product-attr="(discount|omnibus_discount|omnibus_price)"[^>]*>[\S\s]*?<\/p>/gm,
|
|
29
29
|
ATTRIBUTE_PARAGRAPH_START_TAG: /<p[^>]*?product-attr="(discount|omnibus_discount|omnibus_price)"[^>]*>/gm,
|
|
@@ -31,9 +31,9 @@ const e = 20, s = 320, t = "vertical", m = {
|
|
|
31
31
|
CUSTOM_FIELD: /{{(?:reco_)?[0-9]+_[0-8]_(discount|omnibus_discount|omnibus_price)}}/gm,
|
|
32
32
|
CUSTOM_FIELD_INDEXES_PART: /{{(?:reco_)?[0-9]+_[0-8]_/gm,
|
|
33
33
|
CUSTOM_FIELD_NAME_PART: /_(discount|omnibus_discount|omnibus_price)}}/gm
|
|
34
|
-
}, n = {
|
|
35
|
-
PARAGRAPH_END_TAG: "</p>"
|
|
36
34
|
}, o = {
|
|
35
|
+
PARAGRAPH_END_TAG: "</p>"
|
|
36
|
+
}, a = {
|
|
37
37
|
REGULAR_NAME_HEIGHT: ".ext-product-name.ins-vertical p { height:90px!important;",
|
|
38
38
|
TRIMMED_NAME_HEIGHT: ".ext-product-name.ins-vertical p { height:18px!important;",
|
|
39
39
|
ELLIPSIS: "text-overflow:ellipsis!important; white-space:nowrap!important;",
|
|
@@ -47,11 +47,11 @@ const e = 20, s = 320, t = "vertical", m = {
|
|
|
47
47
|
export {
|
|
48
48
|
i as ATTRIBUTES,
|
|
49
49
|
_ as CONDITIONS,
|
|
50
|
-
|
|
50
|
+
a as CSS,
|
|
51
51
|
m as DUMMY_IMAGE_MAPPINGS,
|
|
52
52
|
e as DefaultPadding,
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
o as HTML,
|
|
54
|
+
t as MinDeviceViewport,
|
|
55
|
+
n as REGEX,
|
|
56
|
+
s as VerticalOrientation
|
|
57
57
|
};
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
const
|
|
1
|
+
import E from "../../../../node_modules/lodash-es/flatMap.js";
|
|
2
|
+
import s from "../../../../node_modules/lodash-es/range.js";
|
|
3
|
+
const t = '<td align="center" class="ins-product-td items-block items-block-v2">', r = { PAIRS_FOR_EXTENSION: {
|
|
4
4
|
imageSrc: {
|
|
5
5
|
CART_ITEMS: {
|
|
6
6
|
ATTR: "ins_apr_img",
|
|
7
7
|
DEFAULT: [
|
|
8
|
-
"https://
|
|
9
|
-
"https://
|
|
10
|
-
"https://
|
|
11
|
-
"https://
|
|
12
|
-
"https://
|
|
13
|
-
"https://
|
|
14
|
-
"https://
|
|
15
|
-
"https://
|
|
8
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_1.jpeg",
|
|
9
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_2.webp",
|
|
10
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_3.jpeg",
|
|
11
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_4.jpeg",
|
|
12
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_5.jpeg",
|
|
13
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_6.jpeg",
|
|
14
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_7.jpeg",
|
|
15
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_8.jpeg"
|
|
16
16
|
]
|
|
17
17
|
},
|
|
18
18
|
BROWSED_ITEMS: {
|
|
19
19
|
ATTR: "browsed_item_img",
|
|
20
20
|
DEFAULT: [
|
|
21
|
-
"https://
|
|
22
|
-
"https://
|
|
23
|
-
"https://
|
|
24
|
-
"https://
|
|
25
|
-
"https://
|
|
26
|
-
"https://
|
|
27
|
-
"https://
|
|
28
|
-
"https://
|
|
21
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_1.jpeg",
|
|
22
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_2.webp",
|
|
23
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_3.jpeg",
|
|
24
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_4.jpeg",
|
|
25
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_5.jpeg",
|
|
26
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_6.jpeg",
|
|
27
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_7.jpeg",
|
|
28
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_8.jpeg"
|
|
29
29
|
]
|
|
30
30
|
},
|
|
31
31
|
PURCHASED_ITEMS: {
|
|
32
32
|
ATTR: "purchased_item_img",
|
|
33
33
|
DEFAULT: [
|
|
34
|
-
"https://
|
|
35
|
-
"https://
|
|
36
|
-
"https://
|
|
37
|
-
"https://
|
|
38
|
-
"https://
|
|
39
|
-
"https://
|
|
40
|
-
"https://
|
|
41
|
-
"https://
|
|
34
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_1.jpeg",
|
|
35
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_2.webp",
|
|
36
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_3.jpeg",
|
|
37
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_4.jpeg",
|
|
38
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_5.jpeg",
|
|
39
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_6.jpeg",
|
|
40
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_7.jpeg",
|
|
41
|
+
"https://web-image.useinsider.com/email-assets/dummyImages/products/ins_apr_img_8.jpeg"
|
|
42
42
|
]
|
|
43
43
|
}
|
|
44
44
|
},
|
|
@@ -211,27 +211,27 @@ const T = '<td align="center" class="ins-product-td items-block items-block-v2">
|
|
|
211
211
|
}
|
|
212
212
|
}
|
|
213
213
|
} };
|
|
214
|
-
function
|
|
215
|
-
return
|
|
214
|
+
function a(e, i = 8) {
|
|
215
|
+
return s(1, i + 1).map((_) => `${e}_${_}`);
|
|
216
216
|
}
|
|
217
|
-
function
|
|
218
|
-
const { PAIRS_FOR_EXTENSION: e } =
|
|
219
|
-
return
|
|
217
|
+
function R() {
|
|
218
|
+
const { PAIRS_FOR_EXTENSION: e } = r, i = [];
|
|
219
|
+
return i.push(
|
|
220
220
|
e.imageSrc.CART_ITEMS.ATTR,
|
|
221
221
|
e.imageSrc.BROWSED_ITEMS.ATTR,
|
|
222
222
|
e.imageSrc.PURCHASED_ITEMS.ATTR
|
|
223
|
-
),
|
|
223
|
+
), i.push(
|
|
224
224
|
e.name.CART_ITEMS.ATTR,
|
|
225
225
|
e.name.CART_ITEMS.HREF,
|
|
226
226
|
e.name.BROWSED_ITEMS.ATTR,
|
|
227
227
|
e.name.BROWSED_ITEMS.HREF,
|
|
228
228
|
e.name.PURCHASED_ITEMS.ATTR,
|
|
229
229
|
e.name.PURCHASED_ITEMS.HREF
|
|
230
|
-
),
|
|
230
|
+
), i.push(
|
|
231
231
|
e.quantity.CART_ITEMS.ATTR,
|
|
232
232
|
e.quantity.BROWSED_ITEMS.ATTR,
|
|
233
233
|
e.quantity.PURCHASED_ITEMS.ATTR
|
|
234
|
-
),
|
|
234
|
+
), i.push(
|
|
235
235
|
e.price.CART_ITEMS.PRICE,
|
|
236
236
|
e.price.CART_ITEMS.PRICE_FORMATTED,
|
|
237
237
|
e.price.CART_ITEMS.SINGLE_PRICE,
|
|
@@ -247,7 +247,7 @@ function r() {
|
|
|
247
247
|
e.price.PURCHASED_ITEMS.SINGLE_PRICE,
|
|
248
248
|
e.price.PURCHASED_ITEMS.SINGLE_PRICE_FORMATTED,
|
|
249
249
|
e.price.PURCHASED_ITEMS.CURRENCY
|
|
250
|
-
),
|
|
250
|
+
), i.push(
|
|
251
251
|
e.originalPrice.CART_ITEMS.PRICE,
|
|
252
252
|
e.originalPrice.CART_ITEMS.PRICE_FORMATTED,
|
|
253
253
|
e.originalPrice.CART_ITEMS.SINGLE_PRICE,
|
|
@@ -263,22 +263,22 @@ function r() {
|
|
|
263
263
|
e.originalPrice.PURCHASED_ITEMS.SINGLE_PRICE,
|
|
264
264
|
e.originalPrice.PURCHASED_ITEMS.SINGLE_PRICE_FORMATTED,
|
|
265
265
|
e.originalPrice.PURCHASED_ITEMS.CURRENCY
|
|
266
|
-
),
|
|
266
|
+
), i.push(
|
|
267
267
|
e.button.CART_ITEMS.HREF,
|
|
268
268
|
e.button.BROWSED_ITEMS.HREF,
|
|
269
269
|
e.button.PURCHASED_ITEMS.HREF
|
|
270
|
-
),
|
|
270
|
+
), i.push(
|
|
271
271
|
e.itemLink.CART_ITEMS.HREF,
|
|
272
272
|
e.itemLink.BROWSED_ITEMS.HREF,
|
|
273
273
|
e.itemLink.PURCHASED_ITEMS.HREF
|
|
274
|
-
),
|
|
274
|
+
), i;
|
|
275
275
|
}
|
|
276
|
-
const
|
|
277
|
-
|
|
278
|
-
(e) =>
|
|
276
|
+
const p = E(
|
|
277
|
+
R(),
|
|
278
|
+
(e) => a(e)
|
|
279
279
|
);
|
|
280
280
|
export {
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
281
|
+
p as itemsBlockDynamicVariables,
|
|
282
|
+
r as productPairs,
|
|
283
|
+
t as templateFirstLine
|
|
284
284
|
};
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import { UEAttr as
|
|
5
|
-
import { CommonControl as
|
|
1
|
+
var c = Object.defineProperty;
|
|
2
|
+
var l = (s, o, t) => o in s ? c(s, o, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[o] = t;
|
|
3
|
+
var a = (s, o, t) => l(s, typeof o != "symbol" ? o + "" : o, t);
|
|
4
|
+
import { UEAttr as h } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
5
|
+
import { CommonControl as d } from "../../../common-control.js";
|
|
6
6
|
import { RecommendationConfigService as n } from "../../services/configService.js";
|
|
7
7
|
import { useRecommendationExtensionStore as m } from "../../store/recommendation.js";
|
|
8
|
-
import { mapLegacyStrategy as
|
|
9
|
-
const
|
|
8
|
+
import { mapLegacyStrategy as g } from "../../utils/legacyStrategyMap.js";
|
|
9
|
+
const u = "recommendation-algorithm-control", i = {
|
|
10
10
|
ALGORITHM: "strategy",
|
|
11
11
|
PRODUCT_IDS: "productIds"
|
|
12
12
|
};
|
|
13
|
-
class R extends
|
|
13
|
+
class R extends d {
|
|
14
14
|
constructor() {
|
|
15
15
|
super(...arguments);
|
|
16
16
|
// Store is used ONLY for API-fetched data (algorithms list), not for config
|
|
17
|
-
|
|
17
|
+
a(this, "store", m());
|
|
18
18
|
}
|
|
19
19
|
getId() {
|
|
20
|
-
return
|
|
20
|
+
return u;
|
|
21
21
|
}
|
|
22
22
|
getTemplate() {
|
|
23
23
|
return `
|
|
@@ -46,10 +46,11 @@ class R extends g {
|
|
|
46
46
|
super.onTemplateNodeUpdated(t), this._initializeSelectItems(), this._setFormValues();
|
|
47
47
|
}
|
|
48
48
|
_setFormValues() {
|
|
49
|
-
const t = n.getConfig(this.currentNode), e =
|
|
50
|
-
this._setProductIdsVisibility(e)
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
const t = n.getConfig(this.currentNode), e = g(t.strategy) ?? t.strategy;
|
|
50
|
+
this._setProductIdsVisibility(e), this.api.updateValues({
|
|
51
|
+
[i.ALGORITHM]: e,
|
|
52
|
+
[i.PRODUCT_IDS]: t.productIds.join(",")
|
|
53
|
+
});
|
|
53
54
|
}
|
|
54
55
|
_initializeSelectItems() {
|
|
55
56
|
var e;
|
|
@@ -58,47 +59,35 @@ class R extends g {
|
|
|
58
59
|
try {
|
|
59
60
|
this.api.setUIEAttribute(
|
|
60
61
|
i.ALGORITHM,
|
|
61
|
-
|
|
62
|
+
h.SELECTPICKER.items,
|
|
62
63
|
t
|
|
63
64
|
);
|
|
64
|
-
} catch (
|
|
65
|
-
console.warn("[AlgorithmControl] Failed to set algorithm options:",
|
|
65
|
+
} catch (r) {
|
|
66
|
+
console.warn("[AlgorithmControl] Failed to set algorithm options:", r);
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
_setProductIdsVisibility(t) {
|
|
69
|
-
const
|
|
70
|
-
this.api.setVisibility(i.PRODUCT_IDS,
|
|
70
|
+
const r = (t ?? n.getConfig(this.currentNode).strategy) === "manualMerchandising";
|
|
71
|
+
this.api.setVisibility(i.PRODUCT_IDS, r), this.api.setVisibility(`${i.PRODUCT_IDS}_label`, r);
|
|
71
72
|
}
|
|
72
73
|
_onAlgorithmChange(t) {
|
|
73
|
-
|
|
74
|
-
return;
|
|
75
|
-
const e = n.getConfig(this.currentNode);
|
|
76
|
-
if (e.strategy === t) {
|
|
77
|
-
this.store.recommendationConfigs.strategy !== t && this.store.patchCurrentBlockConfig({ strategy: e.strategy, filters: e.filters });
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
n.updateConfig(
|
|
74
|
+
!this.currentNode || n.getConfig(this.currentNode).strategy === t || (n.updateConfig(
|
|
81
75
|
this.api,
|
|
82
76
|
this.currentNode,
|
|
83
77
|
{ strategy: t },
|
|
84
78
|
`Changed algorithm to ${t}`
|
|
85
|
-
), this.store.patchCurrentBlockConfig({ strategy: t }), this._setProductIdsVisibility(t);
|
|
79
|
+
), this.store.patchCurrentBlockConfig({ strategy: t }), this._setProductIdsVisibility(t));
|
|
86
80
|
}
|
|
87
81
|
_onProductIdsChange(t) {
|
|
88
82
|
if (!this.currentNode)
|
|
89
83
|
return;
|
|
90
|
-
const e =
|
|
91
|
-
if (e.productIds.join(",") === t) {
|
|
92
|
-
this.store.recommendationConfigs.productIds.join(",") !== t && this.store.patchCurrentBlockConfig({ productIds: e.productIds, filters: e.filters });
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
const o = t === "" ? [] : t.split(",");
|
|
84
|
+
const e = t.split(",").map((r) => r.trim()).filter(Boolean);
|
|
96
85
|
n.updateConfig(
|
|
97
86
|
this.api,
|
|
98
87
|
this.currentNode,
|
|
99
|
-
{ productIds:
|
|
88
|
+
{ productIds: e },
|
|
100
89
|
"Updated product IDs"
|
|
101
|
-
), this.store.patchCurrentBlockConfig({ productIds:
|
|
90
|
+
), this.store.patchCurrentBlockConfig({ productIds: e });
|
|
102
91
|
}
|
|
103
92
|
_listenToFormUpdates() {
|
|
104
93
|
this.api.onValueChanged(i.ALGORITHM, (t) => {
|
|
@@ -109,6 +98,6 @@ class R extends g {
|
|
|
109
98
|
}
|
|
110
99
|
}
|
|
111
100
|
export {
|
|
112
|
-
|
|
101
|
+
u as ALGORITHM_CONTROL_ID,
|
|
113
102
|
R as AlgorithmControl
|
|
114
103
|
};
|
|
@@ -3,7 +3,7 @@ var p = (d, l, t) => l in d ? f(d, l, { enumerable: !0, configurable: !0, writab
|
|
|
3
3
|
var s = (d, l, t) => p(d, typeof l != "symbol" ? l + "" : l, t);
|
|
4
4
|
import { CommonControl as g } from "../../../common-control.js";
|
|
5
5
|
import { DEFAULT_NODE_CONFIG as c } from "../../constants/defaultConfig.js";
|
|
6
|
-
import { RecommendationConfigService as
|
|
6
|
+
import { RecommendationConfigService as m } from "../../services/configService.js";
|
|
7
7
|
import { useRecommendationExtensionStore as y } from "../../store/recommendation.js";
|
|
8
8
|
import { AlgorithmControl as N } from "./algorithm.js";
|
|
9
9
|
import { ALGORITHM_CONTROL_ID as tt } from "./algorithm.js";
|
|
@@ -17,15 +17,15 @@ import { LocaleControl as b } from "./locale.js";
|
|
|
17
17
|
import { LOCALE_CONTROL_ID as lt } from "./locale.js";
|
|
18
18
|
import { PricePlacementControl as T } from "./pricePlacement.js";
|
|
19
19
|
import { PRICE_PLACEMENT_CONTROL_ID as ut } from "./pricePlacement.js";
|
|
20
|
-
import { ProductCountControl as
|
|
21
|
-
import { PRODUCT_COUNT_CONTROL_ID as
|
|
22
|
-
import { ProductLayoutControl as
|
|
20
|
+
import { ProductCountControl as P } from "./productCount.js";
|
|
21
|
+
import { PRODUCT_COUNT_CONTROL_ID as mt } from "./productCount.js";
|
|
22
|
+
import { ProductLayoutControl as O } from "./productLayout.js";
|
|
23
23
|
import { PRODUCT_LAYOUT_CONTROL_ID as Ct } from "./productLayout.js";
|
|
24
|
-
import { ShuffleControl as
|
|
24
|
+
import { ShuffleControl as L } from "./shuffle.js";
|
|
25
25
|
import { SHUFFLE_CONTROL_ID as pt } from "./shuffle.js";
|
|
26
|
-
import { setCurrencyAttributes as
|
|
26
|
+
import { setCurrencyAttributes as S, getBlockElement as k, isPartnerManagedBlock as D, updateProductContentInPlace as E, regenerateProductRowsWithStyles as A } from "./utils.js";
|
|
27
27
|
import { adjustProductsToSize as yt, formatProductPrice as Nt, getCardComposition as Rt, getCurrentLayout as It, regenerateMobileProductRows as _t, updatePricesInPlace as bt, updateSingleProductContent as Tt } from "./utils.js";
|
|
28
|
-
import { useDebounceFn as
|
|
28
|
+
import { useDebounceFn as h } from "../../../../../node_modules/@vueuse/shared/index.js";
|
|
29
29
|
const v = "recommendation-id", w = "ui-elements-recommendation-block";
|
|
30
30
|
class Q extends g {
|
|
31
31
|
constructor() {
|
|
@@ -47,7 +47,7 @@ class Q extends g {
|
|
|
47
47
|
/**
|
|
48
48
|
* Debounced product fetch to prevent rapid API calls during config changes
|
|
49
49
|
*/
|
|
50
|
-
s(this, "_debouncedFetchProducts",
|
|
50
|
+
s(this, "_debouncedFetchProducts", h(() => {
|
|
51
51
|
this.store.fetchRecommendationProducts();
|
|
52
52
|
}, 500));
|
|
53
53
|
/**
|
|
@@ -61,7 +61,7 @@ class Q extends g {
|
|
|
61
61
|
* count. The store pads products to the configured size, so in-place only
|
|
62
62
|
* fails when the size actually changed.
|
|
63
63
|
*/
|
|
64
|
-
s(this, "_debouncedRegenerateWithProducts",
|
|
64
|
+
s(this, "_debouncedRegenerateWithProducts", h(() => {
|
|
65
65
|
const t = this.store.recommendationProducts;
|
|
66
66
|
if (!this.currentNode || !this.api || D(this.currentNode))
|
|
67
67
|
return;
|
|
@@ -81,7 +81,7 @@ class Q extends g {
|
|
|
81
81
|
return w;
|
|
82
82
|
}
|
|
83
83
|
getTemplate() {
|
|
84
|
-
return this.algorithmControl = new N(), this.localeControl = new b(), this.currencyControl = new R(), this.productCountControl = new
|
|
84
|
+
return this.algorithmControl = new N(), this.localeControl = new b(), this.currencyControl = new R(), this.productCountControl = new P(), this.productLayoutControl = new O(), this.filtersControl = new I(), this.shuffleControl = new L(), this.pricePlacementControl = new T(), this.layoutOrientationControl = new _(), [
|
|
85
85
|
this.algorithmControl,
|
|
86
86
|
this.localeControl,
|
|
87
87
|
this.currencyControl,
|
|
@@ -186,7 +186,7 @@ class Q extends g {
|
|
|
186
186
|
*/
|
|
187
187
|
_syncNodeConfigToStore() {
|
|
188
188
|
var r;
|
|
189
|
-
const t =
|
|
189
|
+
const t = m.getConfig(this.currentNode), e = this.store.currentRecommendationId, o = e !== null && ((r = this.store.blockStates[e]) == null ? void 0 : r.isInitialized);
|
|
190
190
|
this.store.patchCurrentBlockConfig({
|
|
191
191
|
strategy: t.strategy,
|
|
192
192
|
language: t.language,
|
|
@@ -249,7 +249,7 @@ class Q extends g {
|
|
|
249
249
|
_applySmartDefaults() {
|
|
250
250
|
if (!this.currentNode || !this.api)
|
|
251
251
|
return;
|
|
252
|
-
const t =
|
|
252
|
+
const t = m.getConfig(this.currentNode), e = {};
|
|
253
253
|
let o = null, r = null, n = null;
|
|
254
254
|
if (t.currency.code === c.currency.code) {
|
|
255
255
|
const { currencyList: i } = this.store;
|
|
@@ -273,12 +273,12 @@ class Q extends g {
|
|
|
273
273
|
(u) => u.value === c.language
|
|
274
274
|
) || (n = i[0].value, e.language = n));
|
|
275
275
|
}
|
|
276
|
-
!o && !r && !n || (
|
|
276
|
+
!o && !r && !n || (m.updateConfig(
|
|
277
277
|
this.api,
|
|
278
278
|
this.currentNode,
|
|
279
279
|
e,
|
|
280
280
|
"Applied smart defaults"
|
|
281
|
-
), o && e.currency &&
|
|
281
|
+
), o && e.currency && S({
|
|
282
282
|
currentNode: this.currentNode,
|
|
283
283
|
documentModifier: this.api.getDocumentModifier(),
|
|
284
284
|
currency: e.currency
|
|
@@ -346,8 +346,8 @@ class Q extends g {
|
|
|
346
346
|
_persistFiltersToNodeConfig() {
|
|
347
347
|
if (!this.currentNode || !this.api)
|
|
348
348
|
return;
|
|
349
|
-
const { filters: t } = this.store.recommendationConfigs
|
|
350
|
-
|
|
349
|
+
const { filters: t } = this.store.recommendationConfigs;
|
|
350
|
+
m.updateConfig(
|
|
351
351
|
this.api,
|
|
352
352
|
this.currentNode,
|
|
353
353
|
{ filters: t },
|
|
@@ -368,14 +368,14 @@ export {
|
|
|
368
368
|
_ as LayoutOrientationControl,
|
|
369
369
|
b as LocaleControl,
|
|
370
370
|
ut as PRICE_PLACEMENT_CONTROL_ID,
|
|
371
|
-
|
|
371
|
+
mt as PRODUCT_COUNT_CONTROL_ID,
|
|
372
372
|
Ct as PRODUCT_LAYOUT_CONTROL_ID,
|
|
373
373
|
T as PricePlacementControl,
|
|
374
|
-
|
|
375
|
-
|
|
374
|
+
P as ProductCountControl,
|
|
375
|
+
O as ProductLayoutControl,
|
|
376
376
|
Q as RecommendationBlockControl,
|
|
377
377
|
pt as SHUFFLE_CONTROL_ID,
|
|
378
|
-
|
|
378
|
+
L as ShuffleControl,
|
|
379
379
|
yt as adjustProductsToSize,
|
|
380
380
|
Nt as formatProductPrice,
|
|
381
381
|
k as getBlockElement,
|
|
@@ -384,7 +384,7 @@ export {
|
|
|
384
384
|
D as isPartnerManagedBlock,
|
|
385
385
|
_t as regenerateMobileProductRows,
|
|
386
386
|
A as regenerateProductRowsWithStyles,
|
|
387
|
-
|
|
387
|
+
S as setCurrencyAttributes,
|
|
388
388
|
bt as updatePricesInPlace,
|
|
389
389
|
E as updateProductContentInPlace,
|
|
390
390
|
Tt as updateSingleProductContent
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { getRecommendationFeedSourceMaps as g, getOperatorOptions as R, PriceAttributes as C } from "../../../../enums/extensions/recommendationBlock.js";
|
|
2
2
|
import { useRecommendationApi as y } from "../../../../services/recommendationApi.js";
|
|
3
3
|
import { useConfigStore as G } from "../../../../stores/config.js";
|
|
4
|
-
import { defineStore as
|
|
4
|
+
import { defineStore as F } from "pinia";
|
|
5
5
|
import "../constants/selectors.js";
|
|
6
|
-
import { DEFAULT_MOBILE_CARDS_IN_ROW as
|
|
6
|
+
import { DEFAULT_MOBILE_CARDS_IN_ROW as P, DEFAULT_CARDS_IN_ROW as D } from "../constants/layout.js";
|
|
7
7
|
import { EXCLUDED_ALGORITHM_IDS as w } from "../constants/defaultConfig.js";
|
|
8
8
|
import { getDefaultProducts as S } from "../templates/utils.js";
|
|
9
9
|
import { generateCompleteFilterQuery as b } from "../utils/filterUtil.js";
|
|
10
10
|
import { getPartnerRecommendationParams as v } from "../utils/partnerCustomizations.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { isConfigValid as L } from "../validation/requiredFields.js";
|
|
11
|
+
import { isFilterValid as N } from "../validation/filterSchema.js";
|
|
12
|
+
import { isConfigValid as x } from "../validation/requiredFields.js";
|
|
14
13
|
const h = y();
|
|
15
14
|
let m = null, u = null, d = null;
|
|
16
15
|
function k() {
|
|
@@ -29,7 +28,7 @@ function k() {
|
|
|
29
28
|
productIds: [],
|
|
30
29
|
id: 1,
|
|
31
30
|
language: "en_US",
|
|
32
|
-
mobileCardsInRow:
|
|
31
|
+
mobileCardsInRow: P,
|
|
33
32
|
mobileLayoutEnabled: !1,
|
|
34
33
|
orientation: "grid",
|
|
35
34
|
recommendedProducts: [],
|
|
@@ -55,7 +54,7 @@ function I() {
|
|
|
55
54
|
filterSnapshot: null
|
|
56
55
|
};
|
|
57
56
|
}
|
|
58
|
-
const
|
|
57
|
+
const L = () => ({
|
|
59
58
|
recommendationCampaignUrls: {},
|
|
60
59
|
activePredictiveAlgorithms: [],
|
|
61
60
|
languages: {},
|
|
@@ -64,8 +63,8 @@ const U = () => ({
|
|
|
64
63
|
blockStates: {},
|
|
65
64
|
currentRecommendationId: null,
|
|
66
65
|
configVersion: 0
|
|
67
|
-
}),
|
|
68
|
-
state: () =>
|
|
66
|
+
}), $ = F("guidoRecommendationExtension", {
|
|
67
|
+
state: () => L(),
|
|
69
68
|
getters: {
|
|
70
69
|
// ====================================================================
|
|
71
70
|
// Proxy Getters — Backward Compatible Access to Current Block State
|
|
@@ -384,7 +383,7 @@ const U = () => ({
|
|
|
384
383
|
const n = [...e.recommendationConfigs.filters];
|
|
385
384
|
n[r] = {
|
|
386
385
|
...t,
|
|
387
|
-
isValid:
|
|
386
|
+
isValid: N(t)
|
|
388
387
|
}, e.recommendationConfigs.filters = n;
|
|
389
388
|
}
|
|
390
389
|
},
|
|
@@ -430,7 +429,7 @@ const U = () => ({
|
|
|
430
429
|
* every block's recommendationConfigs across user edits.
|
|
431
430
|
*/
|
|
432
431
|
hasInvalidBlock() {
|
|
433
|
-
return Object.values(this.blockStates).some((t) => !
|
|
432
|
+
return Object.values(this.blockStates).some((t) => !x(t.recommendationConfigs, this));
|
|
434
433
|
},
|
|
435
434
|
// ====================================================================
|
|
436
435
|
// Per-Block Product Fetching
|
|
@@ -459,7 +458,7 @@ const U = () => ({
|
|
|
459
458
|
details: !0,
|
|
460
459
|
campaignId: o.variationId
|
|
461
460
|
};
|
|
462
|
-
r.strategy === "manualMerchandising" ? a.productId =
|
|
461
|
+
r.strategy === "manualMerchandising" ? a.productId = r.productIds.join(",") : r.strategy === "similarViewed" && (a.productId = "{itemId}"), r.strategy === "userBased" && (a.userId = "{user_id}"), c && (a.filter = c), r.shuffleProducts && (a.shuffle = !0), Object.assign(
|
|
463
462
|
a,
|
|
464
463
|
v(o.partnerName, r.strategy)
|
|
465
464
|
);
|
|
@@ -480,5 +479,5 @@ const U = () => ({
|
|
|
480
479
|
}
|
|
481
480
|
});
|
|
482
481
|
export {
|
|
483
|
-
|
|
482
|
+
$ as useRecommendationExtensionStore
|
|
484
483
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@useinsider/guido",
|
|
3
|
-
"version": "3.16.0-beta.
|
|
3
|
+
"version": "3.16.0-beta.ca26c4e",
|
|
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",
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Builds the request/URL `productId` value from raw product ID segments.
|
|
3
|
-
* Trimming happens here — NOT on input change — so the user's in-progress
|
|
4
|
-
* text (trailing commas, spaces) is never rewritten under the caret (SD-147111).
|
|
5
|
-
*/
|
|
6
|
-
export declare function sanitizeProductIds(ids: readonly (string | number | null | undefined)[]): string;
|