@useinsider/guido 3.0.0-beta.44d4c8e → 3.0.0-beta.4bf62ba
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Guido.vue.js +4 -4
- package/dist/components/Guido.vue2.js +91 -81
- package/dist/components/organisms/header/EditorActions.vue.js +10 -8
- package/dist/components/organisms/header/EditorActions.vue2.js +40 -30
- package/dist/components/organisms/header/MigrationConfirmModal.vue.js +17 -0
- package/dist/components/organisms/header/MigrationConfirmModal.vue2.js +39 -0
- package/dist/config/i18n/en/labels.json.js +8 -3
- package/dist/config/migrator/itemsBlockMigrator.js +135 -131
- package/dist/config/migrator/recommendationMigrator.js +58 -54
- package/dist/enums/block.js +4 -0
- package/dist/extensions/Blocks/Items/block.js +30 -21
- package/dist/extensions/Blocks/Items/iconsRegistry.js +7 -6
- package/dist/extensions/Blocks/Items/items.css.js +48 -0
- package/dist/extensions/Blocks/Recommendation/block.js +22 -13
- package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +5 -4
- package/dist/extensions/Blocks/Recommendation/recommendation.css.js +48 -0
- package/dist/extensions/Blocks/common-control.js +12 -4
- package/dist/guido.css +1 -1
- package/dist/src/@types/extensions/block.d.ts +2 -0
- package/dist/src/App.vue.d.ts +3 -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/enums/block.d.ts +4 -0
- package/dist/src/extensions/Blocks/Items/block.d.ts +3 -1
- package/dist/src/extensions/Blocks/Recommendation/block.d.ts +3 -1
- package/dist/src/extensions/Blocks/common-control.d.ts +5 -0
- package/dist/src/stores/template.d.ts +29 -0
- package/dist/src/utils/migrationBannerHtml.d.ts +2 -0
- package/dist/static/assets/info.svg.js +5 -0
- package/dist/stores/template.js +15 -0
- package/dist/utils/migrationBannerHtml.js +21 -0
- package/package.json +3 -2
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var M = (
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
1
|
+
var B = Object.defineProperty;
|
|
2
|
+
var v = (r, t, o) => t in r ? B(r, t, { enumerable: !0, configurable: !0, writable: !0, value: o }) : r[t] = o;
|
|
3
|
+
var M = (r, t, o) => v(r, typeof t != "symbol" ? t + "" : t, o);
|
|
4
|
+
import { BLOCK_ID as U } from "../../extensions/Blocks/Items/block.js";
|
|
5
|
+
import { productPairs as K } from "../../extensions/Blocks/Items/enums/productEnums.js";
|
|
6
|
+
import { ItemInCartOptions as T, DefaultConfigValues as g, SETTINGS_ENUMS as s } from "../../extensions/Blocks/Items/enums/settingsEnums.js";
|
|
7
|
+
import { getDefaultTemplate as w } from "../../extensions/Blocks/Items/template.js";
|
|
8
|
+
import { useTemplateStore as F } from "../../stores/template.js";
|
|
9
|
+
const q = {
|
|
8
10
|
img: {
|
|
9
11
|
pairsKey: "imageSrc",
|
|
10
12
|
defaultKey: "DEFAULT",
|
|
@@ -71,122 +73,124 @@ const w = {
|
|
|
71
73
|
isArray: !1
|
|
72
74
|
}
|
|
73
75
|
};
|
|
74
|
-
function
|
|
76
|
+
function O() {
|
|
75
77
|
return String(Date.now() + Math.floor(Math.random() * 1e3));
|
|
76
78
|
}
|
|
77
|
-
function
|
|
78
|
-
return
|
|
79
|
-
CartItems:
|
|
80
|
-
BrowsedItems:
|
|
81
|
-
PurchasedItems:
|
|
82
|
-
CART_ITEMS:
|
|
83
|
-
BROWSED_ITEMS:
|
|
84
|
-
PURCHASED_ITEMS:
|
|
85
|
-
}[
|
|
79
|
+
function $(r) {
|
|
80
|
+
return r ? {
|
|
81
|
+
CartItems: s.ITEMS_TYPE.CART_ITEMS,
|
|
82
|
+
BrowsedItems: s.ITEMS_TYPE.BROWSED_ITEMS,
|
|
83
|
+
PurchasedItems: s.ITEMS_TYPE.PURCHASED_ITEMS,
|
|
84
|
+
CART_ITEMS: s.ITEMS_TYPE.CART_ITEMS,
|
|
85
|
+
BROWSED_ITEMS: s.ITEMS_TYPE.BROWSED_ITEMS,
|
|
86
|
+
PURCHASED_ITEMS: s.ITEMS_TYPE.PURCHASED_ITEMS
|
|
87
|
+
}[r] || s.ITEMS_TYPE.CART_ITEMS : s.ITEMS_TYPE.CART_ITEMS;
|
|
86
88
|
}
|
|
87
|
-
function R(
|
|
88
|
-
var
|
|
89
|
-
const t = (
|
|
90
|
-
let
|
|
91
|
-
if (
|
|
92
|
-
const
|
|
93
|
-
|
|
89
|
+
function R(r) {
|
|
90
|
+
var e;
|
|
91
|
+
const t = (c, _) => c == null ? _ : c === "1" || c === "true", o = (c, _) => c || _, l = r["data-type"] || r["data-source"], a = $(l), n = T[a];
|
|
92
|
+
let i = r["data-cart_items_select_control_value"] || ((e = n == null ? void 0 : n[0]) == null ? void 0 : e.value) || g.cartItemsSelectControlValue;
|
|
93
|
+
if (i && !i.includes("{{") && /^\d+$/.test(i)) {
|
|
94
|
+
const c = parseInt(i) - 1, _ = T[a];
|
|
95
|
+
_ && _[c] && (i = _[c].value);
|
|
94
96
|
}
|
|
95
97
|
return {
|
|
96
98
|
initialized: !0,
|
|
97
|
-
blockInstanceId: r
|
|
98
|
-
source:
|
|
99
|
-
type:
|
|
100
|
-
itemsSelectValue:
|
|
101
|
-
orientation:
|
|
102
|
-
nameTrimming: t(
|
|
103
|
-
priceHideDiscount: t(
|
|
104
|
-
priceFormatted: t(
|
|
105
|
-
priceSinglePrice: t(
|
|
106
|
-
priceCurrencySymbol:
|
|
107
|
-
|
|
99
|
+
blockInstanceId: o(r["data-block-instance-id"], O()),
|
|
100
|
+
source: a,
|
|
101
|
+
type: a,
|
|
102
|
+
itemsSelectValue: i,
|
|
103
|
+
orientation: r["data-card_orientation_control_value"] || s.ORIENTATION.VERTICAL,
|
|
104
|
+
nameTrimming: t(r["data-product_name_control_trim"], !0),
|
|
105
|
+
priceHideDiscount: t(r["data-product_price_control_nodup"], !0),
|
|
106
|
+
priceFormatted: t(r["data-product_price_control_formated"], !0),
|
|
107
|
+
priceSinglePrice: t(r["data-product_price_control_single_price"], !1),
|
|
108
|
+
priceCurrencySymbol: o(
|
|
109
|
+
r["data-product_price_control_currency_symbol"],
|
|
108
110
|
g.productPriceCurrencySymbolControlValue
|
|
109
111
|
),
|
|
110
|
-
priceCurrencyLocation:
|
|
111
|
-
|
|
112
|
+
priceCurrencyLocation: o(
|
|
113
|
+
r["data-product_price_currency_location"],
|
|
112
114
|
g.productPriceCurrencyLocationControlValue
|
|
113
115
|
),
|
|
114
|
-
priceOrientation:
|
|
115
|
-
quantityControlEnabled: t(
|
|
116
|
-
buttonLink: r
|
|
117
|
-
imageLink: r
|
|
118
|
-
buttonLabel: r
|
|
119
|
-
buttonFullWidth: t(
|
|
120
|
-
imageVisible: t(
|
|
121
|
-
nameVisible: t(
|
|
122
|
-
quantityVisible: t(
|
|
123
|
-
priceVisible: t(
|
|
124
|
-
originalPriceVisible: t(
|
|
125
|
-
buttonVisible: t(
|
|
116
|
+
priceOrientation: r["data-product_original_price_control_orientation"] || "horizontal",
|
|
117
|
+
quantityControlEnabled: t(r["data-product_quantity_control_enabled"], !0),
|
|
118
|
+
buttonLink: o(r["data-product_button_link"], g.productButtonLinkControlValue),
|
|
119
|
+
imageLink: o(r["data-product_image_link"], g.productImageLinkControlValue),
|
|
120
|
+
buttonLabel: o(r["data-product_button_control_label"], "Buy"),
|
|
121
|
+
buttonFullWidth: t(r["data-product_button_control_atw"], !0),
|
|
122
|
+
imageVisible: t(r["data-product_image_control_enabled"], !0),
|
|
123
|
+
nameVisible: t(r["data-product_name_control_enabled"], !0),
|
|
124
|
+
quantityVisible: t(r["data-product_quantity_control_enabled"], !0),
|
|
125
|
+
priceVisible: t(r["data-product_price_control_enabled"], !0),
|
|
126
|
+
originalPriceVisible: t(r["data-product_original_price_control_enabled"], !0),
|
|
127
|
+
buttonVisible: t(r["data-product_button_control_enabled"], !0)
|
|
126
128
|
};
|
|
127
129
|
}
|
|
128
|
-
const
|
|
130
|
+
const x = {
|
|
129
131
|
ins_apr: "CART_ITEMS",
|
|
130
132
|
browsed_item: "BROWSED_ITEMS",
|
|
131
133
|
purchased_item: "PURCHASED_ITEMS"
|
|
132
134
|
};
|
|
133
|
-
function
|
|
134
|
-
const
|
|
135
|
+
function V(r, t) {
|
|
136
|
+
const o = {
|
|
135
137
|
CART_ITEMS: `{{Abandoned Cart Item (${t}) Image}}`,
|
|
136
138
|
BROWSED_ITEMS: `{{Browsed Item (${t}) Image}}`,
|
|
137
139
|
PURCHASED_ITEMS: `{{Purchased Item (${t}) Image}}`
|
|
138
140
|
};
|
|
139
|
-
return r
|
|
141
|
+
return o[r] || o.CART_ITEMS;
|
|
140
142
|
}
|
|
141
|
-
function
|
|
142
|
-
const
|
|
143
|
+
function N(r, t) {
|
|
144
|
+
const o = {
|
|
143
145
|
CART_ITEMS: `{{Abandoned Cart Item (${t}) Url}}`,
|
|
144
146
|
BROWSED_ITEMS: `{{Browsed Item (${t}) Url}}`,
|
|
145
147
|
PURCHASED_ITEMS: `{{Purchased Item (${t}) Url}}`
|
|
146
148
|
};
|
|
147
|
-
return r
|
|
149
|
+
return o[r] || o.CART_ITEMS;
|
|
148
150
|
}
|
|
149
|
-
class
|
|
151
|
+
class z {
|
|
150
152
|
constructor() {
|
|
151
153
|
M(this, "parser");
|
|
152
154
|
this.parser = new DOMParser();
|
|
153
155
|
}
|
|
154
156
|
migrate(t) {
|
|
155
157
|
try {
|
|
156
|
-
let
|
|
157
|
-
|
|
158
|
-
const l = this.parser.parseFromString(
|
|
158
|
+
let o = this.removeJinjaConditionals(t);
|
|
159
|
+
o = this.replaceTemplateVariables(o);
|
|
160
|
+
const l = this.parser.parseFromString(o, "text/html"), a = l.querySelectorAll(
|
|
159
161
|
"td.esd-cart-items-block, td.esd-browsed-items-block, td.esd-purchased-items-block"
|
|
160
162
|
);
|
|
161
|
-
return
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
163
|
+
return F().$patch((i) => {
|
|
164
|
+
i.migrations = { ...i.migrations, [U]: a.length };
|
|
165
|
+
}), a.length === 0 ? (console.warn("ItemsBlockMigrator: No blocks found with items block selectors"), o) : (a.forEach((i) => {
|
|
166
|
+
const e = this.extractConfiguration(i), c = w({
|
|
167
|
+
orientation: e.orientation,
|
|
168
|
+
itemsType: e.itemsType,
|
|
169
|
+
itemId: e.itemId,
|
|
170
|
+
currencySymbol: e.currencySymbol,
|
|
171
|
+
currencyLocation: e.currencyLocation,
|
|
172
|
+
formattedPrice: e.formattedPrice,
|
|
173
|
+
configBlockAttributes: e.configBlockAttributes,
|
|
170
174
|
migrate: !0,
|
|
171
|
-
nameStyles:
|
|
172
|
-
buttonStyles:
|
|
173
|
-
priceStyles:
|
|
174
|
-
originalPriceStyles:
|
|
175
|
-
quantityStyles:
|
|
176
|
-
nodeConfig: R(
|
|
177
|
-
}),
|
|
178
|
-
`<table><tbody><tr>${
|
|
175
|
+
nameStyles: e.nameStyles,
|
|
176
|
+
buttonStyles: e.buttonStyles,
|
|
177
|
+
priceStyles: e.priceStyles,
|
|
178
|
+
originalPriceStyles: e.originalPriceStyles,
|
|
179
|
+
quantityStyles: e.quantityStyles,
|
|
180
|
+
nodeConfig: R(e.configBlockAttributes)
|
|
181
|
+
}), d = this.parser.parseFromString(
|
|
182
|
+
`<table><tbody><tr>${c}</tr></tbody></table>`,
|
|
179
183
|
"text/html"
|
|
180
184
|
).querySelector("td");
|
|
181
|
-
if (
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
const
|
|
185
|
-
|
|
185
|
+
if (d && i.parentNode) {
|
|
186
|
+
const p = R(e.configBlockAttributes);
|
|
187
|
+
d.setAttribute("esd-ext-config", JSON.stringify(p));
|
|
188
|
+
const u = d.querySelector("esd-config-block");
|
|
189
|
+
u && u.remove(), i.parentNode.replaceChild(d, i);
|
|
186
190
|
}
|
|
187
191
|
}), l.documentElement.outerHTML);
|
|
188
|
-
} catch (
|
|
189
|
-
return console.error("ItemsBlockMigrator failed:",
|
|
192
|
+
} catch (o) {
|
|
193
|
+
return console.error("ItemsBlockMigrator failed:", o), t;
|
|
190
194
|
}
|
|
191
195
|
}
|
|
192
196
|
/**
|
|
@@ -197,18 +201,18 @@ class V {
|
|
|
197
201
|
*/
|
|
198
202
|
extractConfiguration(t) {
|
|
199
203
|
var C, D, P;
|
|
200
|
-
const
|
|
204
|
+
const o = ((C = t.querySelector("[data-type]")) == null ? void 0 : C.getAttribute("data-type")) || "CART_ITEMS", l = ((D = t.querySelector("[data-number]")) == null ? void 0 : D.getAttribute("data-number")) || "1", a = parseInt(l) - 1, n = T[o], i = ((P = n == null ? void 0 : n[a]) == null ? void 0 : P.value) || n[0].value, e = t.querySelector('[product-attr="price"]'), c = (e == null ? void 0 : e.getAttribute("data-currency_symbol")) || "USD", d = ((e == null ? void 0 : e.getAttribute("data-curency")) || "before") === "after" ? "1" : "0", p = (e == null ? void 0 : e.getAttribute("data-formated")) !== "false", u = this.extractConfigBlockAttributes(t, o, l), S = u["data-card_orientation_control_value"];
|
|
201
205
|
let b;
|
|
202
206
|
S ? b = S === "horizontal" ? "horizontal" : "vertical" : b = t.querySelector('[colspan="2"]') !== null ? "vertical" : "horizontal";
|
|
203
|
-
const
|
|
207
|
+
const y = t.querySelector('a[product-attr="name"]'), I = (y == null ? void 0 : y.getAttribute("style")) || void 0, f = t.querySelector('a[product-attr="button"]'), m = (f == null ? void 0 : f.getAttribute("style")) || void 0, h = (e == null ? void 0 : e.getAttribute("style")) || void 0, A = t.querySelector("p.original-price"), k = (A == null ? void 0 : A.getAttribute("style")) || void 0, E = t.querySelector('[product-attr="quantity"]'), L = (E == null ? void 0 : E.getAttribute("style")) || void 0;
|
|
204
208
|
return {
|
|
205
209
|
orientation: b,
|
|
206
|
-
itemsType:
|
|
207
|
-
itemId:
|
|
208
|
-
currencySymbol:
|
|
209
|
-
currencyLocation:
|
|
210
|
-
formattedPrice:
|
|
211
|
-
configBlockAttributes:
|
|
210
|
+
itemsType: o,
|
|
211
|
+
itemId: i,
|
|
212
|
+
currencySymbol: c,
|
|
213
|
+
currencyLocation: d,
|
|
214
|
+
formattedPrice: p,
|
|
215
|
+
configBlockAttributes: u,
|
|
212
216
|
nameStyles: I,
|
|
213
217
|
buttonStyles: m,
|
|
214
218
|
priceStyles: h,
|
|
@@ -223,27 +227,27 @@ class V {
|
|
|
223
227
|
* @param itemsType - The type of items (CART_ITEMS, BROWSED_ITEMS, PURCHASED_ITEMS)
|
|
224
228
|
* @param itemNumber - The item number (1-based index)
|
|
225
229
|
*/
|
|
226
|
-
extractConfigBlockAttributes(t,
|
|
227
|
-
const
|
|
228
|
-
if (!
|
|
230
|
+
extractConfigBlockAttributes(t, o, l) {
|
|
231
|
+
const a = t.querySelector("esd-config-block"), n = {};
|
|
232
|
+
if (!a)
|
|
229
233
|
return this.getDefaultConfigBlockAttributes();
|
|
230
|
-
if (Array.from(
|
|
231
|
-
|
|
234
|
+
if (Array.from(a.attributes).forEach((e) => {
|
|
235
|
+
e.name.startsWith("data-") && (n[e.name] = e.value);
|
|
232
236
|
}), n["data-cart_items_select_control_value"]) {
|
|
233
|
-
const
|
|
234
|
-
if (/^\d+$/.test(
|
|
235
|
-
const
|
|
236
|
-
|
|
237
|
+
const e = n["data-cart_items_select_control_value"];
|
|
238
|
+
if (/^\d+$/.test(e)) {
|
|
239
|
+
const c = parseInt(e) - 1, _ = T[o];
|
|
240
|
+
_ && _[c] && (n["data-cart_items_select_control_value"] = _[c].value);
|
|
237
241
|
}
|
|
238
242
|
}
|
|
239
243
|
if (n["data-product_price_control_curency"]) {
|
|
240
|
-
const
|
|
241
|
-
let
|
|
242
|
-
|
|
244
|
+
const e = n["data-product_price_control_curency"];
|
|
245
|
+
let c = e;
|
|
246
|
+
e === "before" ? c = "0" : e === "after" && (c = "1"), n["data-product_price_control_curency"] = c, n["data-product_price_currency_location"] = c;
|
|
243
247
|
}
|
|
244
248
|
(!n["data-product_price_control_currency_symbol"] || n["data-product_price_control_currency_symbol"].trim() === "") && (n["data-product_price_control_currency_symbol"] = "USD");
|
|
245
|
-
const
|
|
246
|
-
return
|
|
249
|
+
const i = { ...this.getDefaultConfigBlockAttributes(), ...n };
|
|
250
|
+
return i["data-type"] = o, i["data-source"] = o, i["data-product_image_link"] = V(o, l), i["data-product_button_link"] = N(o, l), i;
|
|
247
251
|
}
|
|
248
252
|
/**
|
|
249
253
|
* Returns default esd-config-block attributes based on the old template structure
|
|
@@ -303,17 +307,17 @@ class V {
|
|
|
303
307
|
* contains display condition Jinja scripts that should NOT be removed.
|
|
304
308
|
*/
|
|
305
309
|
removeJinjaConditionals(t) {
|
|
306
|
-
const
|
|
307
|
-
let
|
|
308
|
-
return
|
|
310
|
+
const o = "__ESD_DISPLAY_CONDITIONS_PLACEHOLDER__", l = t.match(/esd-custom-display-conditions="[^"]*"/);
|
|
311
|
+
let a = l ? t.replace(l[0], o) : t;
|
|
312
|
+
return a = a.replace(
|
|
309
313
|
/\{%\s*if\s+(ins_apr|browsed_item|purchased_item)_total_product_kind\s*(>|>)\s*\d+\s*%\}/g,
|
|
310
314
|
""
|
|
311
|
-
),
|
|
315
|
+
), a = a.replace(
|
|
312
316
|
/\{%\s*if\s+(ins_apr|browsed_item|purchased_item)_price_\d+\s*(!=|!=)\s*\1_originalprice_\d+\s*%\}/g,
|
|
313
317
|
""
|
|
314
|
-
),
|
|
318
|
+
), a = a.replace(/\{%\s*endif\s*%\}/g, ""), l && (a = a.replace(o, l[0])), a = a.replace(/\n\s*\n\s*\n/g, `
|
|
315
319
|
|
|
316
|
-
`),
|
|
320
|
+
`), a;
|
|
317
321
|
}
|
|
318
322
|
/**
|
|
319
323
|
* Replaces template variables with default values from productPairs
|
|
@@ -325,32 +329,32 @@ class V {
|
|
|
325
329
|
* - {{purchased_item_formattedprice_5}} → '1,490.49' (PURCHASED_ITEMS)
|
|
326
330
|
*/
|
|
327
331
|
replaceTemplateVariables(t) {
|
|
328
|
-
const { PAIRS_FOR_EXTENSION:
|
|
329
|
-
return t.replace(/{{([^}]+)}}/g, (l,
|
|
330
|
-
const n =
|
|
332
|
+
const { PAIRS_FOR_EXTENSION: o } = K;
|
|
333
|
+
return t.replace(/{{([^}]+)}}/g, (l, a) => {
|
|
334
|
+
const n = a.match(/^(ins_apr|browsed_item|purchased_item)_([a-z_]+)_(\d+)$/);
|
|
331
335
|
if (!n)
|
|
332
336
|
return l;
|
|
333
|
-
const [,
|
|
334
|
-
if (!
|
|
335
|
-
return console.warn(`Unknown variable prefix: ${
|
|
336
|
-
const
|
|
337
|
-
if (!
|
|
338
|
-
return console.warn(`Unknown variable suffix mapping for: ${
|
|
339
|
-
const { pairsKey:
|
|
340
|
-
if (!
|
|
341
|
-
return console.warn(`No data found for: ${
|
|
337
|
+
const [, i, e, c] = n, _ = x[i];
|
|
338
|
+
if (!_)
|
|
339
|
+
return console.warn(`Unknown variable prefix: ${i}`), l;
|
|
340
|
+
const d = q[e];
|
|
341
|
+
if (!d)
|
|
342
|
+
return console.warn(`Unknown variable suffix mapping for: ${e}`), l;
|
|
343
|
+
const { pairsKey: p, defaultKey: u, isArray: S } = d, y = o[p][_];
|
|
344
|
+
if (!y)
|
|
345
|
+
return console.warn(`No data found for: ${p}.${_}`), l;
|
|
342
346
|
if (S) {
|
|
343
|
-
const
|
|
344
|
-
return Array.isArray(m) && m[
|
|
347
|
+
const f = parseInt(c) - 1, m = y[u];
|
|
348
|
+
return Array.isArray(m) && m[f] ? m[f] : (console.warn(`Array value not found: ${p}.${_}.${u}[${f}]`), l);
|
|
345
349
|
}
|
|
346
|
-
const I =
|
|
347
|
-
return I !== void 0 ? String(I) : (console.warn(`Default value not found: ${
|
|
350
|
+
const I = y[u];
|
|
351
|
+
return I !== void 0 ? String(I) : (console.warn(`Default value not found: ${p}.${_}.${u}`), l);
|
|
348
352
|
});
|
|
349
353
|
}
|
|
350
354
|
}
|
|
351
|
-
function
|
|
352
|
-
return new
|
|
355
|
+
function Q(r) {
|
|
356
|
+
return new z().migrate(r);
|
|
353
357
|
}
|
|
354
358
|
export {
|
|
355
|
-
|
|
359
|
+
Q as migrateItemsBlock
|
|
356
360
|
};
|
|
@@ -1,11 +1,13 @@
|
|
|
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 $ } from "../../extensions/Blocks/Recommendation/templates/utils.js";
|
|
8
|
+
class B {
|
|
7
9
|
constructor() {
|
|
8
|
-
|
|
10
|
+
A(this, "parser");
|
|
9
11
|
this.parser = new DOMParser();
|
|
10
12
|
}
|
|
11
13
|
migrate(e) {
|
|
@@ -13,12 +15,14 @@ class w {
|
|
|
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
17
|
);
|
|
16
|
-
return
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
return w().$patch((i) => {
|
|
19
|
+
i.migrations = { ...i.migrations, [S]: s.length };
|
|
20
|
+
}), s.length === 0 ? e : (s.forEach((i) => {
|
|
21
|
+
const r = i.getAttribute("id"), n = this.extractBgColor(i), u = this.extractTitle(i), c = this.extractProductRows(i), l = P.replace("{-{-TITLE-}-}", u).replace("{-{-PRODUCT_ROWS-}-}", c), a = this.parser.parseFromString(
|
|
22
|
+
`<table id="tempDoc"><tbody><tr>${l}</tr></tbody></table>`,
|
|
19
23
|
"text/html"
|
|
20
24
|
).querySelector(".recommendation-block-v2");
|
|
21
|
-
a &&
|
|
25
|
+
a && i.parentNode && (r && a.setAttribute("id", r), n && a.setAttribute("bgcolor", n), i.parentNode.replaceChild(a, i));
|
|
22
26
|
}), t.documentElement.outerHTML);
|
|
23
27
|
} catch (t) {
|
|
24
28
|
return console.error("RecommendationMigrator failed:", t), e;
|
|
@@ -64,7 +68,7 @@ class w {
|
|
|
64
68
|
* @returns HTML string for the title block
|
|
65
69
|
*/
|
|
66
70
|
extractTitle(e) {
|
|
67
|
-
var
|
|
71
|
+
var g, a;
|
|
68
72
|
const t = e.querySelector(".ext-recommendation-title");
|
|
69
73
|
if (!t)
|
|
70
74
|
return this.buildTitleBlock({
|
|
@@ -76,7 +80,7 @@ class w {
|
|
|
76
80
|
});
|
|
77
81
|
const s = t.querySelector("p");
|
|
78
82
|
if (!s) {
|
|
79
|
-
const p = ((
|
|
83
|
+
const p = ((g = t.textContent) == null ? void 0 : g.trim()) || "You May Also Like!", b = t.getAttribute("align") || "center";
|
|
80
84
|
return this.buildTitleBlock({
|
|
81
85
|
text: p,
|
|
82
86
|
isBold: !0,
|
|
@@ -85,13 +89,13 @@ class w {
|
|
|
85
89
|
styles: "font-size: 28px; color: #333333;"
|
|
86
90
|
});
|
|
87
91
|
}
|
|
88
|
-
const o = ((
|
|
92
|
+
const o = ((a = s.textContent) == null ? void 0 : a.trim()) || "You May Also Like!", i = t.getAttribute("align") || s.getAttribute("align") || "center", r = s.getAttribute("style") || "", n = /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
93
|
return this.buildTitleBlock({
|
|
90
94
|
text: o,
|
|
91
|
-
isBold:
|
|
95
|
+
isBold: n,
|
|
92
96
|
isItalic: u,
|
|
93
|
-
align:
|
|
94
|
-
styles:
|
|
97
|
+
align: i,
|
|
98
|
+
styles: l
|
|
95
99
|
});
|
|
96
100
|
}
|
|
97
101
|
/**
|
|
@@ -103,8 +107,8 @@ class w {
|
|
|
103
107
|
const t = this.extractProductConfig(e);
|
|
104
108
|
if (!t)
|
|
105
109
|
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,
|
|
110
|
+
const { totalCount: s, productsPerRow: o } = t, i = this.extractProductStyles(e);
|
|
111
|
+
return this.generateProductRows(s, o, i);
|
|
108
112
|
}
|
|
109
113
|
/**
|
|
110
114
|
* Extracts Stripo padding/margin utility classes from a class string
|
|
@@ -152,12 +156,12 @@ class w {
|
|
|
152
156
|
* @returns HTML string for product rows with applied styles
|
|
153
157
|
*/
|
|
154
158
|
generateProductRows(e, t, s) {
|
|
155
|
-
const o =
|
|
156
|
-
for (let
|
|
157
|
-
const u = o[
|
|
158
|
-
|
|
159
|
+
const o = $(), i = [];
|
|
160
|
+
for (let n = 0; n < e; n++) {
|
|
161
|
+
const u = o[n % o.length];
|
|
162
|
+
i.push({ ...u });
|
|
159
163
|
}
|
|
160
|
-
let r =
|
|
164
|
+
let r = q(i, t);
|
|
161
165
|
return r = this.applyExtractedStyles(r, s), r;
|
|
162
166
|
}
|
|
163
167
|
/**
|
|
@@ -171,30 +175,30 @@ class w {
|
|
|
171
175
|
return console.warn("[RecommendationMigrator] No product card found, using default styles"), t;
|
|
172
176
|
const o = this.extractCardBgColor(s);
|
|
173
177
|
o && (t.cardBgColor = o);
|
|
174
|
-
const
|
|
175
|
-
if (
|
|
176
|
-
const
|
|
177
|
-
t.imageWidth =
|
|
178
|
+
const i = s.querySelector(".ext-product-image");
|
|
179
|
+
if (i) {
|
|
180
|
+
const l = i.querySelector("img"), g = l == null ? void 0 : l.getAttribute("width"), a = i.getAttribute("style") || "", p = i.getAttribute("align") || "center", b = i.getAttribute("class") || "", m = this.extractStripoClasses(b);
|
|
181
|
+
t.imageWidth = g || "120", t.imageAlign = p, t.imageTdStyle = a, t.imageClasses = m;
|
|
178
182
|
}
|
|
179
183
|
const r = s.querySelector(".ext-product-name");
|
|
180
184
|
if (r) {
|
|
181
|
-
const
|
|
182
|
-
t.nameStyle =
|
|
185
|
+
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);
|
|
186
|
+
t.nameStyle = g, t.nameAlign = a, t.nameTdStyle = p, t.nameClasses = m;
|
|
183
187
|
}
|
|
184
|
-
const
|
|
185
|
-
if (
|
|
186
|
-
const
|
|
187
|
-
t.priceStyle =
|
|
188
|
+
const n = s.querySelector(".ext-product-price");
|
|
189
|
+
if (n) {
|
|
190
|
+
const l = n.querySelector("p"), g = (l == null ? void 0 : l.getAttribute("style")) || "", a = n.getAttribute("align") || "center", p = n.getAttribute("style") || "", b = n.getAttribute("class") || "", m = this.extractStripoClasses(b);
|
|
191
|
+
t.priceStyle = g, t.priceAlign = a, t.priceTdStyle = p, t.priceClasses = m;
|
|
188
192
|
}
|
|
189
193
|
const u = s.querySelector(".ext-product-original-price");
|
|
190
194
|
if (u) {
|
|
191
|
-
const
|
|
192
|
-
t.oldPriceStyle =
|
|
195
|
+
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);
|
|
196
|
+
t.oldPriceStyle = g, t.oldPriceAlign = a, t.oldPriceTdStyle = p, t.oldPriceClasses = m;
|
|
193
197
|
}
|
|
194
198
|
const c = s.querySelector(".ext-product-button");
|
|
195
199
|
if (c) {
|
|
196
|
-
const
|
|
197
|
-
t.buttonBorderStyle =
|
|
200
|
+
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();
|
|
201
|
+
t.buttonBorderStyle = a, t.buttonLinkStyle = p, t.buttonAlign = b, t.buttonTdStyle = m, t.buttonClasses = C, t.buttonText = y;
|
|
198
202
|
}
|
|
199
203
|
return t;
|
|
200
204
|
}
|
|
@@ -215,36 +219,36 @@ class w {
|
|
|
215
219
|
const c = `${r.getAttribute("class") || ""} ${t.imageClasses}`.trim();
|
|
216
220
|
r.setAttribute("class", c);
|
|
217
221
|
}
|
|
218
|
-
const
|
|
219
|
-
|
|
222
|
+
const n = r.querySelector("img");
|
|
223
|
+
n && t.imageWidth && n.setAttribute("width", t.imageWidth);
|
|
220
224
|
}), (t.nameStyle || t.nameAlign || t.nameTdStyle || t.nameClasses) && s.querySelectorAll(".product-name").forEach((r) => {
|
|
221
225
|
if (t.nameAlign && r.setAttribute("align", t.nameAlign), t.nameTdStyle && r.setAttribute("style", t.nameTdStyle), t.nameClasses) {
|
|
222
226
|
const c = `${r.getAttribute("class") || ""} ${t.nameClasses}`.trim();
|
|
223
227
|
r.setAttribute("class", c);
|
|
224
228
|
}
|
|
225
|
-
const
|
|
226
|
-
|
|
229
|
+
const n = r.querySelector("p");
|
|
230
|
+
n && t.nameStyle && n.setAttribute("style", t.nameStyle);
|
|
227
231
|
}), (t.priceStyle || t.priceAlign || t.priceTdStyle || t.priceClasses) && s.querySelectorAll(".product-price").forEach((r) => {
|
|
228
232
|
if (t.priceAlign && r.setAttribute("align", t.priceAlign), t.priceTdStyle && r.setAttribute("style", t.priceTdStyle), t.priceClasses) {
|
|
229
233
|
const c = `${r.getAttribute("class") || ""} ${t.priceClasses}`.trim();
|
|
230
234
|
r.setAttribute("class", c);
|
|
231
235
|
}
|
|
232
|
-
const
|
|
233
|
-
|
|
236
|
+
const n = r.querySelector("p");
|
|
237
|
+
n && t.priceStyle && n.setAttribute("style", t.priceStyle);
|
|
234
238
|
}), (t.oldPriceStyle || t.oldPriceAlign || t.oldPriceTdStyle || t.oldPriceClasses) && s.querySelectorAll(".product-old-price").forEach((r) => {
|
|
235
239
|
if (t.oldPriceAlign && r.setAttribute("align", t.oldPriceAlign), t.oldPriceTdStyle && r.setAttribute("style", t.oldPriceTdStyle), t.oldPriceClasses) {
|
|
236
240
|
const c = `${r.getAttribute("class") || ""} ${t.oldPriceClasses}`.trim();
|
|
237
241
|
r.setAttribute("class", c);
|
|
238
242
|
}
|
|
239
|
-
const
|
|
240
|
-
|
|
243
|
+
const n = r.querySelector("p");
|
|
244
|
+
n && t.oldPriceStyle && n.setAttribute("style", t.oldPriceStyle);
|
|
241
245
|
}), (t.buttonBorderStyle || t.buttonLinkStyle || t.buttonAlign || t.buttonTdStyle || t.buttonClasses) && s.querySelectorAll(".product-button").forEach((r) => {
|
|
242
246
|
if (t.buttonAlign && r.setAttribute("align", t.buttonAlign), t.buttonTdStyle && r.setAttribute("style", t.buttonTdStyle), t.buttonClasses) {
|
|
243
|
-
const
|
|
244
|
-
r.setAttribute("class",
|
|
247
|
+
const l = `${r.getAttribute("class") || ""} ${t.buttonClasses}`.trim();
|
|
248
|
+
r.setAttribute("class", l);
|
|
245
249
|
}
|
|
246
|
-
const
|
|
247
|
-
|
|
250
|
+
const n = r.querySelector(".es-button-border");
|
|
251
|
+
n && t.buttonBorderStyle && n.setAttribute("style", t.buttonBorderStyle);
|
|
248
252
|
const u = r.querySelector("a.es-button");
|
|
249
253
|
u && (t.buttonLinkStyle && u.setAttribute("style", t.buttonLinkStyle), t.buttonText && (u.textContent = t.buttonText));
|
|
250
254
|
});
|
|
@@ -270,8 +274,8 @@ class w {
|
|
|
270
274
|
* Removes specified style properties from a style string
|
|
271
275
|
*/
|
|
272
276
|
removeStyleProperties(e, t) {
|
|
273
|
-
return e ? t.reduce((o,
|
|
274
|
-
const r = new RegExp(`${
|
|
277
|
+
return e ? t.reduce((o, i) => {
|
|
278
|
+
const r = new RegExp(`${i}\\s*:\\s*[^;]*;?`, "gi");
|
|
275
279
|
return o.replace(r, "");
|
|
276
280
|
}, e).replace(/;\s*;/g, ";").replace(/^;|;$/g, "").trim() : "";
|
|
277
281
|
}
|
|
@@ -285,9 +289,9 @@ class w {
|
|
|
285
289
|
return /display\s*:/i.test(t) || (t = t ? `${t}; display: block` : "display: block"), t.replace(/;\s*;/g, ";").replace(/^;|;$/g, "").replace(/"/g, "'").trim();
|
|
286
290
|
}
|
|
287
291
|
}
|
|
288
|
-
function
|
|
289
|
-
return new
|
|
292
|
+
function v(d) {
|
|
293
|
+
return new B().migrate(d);
|
|
290
294
|
}
|
|
291
295
|
export {
|
|
292
|
-
|
|
296
|
+
v as migrateRecommendation
|
|
293
297
|
};
|