@useinsider/guido 2.1.0-beta.04bd1f4 → 2.1.0-beta.071f320
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/organisms/header/EditorActions.vue.js +8 -10
- package/dist/components/organisms/header/EditorActions.vue2.js +31 -40
- package/dist/components/organisms/onboarding/GenericOnboarding.vue.js +1 -1
- package/dist/components/organisms/onboarding/GenericOnboarding.vue2.js +1 -1
- package/dist/components/organisms/onboarding/TextBlockOnboarding.vue.js +1 -1
- package/dist/components/organisms/onboarding/TextBlockOnboarding.vue2.js +2 -2
- package/dist/config/i18n/en/labels.json.js +3 -8
- package/dist/config/migrator/itemsBlockMigrator.js +134 -136
- package/dist/config/migrator/recommendationMigrator.js +40 -42
- package/dist/extensions/Blocks/Items/block.js +25 -45
- package/dist/extensions/Blocks/Items/iconsRegistry.js +5 -6
- package/dist/extensions/Blocks/Items/items.css.js +0 -48
- package/dist/extensions/Blocks/Recommendation/block.js +29 -49
- package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +3 -4
- package/dist/extensions/Blocks/Recommendation/recommendation.css.js +0 -48
- package/dist/extensions/Blocks/common-control.js +4 -12
- package/dist/guido.css +1 -1
- package/dist/src/components/Guido.vue.d.ts +1 -1
- package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
- package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
- package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
- package/dist/src/components/wrappers/WpModal.vue.d.ts +2 -2
- package/dist/src/extensions/Blocks/Items/block.d.ts +0 -1
- package/dist/src/extensions/Blocks/Recommendation/block.d.ts +0 -1
- package/dist/src/extensions/Blocks/common-control.d.ts +0 -5
- package/package.json +1 -1
- package/dist/components/organisms/header/MigrationConfirmModal.vue.js +0 -17
- package/dist/components/organisms/header/MigrationConfirmModal.vue2.js +0 -41
- package/dist/extensions/Blocks/common-icons.js +0 -39
- package/dist/src/components/organisms/header/MigrationConfirmModal.vue.d.ts +0 -6
- package/dist/src/extensions/Blocks/common-icons.d.ts +0 -1
- package/dist/src/stores/template.d.ts +0 -3
- package/dist/stores/template.js +0 -9
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
var h = Object.defineProperty;
|
|
2
|
-
var T = (
|
|
3
|
-
var
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
import { getDefaultProducts as B } from "../../extensions/Blocks/Recommendation/templates/utils.js";
|
|
8
|
-
class $ {
|
|
2
|
+
var T = (A, e, t) => e in A ? h(A, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : A[e] = t;
|
|
3
|
+
var m = (A, e, t) => T(A, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
+
import P, { prepareProductRows as S } from "../../extensions/Blocks/Recommendation/templates/grid/migration.js";
|
|
5
|
+
import { getDefaultProducts as q } from "../../extensions/Blocks/Recommendation/templates/utils.js";
|
|
6
|
+
class w {
|
|
9
7
|
constructor() {
|
|
10
|
-
|
|
8
|
+
m(this, "parser");
|
|
11
9
|
this.parser = new DOMParser();
|
|
12
10
|
}
|
|
13
11
|
migrate(e) {
|
|
14
12
|
try {
|
|
15
13
|
const t = this.parser.parseFromString(e, "text/html"), s = t.querySelectorAll(
|
|
16
14
|
'td.ins-recommendation-v3-block-1, td.product-block[esd-handler-name*="EmailRecommendationV3"]'
|
|
17
|
-
)
|
|
18
|
-
return
|
|
19
|
-
const
|
|
20
|
-
`<table id="tempDoc"><tbody><tr>${
|
|
15
|
+
);
|
|
16
|
+
return s.length === 0 ? e : (s.forEach((o) => {
|
|
17
|
+
const l = o.getAttribute("id"), r = this.extractBgColor(o), i = this.extractTitle(o), u = this.extractProductRows(o), c = P.replace("{-{-TITLE-}-}", i).replace("{-{-PRODUCT_ROWS-}-}", u), a = this.parser.parseFromString(
|
|
18
|
+
`<table id="tempDoc"><tbody><tr>${c}</tr></tbody></table>`,
|
|
21
19
|
"text/html"
|
|
22
20
|
).querySelector(".ins-recommendation-v3-block-v2");
|
|
23
|
-
a &&
|
|
21
|
+
a && o.parentNode && (l && a.setAttribute("id", l), r && a.setAttribute("bgcolor", r), o.parentNode.replaceChild(a, o));
|
|
24
22
|
}), t.documentElement.outerHTML);
|
|
25
23
|
} catch (t) {
|
|
26
24
|
return console.error("RecommendationMigrator failed:", t), e;
|
|
@@ -66,7 +64,7 @@ class $ {
|
|
|
66
64
|
* @returns HTML string for the title block
|
|
67
65
|
*/
|
|
68
66
|
extractTitle(e) {
|
|
69
|
-
var
|
|
67
|
+
var a, g;
|
|
70
68
|
const t = e.querySelector(".ext-recommendation-title");
|
|
71
69
|
if (!t)
|
|
72
70
|
return this.buildTitleBlock({
|
|
@@ -78,7 +76,7 @@ class $ {
|
|
|
78
76
|
});
|
|
79
77
|
const s = t.querySelector("p");
|
|
80
78
|
if (!s) {
|
|
81
|
-
const p = ((
|
|
79
|
+
const p = ((a = t.textContent) == null ? void 0 : a.trim()) || "You May Also Like!", b = t.getAttribute("align") || "center";
|
|
82
80
|
return this.buildTitleBlock({
|
|
83
81
|
text: p,
|
|
84
82
|
isBold: !0,
|
|
@@ -87,13 +85,13 @@ class $ {
|
|
|
87
85
|
styles: "font-size: 28px; color: #333333;"
|
|
88
86
|
});
|
|
89
87
|
}
|
|
90
|
-
const o = ((
|
|
88
|
+
const o = ((g = s.textContent) == null ? void 0 : g.trim()) || "You May Also Like!", l = t.getAttribute("align") || s.getAttribute("align") || "center", r = s.getAttribute("style") || "", i = /font-weight\s*:\s*bold/i.test(r) || !!s.querySelector("b, strong"), u = /font-style\s*:\s*italic/i.test(r) || !!s.querySelector("i, em"), c = this.removeStyleProperties(r, ["font-weight", "font-style"]), n = this.convertInlineToBlock(c);
|
|
91
89
|
return this.buildTitleBlock({
|
|
92
90
|
text: o,
|
|
93
91
|
isBold: i,
|
|
94
92
|
isItalic: u,
|
|
95
|
-
align:
|
|
96
|
-
styles:
|
|
93
|
+
align: l,
|
|
94
|
+
styles: n
|
|
97
95
|
});
|
|
98
96
|
}
|
|
99
97
|
/**
|
|
@@ -105,8 +103,8 @@ class $ {
|
|
|
105
103
|
const t = this.extractProductConfig(e);
|
|
106
104
|
if (!t)
|
|
107
105
|
return console.warn("[RecommendationMigrator] No product config found, using defaults"), this.generateProductRows(6, 3, {});
|
|
108
|
-
const { totalCount: s, productsPerRow: o } = t,
|
|
109
|
-
return this.generateProductRows(s, o,
|
|
106
|
+
const { totalCount: s, productsPerRow: o } = t, l = this.extractProductStyles(e);
|
|
107
|
+
return this.generateProductRows(s, o, l);
|
|
110
108
|
}
|
|
111
109
|
/**
|
|
112
110
|
* Extracts Stripo padding/margin utility classes from a class string
|
|
@@ -154,12 +152,12 @@ class $ {
|
|
|
154
152
|
* @returns HTML string for product rows with applied styles
|
|
155
153
|
*/
|
|
156
154
|
generateProductRows(e, t, s) {
|
|
157
|
-
const o =
|
|
155
|
+
const o = q(), l = [];
|
|
158
156
|
for (let i = 0; i < e; i++) {
|
|
159
157
|
const u = o[i % o.length];
|
|
160
|
-
|
|
158
|
+
l.push({ ...u });
|
|
161
159
|
}
|
|
162
|
-
let r =
|
|
160
|
+
let r = S(l, t);
|
|
163
161
|
return r = this.applyExtractedStyles(r, s), r;
|
|
164
162
|
}
|
|
165
163
|
/**
|
|
@@ -173,30 +171,30 @@ class $ {
|
|
|
173
171
|
return console.warn("[RecommendationMigrator] No product card found, using default styles"), t;
|
|
174
172
|
const o = this.extractCardBgColor(s);
|
|
175
173
|
o && (t.cardBgColor = o);
|
|
176
|
-
const
|
|
177
|
-
if (
|
|
178
|
-
const
|
|
179
|
-
t.imageWidth =
|
|
174
|
+
const l = s.querySelector(".ext-product-image");
|
|
175
|
+
if (l) {
|
|
176
|
+
const n = l.querySelector("img"), a = n == null ? void 0 : n.getAttribute("width"), g = l.getAttribute("style") || "", p = l.getAttribute("align") || "center", b = l.getAttribute("class") || "", d = this.extractStripoClasses(b);
|
|
177
|
+
t.imageWidth = a || "120", t.imageAlign = p, t.imageTdStyle = g, t.imageClasses = d;
|
|
180
178
|
}
|
|
181
179
|
const r = s.querySelector(".ext-product-name");
|
|
182
180
|
if (r) {
|
|
183
|
-
const
|
|
184
|
-
t.nameStyle =
|
|
181
|
+
const n = r.querySelector("p"), a = (n == null ? void 0 : n.getAttribute("style")) || "", g = r.getAttribute("align") || "center", p = r.getAttribute("style") || "", b = r.getAttribute("class") || "", d = this.extractStripoClasses(b);
|
|
182
|
+
t.nameStyle = a, t.nameAlign = g, t.nameTdStyle = p, t.nameClasses = d;
|
|
185
183
|
}
|
|
186
184
|
const i = s.querySelector(".ext-product-price");
|
|
187
185
|
if (i) {
|
|
188
|
-
const
|
|
189
|
-
t.priceStyle =
|
|
186
|
+
const n = i.querySelector("p"), a = (n == null ? void 0 : n.getAttribute("style")) || "", g = i.getAttribute("align") || "center", p = i.getAttribute("style") || "", b = i.getAttribute("class") || "", d = this.extractStripoClasses(b);
|
|
187
|
+
t.priceStyle = a, t.priceAlign = g, t.priceTdStyle = p, t.priceClasses = d;
|
|
190
188
|
}
|
|
191
189
|
const u = s.querySelector(".ext-product-original-price");
|
|
192
190
|
if (u) {
|
|
193
|
-
const
|
|
194
|
-
t.oldPriceStyle =
|
|
191
|
+
const n = u.querySelector("p"), a = (n == null ? void 0 : n.getAttribute("style")) || "", g = u.getAttribute("align") || "center", p = u.getAttribute("style") || "", b = u.getAttribute("class") || "", d = this.extractStripoClasses(b);
|
|
192
|
+
t.oldPriceStyle = a, t.oldPriceAlign = g, t.oldPriceTdStyle = p, t.oldPriceClasses = d;
|
|
195
193
|
}
|
|
196
194
|
const c = s.querySelector(".ext-product-button");
|
|
197
195
|
if (c) {
|
|
198
|
-
const
|
|
199
|
-
t.buttonBorderStyle =
|
|
196
|
+
const n = c.querySelector(".es-button-border"), a = c.querySelector("a.es-button"), g = (n == null ? void 0 : n.getAttribute("style")) || "", p = (a == null ? void 0 : a.getAttribute("style")) || "", b = c.getAttribute("align") || "center", d = c.getAttribute("style") || "", f = c.getAttribute("class") || "", C = this.extractStripoClasses(f), y = ((c == null ? void 0 : c.textContent) || "").trim();
|
|
197
|
+
t.buttonBorderStyle = g, t.buttonLinkStyle = p, t.buttonAlign = b, t.buttonTdStyle = d, t.buttonClasses = C, t.buttonText = y;
|
|
200
198
|
}
|
|
201
199
|
return t;
|
|
202
200
|
}
|
|
@@ -242,8 +240,8 @@ class $ {
|
|
|
242
240
|
i && t.oldPriceStyle && i.setAttribute("style", t.oldPriceStyle);
|
|
243
241
|
}), (t.buttonBorderStyle || t.buttonLinkStyle || t.buttonAlign || t.buttonTdStyle || t.buttonClasses) && s.querySelectorAll(".product-button").forEach((r) => {
|
|
244
242
|
if (t.buttonAlign && r.setAttribute("align", t.buttonAlign), t.buttonTdStyle && r.setAttribute("style", t.buttonTdStyle), t.buttonClasses) {
|
|
245
|
-
const
|
|
246
|
-
r.setAttribute("class",
|
|
243
|
+
const n = `${r.getAttribute("class") || ""} ${t.buttonClasses}`.trim();
|
|
244
|
+
r.setAttribute("class", n);
|
|
247
245
|
}
|
|
248
246
|
const i = r.querySelector(".es-button-border");
|
|
249
247
|
i && t.buttonBorderStyle && i.setAttribute("style", t.buttonBorderStyle);
|
|
@@ -272,8 +270,8 @@ class $ {
|
|
|
272
270
|
* Removes specified style properties from a style string
|
|
273
271
|
*/
|
|
274
272
|
removeStyleProperties(e, t) {
|
|
275
|
-
return e ? t.reduce((o,
|
|
276
|
-
const r = new RegExp(`${
|
|
273
|
+
return e ? t.reduce((o, l) => {
|
|
274
|
+
const r = new RegExp(`${l}\\s*:\\s*[^;]*;?`, "gi");
|
|
277
275
|
return o.replace(r, "");
|
|
278
276
|
}, e).replace(/;\s*;/g, ";").replace(/^;|;$/g, "").trim() : "";
|
|
279
277
|
}
|
|
@@ -287,9 +285,9 @@ class $ {
|
|
|
287
285
|
return /display\s*:/i.test(t) || (t = t ? `${t}; display: block` : "display: block"), t.replace(/;\s*;/g, ";").replace(/^;|;$/g, "").replace(/"/g, "'").trim();
|
|
288
286
|
}
|
|
289
287
|
}
|
|
290
|
-
function
|
|
291
|
-
return new
|
|
288
|
+
function k(A) {
|
|
289
|
+
return new w().migrate(A);
|
|
292
290
|
}
|
|
293
291
|
export {
|
|
294
|
-
|
|
292
|
+
k as migrateRecommendation
|
|
295
293
|
};
|
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
import { useOnboardingStore as
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class M extends u {
|
|
1
|
+
import { useOnboardingStore as d } from "../../../stores/onboarding.js";
|
|
2
|
+
import { Block as g, BlockCompositionType as f, ModificationDescription as o } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
3
|
+
import { SETTINGS_ENUMS as c, DefaultConfigValues as i } from "./enums/settingsEnums.js";
|
|
4
|
+
import { getDefaultTemplate as p } from "./template.js";
|
|
5
|
+
import { getItemsBlockContainer as u, getItemsBlockConfig as C, getDefaultItemsBlockConfig as I } from "./utils/nodeConfigUtils.js";
|
|
6
|
+
const y = "items-block";
|
|
7
|
+
class B extends g {
|
|
9
8
|
getId() {
|
|
10
|
-
return
|
|
9
|
+
return y;
|
|
11
10
|
}
|
|
12
11
|
getIcon() {
|
|
13
12
|
return "items-icon";
|
|
14
13
|
}
|
|
15
14
|
getBlockCompositionType() {
|
|
16
|
-
return
|
|
15
|
+
return f.CONTAINER;
|
|
17
16
|
}
|
|
18
17
|
getName() {
|
|
19
18
|
return this.api.translate("Items");
|
|
@@ -21,54 +20,35 @@ class M extends u {
|
|
|
21
20
|
getDescription() {
|
|
22
21
|
return this.api.translate("Items lets you display personalized products based on user behavior.");
|
|
23
22
|
}
|
|
24
|
-
getSettingsPanelTitleHtml() {
|
|
25
|
-
if (f().migrations[m] === 0)
|
|
26
|
-
return "";
|
|
27
|
-
const n = this.api.translate("Items"), o = this.api.translate("This block is switched from the Old Version to the New Version. We recommend you check the Items block and test your message to ensure it works properly.");
|
|
28
|
-
return `<div>
|
|
29
|
-
<div style="display: flex; align-items: center;">
|
|
30
|
-
<span>${n}</span>
|
|
31
|
-
</div>
|
|
32
|
-
<div class="items-migration-info">
|
|
33
|
-
<${c.ICON}
|
|
34
|
-
${C.ICON.src}="migration-info-icon"
|
|
35
|
-
class="items-migration-info__icon">
|
|
36
|
-
</${c.ICON}>
|
|
37
|
-
<p class="items-migration-info__text">
|
|
38
|
-
${o}
|
|
39
|
-
</p>
|
|
40
|
-
</div>
|
|
41
|
-
</div>`;
|
|
42
|
-
}
|
|
43
23
|
getTemplate() {
|
|
44
|
-
return
|
|
45
|
-
orientation:
|
|
46
|
-
itemsType:
|
|
24
|
+
return p({
|
|
25
|
+
orientation: c.ORIENTATION.VERTICAL,
|
|
26
|
+
itemsType: c.ITEMS_TYPE.CART_ITEMS,
|
|
47
27
|
itemId: "{{Abandoned Cart Item (1) Url}}",
|
|
48
|
-
currencySymbol:
|
|
49
|
-
currencyLocation:
|
|
50
|
-
formattedPrice:
|
|
28
|
+
currencySymbol: i.productPriceCurrencySymbolControlValue,
|
|
29
|
+
currencyLocation: i.productPriceCurrencyLocationControlValue,
|
|
30
|
+
formattedPrice: i.productPriceFormattedControlValue === "1"
|
|
51
31
|
});
|
|
52
32
|
}
|
|
53
33
|
allowInnerBlocksDND() {
|
|
54
34
|
return !1;
|
|
55
35
|
}
|
|
56
|
-
onCreated(
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
const e =
|
|
36
|
+
onCreated(n) {
|
|
37
|
+
const s = this.api.getDocumentModifier(), r = this.api.getDocumentRootCssNode();
|
|
38
|
+
r.querySelector('[product-attr="imageSrc"] img') || s.modifyCss(r).appendRule('[product-attr="imageSrc"] img {object-fit: contain;}');
|
|
39
|
+
const e = u(n);
|
|
60
40
|
if (!e)
|
|
61
41
|
return;
|
|
62
|
-
const a = e.getNodeConfig(),
|
|
42
|
+
const a = e.getNodeConfig(), l = a && Object.keys(a).length > 0, t = C(n);
|
|
63
43
|
if (t != null && t.initialized)
|
|
64
|
-
|
|
44
|
+
l ? t.blockInstanceId || this.api.getDocumentModifier().modifyHtml(e).setNodeConfig({ ...t, blockInstanceId: String(Date.now()) }).apply(new o("Assign block instance ID to block")) : this.api.getDocumentModifier().modifyHtml(e).setNodeConfig(t).apply(new o("Migrate legacy config to nodeConfig"));
|
|
65
45
|
else {
|
|
66
|
-
const
|
|
67
|
-
this.api.getDocumentModifier().modifyHtml(e).setNodeConfig(
|
|
46
|
+
const m = I();
|
|
47
|
+
this.api.getDocumentModifier().modifyHtml(e).setNodeConfig(m).apply(new o("Initialize Items block with default configuration")), d().startOnboarding("itemsOnboarding");
|
|
68
48
|
}
|
|
69
49
|
}
|
|
70
50
|
}
|
|
71
51
|
export {
|
|
72
|
-
|
|
73
|
-
|
|
52
|
+
y as BLOCK_ID,
|
|
53
|
+
B as ItemsBlock
|
|
74
54
|
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { IconsRegistry as o } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
2
|
-
|
|
3
|
-
class s extends o {
|
|
2
|
+
class i extends o {
|
|
4
3
|
registerIconsSvg(t) {
|
|
5
4
|
t["items-icon"] = `
|
|
6
5
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
@@ -20,14 +19,14 @@ class s extends o {
|
|
|
20
19
|
</svg>
|
|
21
20
|
`, t["horizontal-orientation"] = `
|
|
22
21
|
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
|
23
|
-
<path d="M10 19H4C3.44772 19 3 18.5523 3 18V2C3 1.44772 3.44772 1 4 1H10V19Z" stroke="currentColor"
|
|
22
|
+
<path d="M10 19H4C3.44772 19 3 18.5523 3 18V2C3 1.44772 3.44772 1 4 1H10V19Z" stroke="currentColor"
|
|
24
23
|
stroke-width="2" fill="none"/>
|
|
25
|
-
<path d="M17 2V18C17 18.5523 16.5523 19 16 19H10V1H16C16.5523 1 17 1.44772 17 2Z" stroke="currentColor"
|
|
24
|
+
<path d="M17 2V18C17 18.5523 16.5523 19 16 19H10V1H16C16.5523 1 17 1.44772 17 2Z" stroke="currentColor"
|
|
26
25
|
stroke-width="2" fill="none"/>
|
|
27
26
|
</svg>
|
|
28
|
-
|
|
27
|
+
`;
|
|
29
28
|
}
|
|
30
29
|
}
|
|
31
30
|
export {
|
|
32
|
-
|
|
31
|
+
i as ItemsIconsRegistry
|
|
33
32
|
};
|
|
@@ -17,54 +17,6 @@ const n = `/* Utils */
|
|
|
17
17
|
.container:has(.items-controls-container) {
|
|
18
18
|
padding: 0
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
/* ─── Migration Info Box ─────────────────────────────────────────────── */
|
|
22
|
-
/* Shown in the settings panel title when a block was migrated from legacy */
|
|
23
|
-
|
|
24
|
-
/* Layout variables for positioning the absolutely-placed info box */
|
|
25
|
-
:host {
|
|
26
|
-
--items-migration-padding: 16px;
|
|
27
|
-
--items-migration-title-height: 61px;
|
|
28
|
-
--items-migration-box-height: 98px;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/* Push tabs down when info box is present inside the control panel header */
|
|
32
|
-
.control-panel-header:has(.items-migration-info) {
|
|
33
|
-
position: relative;
|
|
34
|
-
margin-bottom: calc(2 * var(--items-migration-padding) + var(--items-migration-box-height));
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/* Info box container */
|
|
38
|
-
.items-migration-info {
|
|
39
|
-
display: flex;
|
|
40
|
-
align-items: flex-start;
|
|
41
|
-
gap: 8px;
|
|
42
|
-
padding: 12px;
|
|
43
|
-
background: var(--guido-color-background-onpage-message-info);
|
|
44
|
-
border: 1px solid var(--guido-color-border-onpage-message-info);
|
|
45
|
-
border-radius: 4px;
|
|
46
|
-
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.07);
|
|
47
|
-
position: absolute;
|
|
48
|
-
left: var(--items-migration-padding);
|
|
49
|
-
right: var(--items-migration-padding);
|
|
50
|
-
top: calc(var(--items-migration-padding) + var(--items-migration-title-height));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/* Icon — 18x19 icon inside a 24x24 bounding box (matches Figma) */
|
|
54
|
-
.items-migration-info__icon {
|
|
55
|
-
flex-shrink: 0;
|
|
56
|
-
width: 24px;
|
|
57
|
-
height: 24px;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/* Text content */
|
|
61
|
-
.items-migration-info__text {
|
|
62
|
-
margin: 4px 0;
|
|
63
|
-
white-space: normal;
|
|
64
|
-
font-size: 13px;
|
|
65
|
-
font-weight: 400;
|
|
66
|
-
line-height: 16px;
|
|
67
|
-
}
|
|
68
20
|
`;
|
|
69
21
|
export {
|
|
70
22
|
n as default
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var g = (r, o, t) =>
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { ensureMobileCssRulesExist as u } from "./controls/mobileLayout/cssRules.js";
|
|
1
|
+
var p = Object.defineProperty;
|
|
2
|
+
var f = (r, o, t) => o in r ? p(r, o, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[o] = t;
|
|
3
|
+
var g = (r, o, t) => f(r, typeof o != "symbol" ? o + "" : o, t);
|
|
4
|
+
import { Block as h, BlockCompositionType as I, ModificationDescription as _ } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
5
|
+
import { ensureMobileCssRulesExist as d } from "./controls/mobileLayout/cssRules.js";
|
|
7
6
|
import { RecommendationConfigService as s } from "./services/configService.js";
|
|
8
|
-
import { useRecommendationExtensionStore as
|
|
9
|
-
import { getDefaultTemplate as
|
|
10
|
-
const
|
|
11
|
-
class
|
|
7
|
+
import { useRecommendationExtensionStore as u } from "./store/recommendation.js";
|
|
8
|
+
import { getDefaultTemplate as k } from "./templates/grid/template.js";
|
|
9
|
+
const B = "recommendation-block", c = "ins-recommendation-v3-block-v2", a = "recommendation-id";
|
|
10
|
+
class y extends h {
|
|
12
11
|
constructor() {
|
|
13
12
|
super();
|
|
14
13
|
/**
|
|
@@ -18,13 +17,13 @@ class E extends _ {
|
|
|
18
17
|
g(this, "_pendingBlockId", null);
|
|
19
18
|
}
|
|
20
19
|
getId() {
|
|
21
|
-
return
|
|
20
|
+
return B;
|
|
22
21
|
}
|
|
23
22
|
getIcon() {
|
|
24
23
|
return "recommendation-icon";
|
|
25
24
|
}
|
|
26
25
|
getBlockCompositionType() {
|
|
27
|
-
return
|
|
26
|
+
return I.CONTAINER;
|
|
28
27
|
}
|
|
29
28
|
getName() {
|
|
30
29
|
return this.api.translate("Recommendation Block");
|
|
@@ -32,25 +31,6 @@ class E extends _ {
|
|
|
32
31
|
getDescription() {
|
|
33
32
|
return this.api.translate("Recommendation Block Title Description");
|
|
34
33
|
}
|
|
35
|
-
getSettingsPanelTitleHtml() {
|
|
36
|
-
if (k().migrations[f] === 0)
|
|
37
|
-
return "";
|
|
38
|
-
const e = this.api.translate("Recommendation Block"), i = 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.");
|
|
39
|
-
return `<div>
|
|
40
|
-
<div style="display: flex; align-items: center;">
|
|
41
|
-
<span>${e}</span>
|
|
42
|
-
</div>
|
|
43
|
-
<div class="recommendation-migration-info">
|
|
44
|
-
<${d.ICON}
|
|
45
|
-
${C.ICON.src}="migration-info-icon"
|
|
46
|
-
class="recommendation-migration-info__icon">
|
|
47
|
-
</${d.ICON}>
|
|
48
|
-
<p class="recommendation-migration-info__text">
|
|
49
|
-
${i}
|
|
50
|
-
</p>
|
|
51
|
-
</div>
|
|
52
|
-
</div>`;
|
|
53
|
-
}
|
|
54
34
|
/**
|
|
55
35
|
* Returns the template HTML for a new recommendation block.
|
|
56
36
|
* Generates a unique recommendation ID and embeds the instance class
|
|
@@ -60,7 +40,7 @@ class E extends _ {
|
|
|
60
40
|
*/
|
|
61
41
|
getTemplate() {
|
|
62
42
|
const t = this._generateNextId();
|
|
63
|
-
return this._pendingBlockId = t,
|
|
43
|
+
return this._pendingBlockId = t, k(t);
|
|
64
44
|
}
|
|
65
45
|
/**
|
|
66
46
|
* Called when a new block is dropped into the template
|
|
@@ -72,8 +52,8 @@ class E extends _ {
|
|
|
72
52
|
onCreated(t) {
|
|
73
53
|
const e = this._pendingBlockId ?? this._generateNextId();
|
|
74
54
|
this._pendingBlockId = null, this._assignRecommendationId(t, e);
|
|
75
|
-
const
|
|
76
|
-
|
|
55
|
+
const n = s.initializeConfig(this.api, t, { recommendationId: e }), i = u();
|
|
56
|
+
i.setCurrentBlock(e), d(this.api), i.patchCurrentBlockConfig({ language: n.language }, { triggerRefetch: !1 });
|
|
77
57
|
}
|
|
78
58
|
/**
|
|
79
59
|
* Called when the document changes or template is loaded
|
|
@@ -93,7 +73,7 @@ class E extends _ {
|
|
|
93
73
|
"Assign recommendation ID to legacy block"
|
|
94
74
|
);
|
|
95
75
|
}
|
|
96
|
-
s.needsMigration(t) && this._migrateFromLegacy(t),
|
|
76
|
+
s.needsMigration(t) && this._migrateFromLegacy(t), d(this.api);
|
|
97
77
|
}
|
|
98
78
|
}
|
|
99
79
|
/**
|
|
@@ -104,7 +84,7 @@ class E extends _ {
|
|
|
104
84
|
*/
|
|
105
85
|
onDelete(t) {
|
|
106
86
|
const e = this._getRecommendationId(t);
|
|
107
|
-
e &&
|
|
87
|
+
e && u().removeBlockState(e);
|
|
108
88
|
}
|
|
109
89
|
/**
|
|
110
90
|
* Generates the next unique recommendation ID by scanning all existing blocks
|
|
@@ -114,9 +94,9 @@ class E extends _ {
|
|
|
114
94
|
let t = 0;
|
|
115
95
|
try {
|
|
116
96
|
const e = this.api.getDocumentRoot();
|
|
117
|
-
e && "querySelectorAll" in e && e.querySelectorAll(`.${c}`).forEach((
|
|
118
|
-
if ("getAttribute" in
|
|
119
|
-
const m =
|
|
97
|
+
e && "querySelectorAll" in e && e.querySelectorAll(`.${c}`).forEach((i) => {
|
|
98
|
+
if ("getAttribute" in i) {
|
|
99
|
+
const m = i.getAttribute(a), l = m ? parseInt(m) : 0;
|
|
120
100
|
l > t && (t = l);
|
|
121
101
|
}
|
|
122
102
|
});
|
|
@@ -131,11 +111,11 @@ class E extends _ {
|
|
|
131
111
|
* added classes via setAttribute.
|
|
132
112
|
*/
|
|
133
113
|
_assignRecommendationId(t, e) {
|
|
134
|
-
const
|
|
135
|
-
if (!
|
|
114
|
+
const n = this._getBlockElement(t);
|
|
115
|
+
if (!n)
|
|
136
116
|
return;
|
|
137
|
-
const
|
|
138
|
-
|
|
117
|
+
const i = this.api.getDocumentModifier();
|
|
118
|
+
i.modifyHtml(n).setAttribute(a, e.toString()), i.apply(new _(`Assign recommendation ID ${e}`));
|
|
139
119
|
}
|
|
140
120
|
/**
|
|
141
121
|
* Gets the recommendation-id from a block node
|
|
@@ -144,11 +124,11 @@ class E extends _ {
|
|
|
144
124
|
const e = this._getBlockElement(t);
|
|
145
125
|
if (!e || !("getAttribute" in e))
|
|
146
126
|
return null;
|
|
147
|
-
const
|
|
148
|
-
if (!
|
|
127
|
+
const n = e.getAttribute(a);
|
|
128
|
+
if (!n)
|
|
149
129
|
return null;
|
|
150
|
-
const
|
|
151
|
-
return Number.isNaN(
|
|
130
|
+
const i = parseInt(n);
|
|
131
|
+
return Number.isNaN(i) ? null : i;
|
|
152
132
|
}
|
|
153
133
|
/**
|
|
154
134
|
* Gets the block element (the element with BLOCK_CLASS)
|
|
@@ -169,6 +149,6 @@ class E extends _ {
|
|
|
169
149
|
}
|
|
170
150
|
}
|
|
171
151
|
export {
|
|
172
|
-
|
|
173
|
-
|
|
152
|
+
B as BLOCK_ID,
|
|
153
|
+
y as RecommendationBlock
|
|
174
154
|
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { IconsRegistry as r } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
2
|
-
|
|
3
|
-
class h extends r {
|
|
2
|
+
class o extends r {
|
|
4
3
|
registerIconsSvg(C) {
|
|
5
4
|
C["recommendation-icon"] = `
|
|
6
5
|
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
@@ -60,9 +59,9 @@ class h extends r {
|
|
|
60
59
|
<circle cx="3" cy="16" r="1" stroke="currentColor" stroke-width="1"/>
|
|
61
60
|
<rect x="7" y="15" width="11" height="2" rx="1"/>
|
|
62
61
|
</svg>
|
|
63
|
-
|
|
62
|
+
`;
|
|
64
63
|
}
|
|
65
64
|
}
|
|
66
65
|
export {
|
|
67
|
-
|
|
66
|
+
o as RecommendationIconsRegistry
|
|
68
67
|
};
|
|
@@ -22,54 +22,6 @@ const n = `/* Utils */
|
|
|
22
22
|
ue-orderable.orderable-disabled .droppable-icon {
|
|
23
23
|
display: none;
|
|
24
24
|
}
|
|
25
|
-
|
|
26
|
-
/* ─── Migration Info Box ─────────────────────────────────────────────── */
|
|
27
|
-
/* Shown in the settings panel title when a block was migrated from legacy */
|
|
28
|
-
|
|
29
|
-
/* Layout variables for positioning the absolutely-placed info box */
|
|
30
|
-
:host {
|
|
31
|
-
--rec-migration-padding: 16px;
|
|
32
|
-
--rec-migration-title-height: 61px;
|
|
33
|
-
--rec-migration-box-height: 98px;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/* Push tabs down when info box is present inside the control panel header */
|
|
37
|
-
.control-panel-header:has(.recommendation-migration-info) {
|
|
38
|
-
position: relative;
|
|
39
|
-
margin-bottom: calc(2 * var(--rec-migration-padding) + var(--rec-migration-box-height));
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/* Info box container */
|
|
43
|
-
.recommendation-migration-info {
|
|
44
|
-
display: flex;
|
|
45
|
-
align-items: flex-start;
|
|
46
|
-
gap: 8px;
|
|
47
|
-
padding: 12px;
|
|
48
|
-
background: var(--guido-color-background-onpage-message-info);
|
|
49
|
-
border: 1px solid var(--guido-color-border-onpage-message-info);
|
|
50
|
-
border-radius: 4px;
|
|
51
|
-
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.07);
|
|
52
|
-
position: absolute;
|
|
53
|
-
left: var(--rec-migration-padding);
|
|
54
|
-
right: var(--rec-migration-padding);
|
|
55
|
-
top: calc(var(--rec-migration-padding) + var(--rec-migration-title-height));
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/* Icon — 18x19 icon inside a 24x24 bounding box (matches Figma) */
|
|
59
|
-
.recommendation-migration-info__icon {
|
|
60
|
-
flex-shrink: 0;
|
|
61
|
-
width: 24px;
|
|
62
|
-
height: 24px;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/* Text content */
|
|
66
|
-
.recommendation-migration-info__text {
|
|
67
|
-
margin: 4px 0;
|
|
68
|
-
white-space: normal;
|
|
69
|
-
font-size: 13px;
|
|
70
|
-
font-weight: 400;
|
|
71
|
-
line-height: 16px;
|
|
72
|
-
}
|
|
73
25
|
`;
|
|
74
26
|
export {
|
|
75
27
|
n as default
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var
|
|
2
|
-
var O = (T, r, e) => r in T ?
|
|
1
|
+
var I = Object.defineProperty;
|
|
2
|
+
var O = (T, r, e) => r in T ? I(T, r, { enumerable: !0, configurable: !0, writable: !0, value: e }) : T[r] = e;
|
|
3
3
|
var u = (T, r, e) => O(T, typeof r != "symbol" ? r + "" : r, e);
|
|
4
4
|
import { Control as c, UIElementType as n, UEAttr as $ } from "../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
5
5
|
class _ extends c {
|
|
@@ -129,14 +129,6 @@ class _ extends c {
|
|
|
129
129
|
</${n.BUTTON}>
|
|
130
130
|
`;
|
|
131
131
|
}
|
|
132
|
-
_GuIcon({ src: e, className: t = "" }) {
|
|
133
|
-
return `
|
|
134
|
-
<${n.ICON}
|
|
135
|
-
${$.ICON.src}="${e}"
|
|
136
|
-
${t ? `class="${t}"` : ""}>
|
|
137
|
-
</${n.ICON}>
|
|
138
|
-
`;
|
|
139
|
-
}
|
|
140
132
|
/**
|
|
141
133
|
*
|
|
142
134
|
* @param param0
|
|
@@ -175,9 +167,9 @@ class _ extends c {
|
|
|
175
167
|
_GuOrderable(e, t) {
|
|
176
168
|
let E = "";
|
|
177
169
|
t.forEach((a) => {
|
|
178
|
-
const
|
|
170
|
+
const l = $.ORDERABLE_ITEM && "name" in $.ORDERABLE_ITEM ? $.ORDERABLE_ITEM.name : "name";
|
|
179
171
|
E += `
|
|
180
|
-
<${n.ORDERABLE_ITEM} ${
|
|
172
|
+
<${n.ORDERABLE_ITEM} ${l}="${a.key}">
|
|
181
173
|
${a.content}
|
|
182
174
|
</${n.ORDERABLE_ITEM}>
|
|
183
175
|
`;
|