@useinsider/guido 3.14.0-beta.a90f01a → 3.14.0-beta.faf349e
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/useHtmlValidator.js +111 -106
- package/dist/composables/useRecommendation.js +19 -20
- package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +34 -33
- 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
|
@@ -1,64 +1,69 @@
|
|
|
1
|
-
import { useConfig as
|
|
2
|
-
import { getIgnoredRecommendationBlockIds as
|
|
3
|
-
import { TemplateTypes as
|
|
4
|
-
import { DISPLAY_CONDITIONS_REGEX as
|
|
1
|
+
import { useConfig as V } from "./useConfig.js";
|
|
2
|
+
import { getIgnoredRecommendationBlockIds as M } from "../config/compiler/utils/recommendationIgnoreUtils.js";
|
|
3
|
+
import { TemplateTypes as W } from "../enums/defaults.js";
|
|
4
|
+
import { DISPLAY_CONDITIONS_REGEX as G, DISPLAY_CONDITIONS_EXCEPTIONS_REGEX as H, CampaignCouldNotBeSavedKey as P, CanNotMakeAnyChangesForRunningKey as X, DATA_ATTRIBUTE_REGEX as $, DYNAMIC_CONTENT_TAG_REGEX as Y, ALLOWED_DYNAMIC_SYSTEM_TOKENS as U, VALID_DYNAMIC_VARIABLE_REGEX as j } from "../enums/html-validator.js";
|
|
5
5
|
import { ToasterTypeOptions as c } from "../enums/toaster.js";
|
|
6
|
-
import { itemsBlockDynamicVariables as
|
|
7
|
-
import { RECOMMENDATION_VARIABLE_BUILTIN_ATTRIBUTES as
|
|
8
|
-
import { useRecommendationExtensionStore as
|
|
9
|
-
import { resolveProductAttrValue as
|
|
10
|
-
import { RecommendationRequiredFieldsKey as
|
|
11
|
-
import { useRecommendationStore as
|
|
12
|
-
import { base64EncodeWithSpecialChars as
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
6
|
+
import { itemsBlockDynamicVariables as q } from "../extensions/Blocks/Items/enums/productEnums.js";
|
|
7
|
+
import { RECOMMENDATION_VARIABLE_BUILTIN_ATTRIBUTES as K } from "../extensions/Blocks/Recommendation/constants/selectors.js";
|
|
8
|
+
import { useRecommendationExtensionStore as z } from "../extensions/Blocks/Recommendation/store/recommendation.js";
|
|
9
|
+
import { resolveProductAttrValue as Z } from "../extensions/Blocks/Recommendation/templates/utils.js";
|
|
10
|
+
import { RecommendationRequiredFieldsKey as J } from "../extensions/Blocks/Recommendation/validation/requiredFields.js";
|
|
11
|
+
import { useRecommendationStore as Q } from "../stores/recommendation.js";
|
|
12
|
+
import { base64EncodeWithSpecialChars as ee } from "../utils/base64.js";
|
|
13
|
+
import { computed as te } from "vue";
|
|
14
|
+
import { useHttp as ne } from "./useHttp.js";
|
|
15
|
+
import { useToaster as se } from "./useToaster.js";
|
|
16
|
+
import { useTranslations as re } from "./useTranslations.js";
|
|
17
|
+
const oe = /recommendation-id="(\d+)"/g;
|
|
18
|
+
function ie(n) {
|
|
19
|
+
return [...n.matchAll(oe)].map((m) => m[1]);
|
|
19
20
|
}
|
|
20
|
-
function
|
|
21
|
-
return m.some((f) =>
|
|
21
|
+
function ae(n, m) {
|
|
22
|
+
return m.some((f) => n.startsWith(`${f}_`));
|
|
22
23
|
}
|
|
23
|
-
const
|
|
24
|
-
function
|
|
25
|
-
const m =
|
|
24
|
+
const ce = /^(\d+)_\d+_(.+)$/;
|
|
25
|
+
function le(n) {
|
|
26
|
+
const m = n.match(ce);
|
|
26
27
|
return m ? { recoId: m[1], attribute: m[2] } : null;
|
|
27
28
|
}
|
|
28
|
-
function
|
|
29
|
-
const m = new Set(
|
|
30
|
-
return Object.values(
|
|
31
|
-
m.add(
|
|
29
|
+
function me(n) {
|
|
30
|
+
const m = new Set(K);
|
|
31
|
+
return Object.values(n).forEach((f) => {
|
|
32
|
+
m.add(Z(f.attributeName, n).toLowerCase());
|
|
32
33
|
}), m;
|
|
33
34
|
}
|
|
34
|
-
function
|
|
35
|
-
const u =
|
|
35
|
+
function ue(n, m, f, o, d) {
|
|
36
|
+
const u = n.match(/{{([a-zA-Z0-9_.\s]*)}}/gm);
|
|
36
37
|
if (!u)
|
|
37
38
|
return [];
|
|
38
|
-
const
|
|
39
|
+
const g = new Set(m.map((h) => h.toLowerCase())), E = [];
|
|
39
40
|
return u.forEach((h) => {
|
|
40
|
-
const
|
|
41
|
-
if (
|
|
41
|
+
const p = h.slice(2, -2).trim().toLowerCase();
|
|
42
|
+
if (p !== "" && g.has(p))
|
|
42
43
|
return;
|
|
43
|
-
const y =
|
|
44
|
+
const y = le(p);
|
|
44
45
|
if (y && o.has(y.recoId)) {
|
|
45
46
|
if (!d || d.has(y.attribute))
|
|
46
47
|
return;
|
|
47
|
-
E.push(
|
|
48
|
+
E.push(p);
|
|
48
49
|
return;
|
|
49
50
|
}
|
|
50
|
-
|
|
51
|
+
ae(p, f) || p.includes(".") || E.push(p);
|
|
51
52
|
}), E;
|
|
52
53
|
}
|
|
53
|
-
function
|
|
54
|
-
return (
|
|
55
|
-
const d = o.slice(2, -2), u = d.indexOf("|"),
|
|
56
|
-
return
|
|
54
|
+
function de(n) {
|
|
55
|
+
return (n.replace($, "$1").match(Y) ?? []).filter((o) => {
|
|
56
|
+
const d = o.slice(2, -2), u = d.indexOf("|"), g = (u === -1 ? d : d.slice(0, u)).trim();
|
|
57
|
+
return U.includes(g) ? !1 : j.test(g) ? u !== -1 && d.slice(u + 1).trim() === "" : !0;
|
|
57
58
|
});
|
|
58
59
|
}
|
|
59
60
|
const xe = () => {
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
const { showToaster: n } = se(), { post: m } = ne(), { config: f } = V(), o = re(), d = Q(), u = z(), g = te(
|
|
62
|
+
() => {
|
|
63
|
+
var e, t;
|
|
64
|
+
return ((t = (e = f.value) == null ? void 0 : e.partner) == null ? void 0 : t.messageType) === W.transactional;
|
|
65
|
+
}
|
|
66
|
+
), E = async (e) => {
|
|
62
67
|
if (e.size === 0)
|
|
63
68
|
return /* @__PURE__ */ new Set();
|
|
64
69
|
try {
|
|
@@ -66,61 +71,61 @@ const xe = () => {
|
|
|
66
71
|
} catch {
|
|
67
72
|
return null;
|
|
68
73
|
}
|
|
69
|
-
return
|
|
74
|
+
return me(u.filterList);
|
|
70
75
|
}, h = async (e) => {
|
|
71
|
-
const
|
|
76
|
+
const s = await m(
|
|
72
77
|
"/newsletter/template-library/check-template-html-body",
|
|
73
|
-
{ html:
|
|
74
|
-
), { status: r, message: a } =
|
|
75
|
-
return r ||
|
|
78
|
+
{ html: ee(e) }
|
|
79
|
+
), { status: r, message: a } = s.data;
|
|
80
|
+
return r || n({
|
|
76
81
|
type: c.Error,
|
|
77
82
|
message: r === void 0 ? a : o("newsletter.invalid-url-link-for-toaster")
|
|
78
|
-
}), o(
|
|
83
|
+
}), o(P), a === o(X) && n({
|
|
79
84
|
type: c.Error,
|
|
80
85
|
message: o("newsletter.already-in-progress")
|
|
81
86
|
}), r;
|
|
82
|
-
},
|
|
83
|
-
const
|
|
87
|
+
}, p = (e) => !["if", "endif", "else", "elif", "now"].includes(e.toLowerCase()), y = (e) => ["if", "endif"].includes(e.toLowerCase()), S = (e, t) => {
|
|
88
|
+
const s = e.match(/({%(.*?)%})/g);
|
|
84
89
|
let r = !0;
|
|
85
|
-
return
|
|
90
|
+
return s !== null && !g.value && s.forEach((a) => {
|
|
86
91
|
const i = a.slice(2, -2).trim().match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);
|
|
87
92
|
if (i && i.length > 0) {
|
|
88
93
|
const [l] = i;
|
|
89
|
-
|
|
94
|
+
p(l) && !t.includes(l) && (n({
|
|
90
95
|
type: c.Warning,
|
|
91
96
|
message: o("custom-fields.invalid-custom-fields")
|
|
92
97
|
}), r = !1);
|
|
93
98
|
}
|
|
94
99
|
}), r;
|
|
95
|
-
},
|
|
96
|
-
const r =
|
|
97
|
-
return
|
|
98
|
-
},
|
|
100
|
+
}, A = async (e, t, s) => {
|
|
101
|
+
const r = s ? await h(e) : !0;
|
|
102
|
+
return S(e, t) && r;
|
|
103
|
+
}, T = (e) => e.length > 0 ? !0 : (n({
|
|
99
104
|
type: c.Warning,
|
|
100
105
|
message: o("newsletter.html-content-is-empty")
|
|
101
|
-
}), !1),
|
|
102
|
-
const
|
|
103
|
-
return
|
|
106
|
+
}), !1), w = (e) => {
|
|
107
|
+
const t = (e.match(/{/gm) || []).length, s = (e.match(/}/gm) || []).length;
|
|
108
|
+
return t > s && n({
|
|
104
109
|
type: c.Warning,
|
|
105
110
|
message: o("custom-fields.missing-closing-braces")
|
|
106
|
-
}),
|
|
111
|
+
}), t < s && n({
|
|
107
112
|
type: c.Warning,
|
|
108
113
|
message: o("custom-fields.missing-opening-braces")
|
|
109
|
-
}),
|
|
110
|
-
},
|
|
111
|
-
const
|
|
112
|
-
return
|
|
114
|
+
}), t === s;
|
|
115
|
+
}, R = (e) => {
|
|
116
|
+
const t = de(e).length === 0;
|
|
117
|
+
return t || n({
|
|
113
118
|
type: c.Warning,
|
|
114
119
|
message: o("custom-fields.invalid-custom-fields")
|
|
115
|
-
}),
|
|
116
|
-
},
|
|
117
|
-
if (
|
|
120
|
+
}), t;
|
|
121
|
+
}, _ = (e, t, s, r) => {
|
|
122
|
+
if (g.value)
|
|
118
123
|
return !0;
|
|
119
|
-
const a =
|
|
124
|
+
const a = ue(
|
|
120
125
|
e,
|
|
126
|
+
t,
|
|
127
|
+
ie(e),
|
|
121
128
|
s,
|
|
122
|
-
ae(e),
|
|
123
|
-
n,
|
|
124
129
|
r
|
|
125
130
|
);
|
|
126
131
|
if (a.length > 0) {
|
|
@@ -129,91 +134,91 @@ const xe = () => {
|
|
|
129
134
|
${a.map((l) => `<li>${l}</li>`).join("")}
|
|
130
135
|
</ul>
|
|
131
136
|
`;
|
|
132
|
-
return
|
|
137
|
+
return n({
|
|
133
138
|
type: c.Error,
|
|
134
139
|
message: o("custom-fields.invalid-custom-fields") + i
|
|
135
140
|
}), !1;
|
|
136
141
|
}
|
|
137
142
|
return !0;
|
|
138
|
-
},
|
|
139
|
-
const
|
|
143
|
+
}, N = (e) => {
|
|
144
|
+
const t = e.match(/{%(.*?)%}/g), s = [];
|
|
140
145
|
let r = !0;
|
|
141
|
-
if (
|
|
142
|
-
const i = a.match(
|
|
143
|
-
(!i || a !==
|
|
146
|
+
if (t && t.forEach((a) => {
|
|
147
|
+
const i = a.match(G), l = a.match(H), C = (i == null ? void 0 : i.join("")) || "";
|
|
148
|
+
(!i || a !== C) && !l && (n({
|
|
144
149
|
type: c.Error,
|
|
145
150
|
message: o("newsletter.display-conditions-invalid-syntax")
|
|
146
|
-
}), r = !1), i && i.forEach((
|
|
147
|
-
|
|
151
|
+
}), r = !1), i && i.forEach((v) => {
|
|
152
|
+
v.trim() === "=" && (n({
|
|
148
153
|
type: c.Error,
|
|
149
154
|
message: o("custom-conditions.wrong-equality-operators")
|
|
150
155
|
}), r = !1);
|
|
151
|
-
const I =
|
|
152
|
-
I && I.forEach((
|
|
153
|
-
y(
|
|
156
|
+
const I = v.match(/^[a-zA-Z]*$/g);
|
|
157
|
+
I && I.forEach((b) => {
|
|
158
|
+
y(b) && s.push(b);
|
|
154
159
|
});
|
|
155
160
|
});
|
|
156
|
-
}),
|
|
157
|
-
const a =
|
|
158
|
-
a.length !== i.length && (
|
|
161
|
+
}), s.length) {
|
|
162
|
+
const a = s.filter((l) => l === "if"), i = s.filter((l) => l === "endif");
|
|
163
|
+
a.length !== i.length && (n({
|
|
159
164
|
type: c.Error,
|
|
160
165
|
message: o("custom-conditions.missing-if-endif-tag")
|
|
161
166
|
}), r = !1);
|
|
162
167
|
}
|
|
163
168
|
return r;
|
|
164
|
-
},
|
|
165
|
-
const
|
|
166
|
-
return r ||
|
|
169
|
+
}, x = (e) => {
|
|
170
|
+
const t = (e.match(/{% /gm) || []).length, s = (e.match(/ %}/gm) || []).length, r = t === s;
|
|
171
|
+
return r || n({
|
|
167
172
|
type: c.Warning,
|
|
168
173
|
message: o("custom-conditions.no-space-after-braces")
|
|
169
174
|
}), r;
|
|
170
|
-
},
|
|
175
|
+
}, O = (e) => (e.match(/({%(.*?)%})/g) || []).filter((s) => s.includes("if")).map((s) => (s.match(/{{.*}}/gm) || []).length).reduce((s, r) => s + r, 0) > 0 ? (n({
|
|
171
176
|
type: c.Warning,
|
|
172
177
|
message: o("custom-conditions.no-braces-inside-if-tag")
|
|
173
|
-
}), !1) : !0,
|
|
178
|
+
}), !1) : !0, k = () => u.hasInvalidBlock() ? (n({
|
|
174
179
|
type: c.Error,
|
|
175
|
-
message: o(
|
|
176
|
-
}), !1) : !0,
|
|
180
|
+
message: o(J)
|
|
181
|
+
}), !1) : !0, B = () => d.recommendationConfigs && Object.values(d.recommendationConfigs).find((t) => t.filters.find((s) => s.value === "")) !== void 0 ? (n({
|
|
177
182
|
type: c.Error,
|
|
178
183
|
message: o("newsletter.fill-all-necessary-fields")
|
|
179
|
-
}), !1) : !0,
|
|
180
|
-
const
|
|
181
|
-
return e.match(
|
|
184
|
+
}), !1) : !0, D = (e) => {
|
|
185
|
+
const t = /src="[^"]*\.(svg|pst)"/gm;
|
|
186
|
+
return e.match(t) === null ? !0 : (n({
|
|
182
187
|
type: c.Error,
|
|
183
188
|
message: o("newsletter.invalid-image-type")
|
|
184
189
|
}), !1);
|
|
185
|
-
},
|
|
190
|
+
}, F = (e) => {
|
|
186
191
|
const r = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".checkbox-block-v2");
|
|
187
192
|
return Array.from(r).find((i) => {
|
|
188
193
|
var l;
|
|
189
194
|
return !((l = i.id) != null && l.trim());
|
|
190
|
-
}) ? (
|
|
195
|
+
}) ? (n({
|
|
191
196
|
type: c.Error,
|
|
192
197
|
message: o("unsubscribe-templates.select-checkbox-groups")
|
|
193
198
|
}), !1) : !0;
|
|
194
|
-
},
|
|
199
|
+
}, L = (e) => {
|
|
195
200
|
const r = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".radio-button-v2");
|
|
196
201
|
return Array.from(r).find((i) => {
|
|
197
202
|
var l;
|
|
198
203
|
return !((l = i.id) != null && l.trim());
|
|
199
|
-
}) ? (
|
|
204
|
+
}) ? (n({
|
|
200
205
|
type: c.Error,
|
|
201
206
|
message: o("unsubscribe-templates.select-radio-button-groups")
|
|
202
207
|
}), !1) : !0;
|
|
203
208
|
};
|
|
204
|
-
return { validateHtml: async (e,
|
|
205
|
-
var
|
|
209
|
+
return { validateHtml: async (e, t, s = !1) => {
|
|
210
|
+
var C, v;
|
|
206
211
|
const r = [
|
|
207
|
-
...
|
|
208
|
-
...
|
|
209
|
-
...((
|
|
210
|
-
], a =
|
|
211
|
-
return await
|
|
212
|
+
...t.map((I) => I.value),
|
|
213
|
+
...q,
|
|
214
|
+
...((v = (C = f.value) == null ? void 0 : C.template) == null ? void 0 : v.customFieldAttributes) ?? []
|
|
215
|
+
], a = M(e), i = await E(a);
|
|
216
|
+
return await A(e, r, s) && T(e) && w(e) && R(e) && _(e, r, a, i) && N(e) && x(e) && O(e) && k() && B() && D(e) && F(e) && L(e);
|
|
212
217
|
} };
|
|
213
218
|
};
|
|
214
219
|
export {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
220
|
+
me as buildPartnerAttributeNameSet,
|
|
221
|
+
ue as findInvalidCustomFields,
|
|
222
|
+
le as parseRecommendationVariable,
|
|
218
223
|
xe as useHtmlValidator
|
|
219
224
|
};
|
|
@@ -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
|
};
|
|
@@ -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
|
|
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 `
|
|
@@ -25,13 +25,13 @@ class S extends g {
|
|
|
25
25
|
${this._GuTwoColumns([
|
|
26
26
|
this._GuLabel({ text: this.api.translate("Recommendation Algorithm") }),
|
|
27
27
|
this._GuSelect({
|
|
28
|
-
name:
|
|
28
|
+
name: i.ALGORITHM,
|
|
29
29
|
placeholder: this.api.translate("Select Recommendation Algorithm"),
|
|
30
30
|
options: this.store.getActivePredictiveAlgorithms
|
|
31
31
|
}),
|
|
32
|
-
this._GuLabel({ text: this.api.translate("Product Ids"), name: `${
|
|
32
|
+
this._GuLabel({ text: this.api.translate("Product Ids"), name: `${i.PRODUCT_IDS}_label` }),
|
|
33
33
|
this._GuTextInput({
|
|
34
|
-
name:
|
|
34
|
+
name: i.PRODUCT_IDS,
|
|
35
35
|
placeholder: this.api.translate("Enter Product Ids"),
|
|
36
36
|
className: "es-180w"
|
|
37
37
|
})
|
|
@@ -46,28 +46,29 @@ class S extends g {
|
|
|
46
46
|
super.onTemplateNodeUpdated(t), this._initializeSelectItems(), this._setFormValues();
|
|
47
47
|
}
|
|
48
48
|
_setFormValues() {
|
|
49
|
-
const t = n.getConfig(this.currentNode),
|
|
50
|
-
this._setProductIdsVisibility(
|
|
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
|
-
var
|
|
56
|
-
const t = (
|
|
56
|
+
var e;
|
|
57
|
+
const t = (e = this.store) == null ? void 0 : e.getActivePredictiveAlgorithms;
|
|
57
58
|
if (t != null && t.length)
|
|
58
59
|
try {
|
|
59
60
|
this.api.setUIEAttribute(
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
i.ALGORITHM,
|
|
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(
|
|
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
|
!this.currentNode || n.getConfig(this.currentNode).strategy === t || (n.updateConfig(
|
|
@@ -78,25 +79,25 @@ class S extends g {
|
|
|
78
79
|
), this.store.patchCurrentBlockConfig({ strategy: t }), this._setProductIdsVisibility(t));
|
|
79
80
|
}
|
|
80
81
|
_onProductIdsChange(t) {
|
|
81
|
-
if (!this.currentNode
|
|
82
|
+
if (!this.currentNode)
|
|
82
83
|
return;
|
|
83
|
-
const
|
|
84
|
+
const e = t.split(",").map((r) => r.trim()).filter(Boolean);
|
|
84
85
|
n.updateConfig(
|
|
85
86
|
this.api,
|
|
86
87
|
this.currentNode,
|
|
87
|
-
{ productIds:
|
|
88
|
+
{ productIds: e },
|
|
88
89
|
"Updated product IDs"
|
|
89
|
-
), this.store.patchCurrentBlockConfig({ productIds:
|
|
90
|
+
), this.store.patchCurrentBlockConfig({ productIds: e });
|
|
90
91
|
}
|
|
91
92
|
_listenToFormUpdates() {
|
|
92
|
-
this.api.onValueChanged(
|
|
93
|
+
this.api.onValueChanged(i.ALGORITHM, (t) => {
|
|
93
94
|
this._onAlgorithmChange(t);
|
|
94
|
-
}), this.api.onValueChanged(
|
|
95
|
+
}), this.api.onValueChanged(i.PRODUCT_IDS, (t) => {
|
|
95
96
|
this._onProductIdsChange(t);
|
|
96
97
|
});
|
|
97
98
|
}
|
|
98
99
|
}
|
|
99
100
|
export {
|
|
100
|
-
|
|
101
|
-
|
|
101
|
+
u as ALGORITHM_CONTROL_ID,
|
|
102
|
+
R as AlgorithmControl
|
|
102
103
|
};
|
|
@@ -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.14.0-beta.
|
|
3
|
+
"version": "3.14.0-beta.faf349e",
|
|
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: string[]): string;
|