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