@useinsider/guido 2.1.0-beta.7ffef92 → 2.1.0-beta.84a7014
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/README.md +41 -2
- package/dist/@types/config/schemas.js +1 -1
- package/dist/components/Guido.vue.js +1 -1
- package/dist/components/Guido.vue2.js +66 -66
- package/dist/components/organisms/extensions/recommendation/FilterItem.vue.js +13 -11
- package/dist/components/organisms/extensions/recommendation/FilterItem.vue2.js +24 -55
- package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue.js +3 -3
- package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue2.js +21 -34
- package/dist/components/organisms/extensions/recommendation/Filters.vue.js +9 -9
- package/dist/components/organisms/extensions/recommendation/Filters.vue2.js +35 -44
- package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +1 -1
- package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +19 -19
- package/dist/composables/useSave.js +16 -12
- package/dist/composables/useStripo.js +63 -57
- package/dist/composables/useStripoEventHandler.js +27 -12
- package/dist/composables/useSyncModuleExtractor.js +45 -0
- package/dist/composables/useVersionHistoryApi.js +1 -1
- package/dist/config/i18n/en/index.js +11 -0
- package/dist/config/i18n/en/labels.json.js +7 -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 +65 -64
- package/dist/enums/unsubscribe.js +25 -21
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +39 -58
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +57 -93
- package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +8 -8
- 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/guido.css +1 -1
- package/dist/services/stripoApi.js +55 -19
- package/dist/src/@types/config/schemas.d.ts +1 -1
- package/dist/src/@types/events.d.ts +38 -2
- package/dist/src/components/Guido.vue.d.ts +2 -2
- package/dist/src/components/organisms/extensions/recommendation/FilterItem.vue.d.ts +0 -1
- package/dist/src/components/organisms/extensions/recommendation/Filters.vue.d.ts +1 -15
- 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/composables/useGuidoActions.d.ts +1 -1
- package/dist/src/composables/useSave.d.ts +2 -2
- package/dist/src/composables/useStripo.d.ts +2 -2
- package/dist/src/composables/useSyncModuleExtractor.d.ts +4 -0
- package/dist/src/config/i18n/en/index.d.ts +1 -0
- package/dist/src/config/i18n/index.d.ts +16 -0
- package/dist/src/enums/unsubscribe.d.ts +3 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +0 -5
- package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +2 -18
- package/dist/src/extensions/Blocks/Unsubscribe/control.d.ts +1 -0
- package/dist/src/mock/api/settings.d.ts +2 -0
- package/dist/src/services/stripoApi.d.ts +5 -0
- package/dist/src/stores/editor.d.ts +23 -0
- package/dist/src/utils/templatePreparation.d.ts +1 -1
- 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/editor.js +2 -1
- package/dist/stores/unsubscribe.js +37 -34
- package/dist/utils/templatePreparation.js +1 -1
- package/package.json +1 -1
- package/dist/extensions/Blocks/Recommendation/validation/filterSchema.js +0 -29
- package/dist/src/extensions/Blocks/Recommendation/validation/filterSchema.d.ts +0 -15
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const e = {
|
|
2
|
+
"Add template/pre-built modules, or structures with containers": "Structures and Modules lets you add templates, pre-built modules or structures with containers.",
|
|
3
|
+
"Allows uploading and editing images": "Image lets you add and edit images.",
|
|
4
|
+
"Allows working on text styles, adding merge tags and lists": "Text lets you edit text styles, add merge tags and lists.",
|
|
5
|
+
"Allows designing buttons of any shape, size, and color": "Button lets you edit the shape, size, and color of the buttons.",
|
|
6
|
+
"Meant to visually separate elements with a horizontal line": "Spacer lets you separate elements with a horizontal line.",
|
|
7
|
+
"Offers 70+ social media icons and chats of different design styles": "Social Networks lets you add social media icons and chat options in different design styles.",
|
|
8
|
+
"Helps taking users from emails to necessary pages on your site": "Menu lets you direct users from emails to the respective website.",
|
|
9
|
+
"Allows adding elements with custom code in emails": "HTML lets you add elements with custom code in emails.",
|
|
10
|
+
"Allows applying filters to images and placing text over them": "Banner lets you apply filters to images and add text over them.",
|
|
11
|
+
"Allows setting thumbnail images & play buttons for videos": "Video lets you set thumbnail images, add video links and play buttons for videos.",
|
|
12
|
+
"Adds a countdown to a specific date. Use the timer in emails for promotions, launches, and events": "Timer lets you add a countdown in your emails for promotions, launches or events.",
|
|
13
|
+
'The "AMP Carousel" block is currently being developed. Switch to the Old version of the Editor to access the full functionality needed to continue working on this email. Please note, that all changes you have already made to this email will be saved and available in the Old version': "Carousel lets you add templates, prebuilt modules or container-based structures via AMP HTML and HTML.",
|
|
14
|
+
'The "AMP Accordion" block is currently being development. Switch to the Old version of the Editor to access the full functionality needed to continue working on this email. Please note, that all changes you have already made to this email will be saved and available in the Old version': "AMP Accordion lets you add a collapsible accordion with customizable sections via AMP HTML.",
|
|
15
|
+
"An AMP Form block lets users collect feedback or run surveys directly in an email. It includes input fields and can be added in the Editor, allowing recipients to respond right from their inbox": "AMP Form Block lets you add input fields to collect feedback or run surveys via AMP HTML.",
|
|
16
|
+
"Will be applied to the entire email": "General Background Color lets you set the background color applied to the entire email.",
|
|
17
|
+
"Background image for the entire email. Some email clients (Windows 10 Mail, Android 4.4, the Gmail app for iOS, and Android for non-Gmail accounts) do not support background images. Thus, we recommend choosing a background color for the entire email similar to the selected image as a fallback.": "Background Image lets you upload an image for the entire email.",
|
|
18
|
+
"Repetition of the email background image. In Outlook for Windows, the image will be repeated in any case, regardless of whether this option is enabled or not. To bypass the Outlook limitation, you need to create an image in a third-party editor of the needed color and size so that it fits the entire background size, apply the required graphics to it, upload it, and center-align it in the email. The dimensions of such a background image should be at least 1,920 pixels in width, and the height should be equal to the height of the email.": "Background Image Repeat lets you enable the repetition of the background image.",
|
|
19
|
+
'The standard width of the email varies between 540-700 pixels. <a href="https://stripo.email/blog/email-template-size-width-height/" target="_blank" aria-label="Read more about the message width in our blog.">Read more here</a>': "Message Content Width lets you set the standard width of the email between 540 and 700 pixels.",
|
|
20
|
+
"Alignment of the email content area ": "Message Alignment lets you set the alignment of the email content area.",
|
|
21
|
+
"Your email will automatically adjust for smaller screens by displaying content in a single column. Side-by-side blocks will be stacked vertically": "Responsive Design lets your email adjust to smaller screens.",
|
|
22
|
+
"Your email will display the desktop version on mobile devices. Mobile-specific settings will be turned off in the Editor": "Note that Responsive Design can only be visible on the desktop version of mobile devices, and mobile settings will also be turned off when Responsive Design is disabled.",
|
|
23
|
+
"Enable the right-to-left (RTL) text direction to build emails easily without coding for recipients using RTL scripts, such as Arabic, Hebrew, Persian, Urdu, etc.": "Right to Left Text Direction lets you build emails in right-to-left (RTL) languages like Arabic, Hebrew, or Persian without coding.",
|
|
24
|
+
"Margins around the email message area": "Message on Desktop lets you set the margins around the message area.",
|
|
25
|
+
"The background image of the stripe. The image will not be displayed in an Outlook app on Windows email clients. We recommend choosing a stripe background color similar to the selected image as a fallback": "Background Image lets you drag and drop or add an image URL as a background image.",
|
|
26
|
+
'We automatically calculate the optimal indentation for your text. It depends on font size and line spacing <a href="https://en.wikipedia.org/wiki/Leading" target="_blank">leading<a/>': "Bottom Space lets you add space automatically depending on font size and line spacing.",
|
|
27
|
+
'Padding in the "Text" block makes space around the added text.': "Padding on Desktop lets you add space around the text in the Text block for desktop.",
|
|
28
|
+
"If an email client doesn't support the non-standard font, a similar standard font will be used instead.": "Note that a similar Safe font will be used instead of the selected font if users' devices don't support it.",
|
|
29
|
+
"This option ensures the most accurate display of your buttons in MS Outlook email clients by inserting a special VML-code. When this option is activated, the email message size can be increased up to kilobyte for each added button.": "Support for Outlook lets you display buttons accurately in Outlook by adding VML code, which may increase your email size.",
|
|
30
|
+
"Outlook for Windows does not have support for a separate button border width setting": "Style is not supported in Outlook for Windows as it doesn't allow separate button border width settings.",
|
|
31
|
+
"Outlook for Windows does not have a support for the border radius property. We recommend enabling the Outlook support option.": "Border is not supported in Outlook for Windows as it doesn't allow the border radius property. We recommend enabling Outlook Support.",
|
|
32
|
+
'The option "hover button styles" (changing colors upon a mouseover) is supported by a limited number of email clients. <a href="{link}" target="_blank">Learn more</a>': "Hover Button Styles can be supported by a limited number of users. For more information, you can visit Academy.",
|
|
33
|
+
"Button padding that makes the space around the button text": "Padding on Desktop lets you set the space around the button text for desktop.",
|
|
34
|
+
"The icon inside the button will not show in Outlook 2002, 2007, 2010, 2013, 2016, 2019 on Windows.": "The Icon won't be visible in Outlook 2002–2019 on Windows.",
|
|
35
|
+
"Margins around the button": "Margins on Desktop lets you set the space around the button.",
|
|
36
|
+
"It only works with CSS styles, so it is not supported by Outlook on Windows. We recommend enabling the Support for Outlook option.": "Border Radius lets you round the corners of the button. Note that it only works with CSS styles, so it's not supported by Outlook on Windows. We recommend enable the Support for Outlook.",
|
|
37
|
+
"Not supported by Outlook on Windows, so we recommend enabling the Support for Outlook option in the General Settings tab.": "Border lets you add an outline around the element. Note that it's not supported by Outlook on Windows. We recommend you enable the Support for Outlook in the General Settings.",
|
|
38
|
+
"Add content to the email, click it, and choose “Save as a module”. Stripes, Structures, and Containers can be saved as a module.": "Make sure you save modules once content is added. Note that Stripes, Structures, and Containers can be saved as a module.",
|
|
39
|
+
"This feature is only supported by Yahoo! Mail, Ukr.net, AOL, Gmail, iCloud Mail, Outlook 2003, Outlook for Mac and macOS Apple Mail": "Rollover Effect is supported by Yahoo Mail, Ukr.net, AOL, Gmail, iCloud Mail, Outlook 2003, Outlook for Mac and Apple Mail.",
|
|
40
|
+
"The aspect ratio of the added image does not match the others. Please replace it to match the {ratio} format": "Note that the aspect ratio of the secondary image doesn't match the aspect ratio of the primary one. Make sure you edit the ratio of the secondary image to ensure the Rollover Effect works properly.",
|
|
41
|
+
"Margins around the image": "Margins on Desktop lets you set the space around the image for desktop view.",
|
|
42
|
+
"The image will automatically adjust to the width of the screen on mobile devices that support it": "Responsive Image lets you adjust the screen width automatically on supported mobile devices.",
|
|
43
|
+
"Images won't be adjusted to the width of the screen on mobile devices, which may lead to poor display of images and content": "Make sure you enable Responsive Image to adjust the width of the screen on mobile devices to display images and content properly.",
|
|
44
|
+
"Make the image to fit to the width of a mobile screen. Please note: It only works on devices that have support for media queries.": "Responsive Image lets you make the image fit the width of a mobile screen. Note that it only works on supported devices.",
|
|
45
|
+
"You have the option of displaying a different image when your countdown timer expires.": "Display a different image when the countdown timer expires.",
|
|
46
|
+
"Margins around the timer": "Margin on Desktop lets you adjust the spacing around the timer on desktop screens.",
|
|
47
|
+
'Not all email clients support the selected link protocol. Check the <a href="https://support.stripo.email/en/articles/5332466-what-are-link-protocols-compatible-with-emails" target="_blank">compatibility guide</a> to learn more about supported clients.': "Note that not all user devices can support the selected link protocol. For more information about supported clients, you can visit Academy.",
|
|
48
|
+
"This forces the accordion to only allow one expanded section at any given time. Expanding one section will cause any other open sections to close.": "Ensure only one accordion section stays open by automatically collapsing the others when a new one is expanded.",
|
|
49
|
+
"Outlook for Windows does not have support for dashed and dotted borders": "Style lets you customize the border style of the element. Note that dashed and dotted borders aren't supported by Outlook on Windows.",
|
|
50
|
+
"Internal padding creates space around containers and blocks": "Padding on Desktop lets you create space around containers and blocks.",
|
|
51
|
+
"Margins around the separator line": "Margins on Desktop let you set the space around the separator line.",
|
|
52
|
+
"Use your own title and alternative text to each icon": "Title and Alternate Text Customization lets you add your own title and alternative text to each icon.",
|
|
53
|
+
"Margins around social network icons": "Margins on Desktop lets you set the space around social network icons.",
|
|
54
|
+
"Makes the menu fit to the container width": "Fit to Container lets you make the menu fit the container width.",
|
|
55
|
+
"Margins around elements formed by custom code": "Margins on Desktop lets you set margins around elements formed by custom code.",
|
|
56
|
+
"Margins around the banner": "Margins on Desktop lets you set margins around the banner.",
|
|
57
|
+
'Creates an anchor for this element. Anchor links in emails are designed to make navigation easier. They help take readers to specific places in the email without the need to scroll. <a href="https://support.stripo.email/en/articles/3174098-how-to-apply-anchor-hyperlinks" target="_blank">Learn more</a> about how it works and how to create one with Stripo.': "Anchor Link lets you create a link that takes users to a specific part of the email without scrolling.",
|
|
58
|
+
'Include the element in the necessary version of the email, or in both. <a target="_blank" href="https://stripo.email/blog/how-to-build-amp-emails-with-stripo/">Learn more about ⚡ HTML (AMP HTML).</a>': "Include In lets you include the element in the selected version of the email or in both versions.",
|
|
59
|
+
"The element will be included in both MIME versions of the email: classic HTML and AMP HTML": "The element will be included in both MIME versions of the email: classic HTML and AMP HTML",
|
|
60
|
+
"The element will be included only in the HTML MIME version of the email message. The item will be hidden in the AMP HTML version": "The element will be included only in the HTML MIME version of the email message. The item will be hidden in the AMP HTML version",
|
|
61
|
+
"The element will be included only in the AMP HTML MIME version of the email message. The item will be hidden in the HTML version": "The element will be included only in the AMP HTML MIME version of the email message. The item will be hidden in the HTML version",
|
|
62
|
+
"This element will not be hidden in email clients which do not support media queries.": "Hide Element on Mobile lets you hide the selected content from appearing on mobile.",
|
|
63
|
+
"The element will be hidden on Yahoo mobile App, as well as in mobile email client which do not support media queries.": "Hide on Desktop lets you hide the element on desktop devices that support media queries.",
|
|
64
|
+
"The element already hidden on Desktop. Activating this option you turning off hidden state for Desktop.": "Note that this element is already hidden on Desktop, it will be visible on desktop when you enable this.",
|
|
65
|
+
"The element already hidden on Mobile. Activating this option you turning off hidden state for Mobile.": "Note that this element is already hidden on mobile, it will be visible on mobile when you enable this.",
|
|
66
|
+
"An anchor link should not exceed more than 150 characters": "Enter an Anchor Link up to 150 characters.",
|
|
67
|
+
"An alternate text should not exceed more than 255 characters": "Enter an Alternate Text up to 255 characters.",
|
|
68
|
+
"A HEX color value should not exceed more than 8 symbols": "Enter a Hex Color value up to 8 characters to continue.",
|
|
69
|
+
"A keyword must have at least 2 characters": "Enter a keyword of 2 or more characters to continue.",
|
|
70
|
+
"Button label should not exceed more than 255 characters": "Enter a button label up to 255 characters to continue.",
|
|
71
|
+
"Link Name should not exceed more than 500 characters": "Enter a Link Name up to 500 characters to continue.",
|
|
72
|
+
"Menu Item Name should not exceed more than 255 characters": "Enter a Menu Item Name up to 255 characters to continue.",
|
|
73
|
+
"It is not possible to upload more than 50 files simultaneously. If possible, please try to complete this over a few iterations.": "Up to 50 files can be added at once.",
|
|
74
|
+
"Please enter a valid link": "Enter a valid link to continue.",
|
|
75
|
+
"The image with the invalid link cannot be saved to the image gallery": "Enter a valid image link to continue.",
|
|
76
|
+
"The data source link is unavailable. Please, make sure there is an access to the data source.": "Enter an accessible Data Source Link to contiue.",
|
|
77
|
+
"The file should not exceed the maximum resolution of {maxImageResolution}px.": "Upload files up to 1024x512 pixels to continue.",
|
|
78
|
+
"The option is disabled because was overridden in the Code editor": "The option is disabled because it was overridden in the Code Editor."
|
|
79
|
+
};
|
|
80
|
+
export {
|
|
81
|
+
e as default
|
|
82
|
+
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var M = (e, t, r) =>
|
|
4
|
-
import { productPairs as
|
|
5
|
-
import { ItemInCartOptions as
|
|
1
|
+
var v = Object.defineProperty;
|
|
2
|
+
var B = (e, t, r) => t in e ? v(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r;
|
|
3
|
+
var M = (e, t, r) => B(e, typeof t != "symbol" ? t + "" : t, r);
|
|
4
|
+
import { productPairs as U } from "../../extensions/Blocks/Items/enums/productEnums.js";
|
|
5
|
+
import { ItemInCartOptions as T, DefaultConfigValues as g, SETTINGS_ENUMS as u } from "../../extensions/Blocks/Items/enums/settingsEnums.js";
|
|
6
6
|
import { getDefaultTemplate as K } from "../../extensions/Blocks/Items/template.js";
|
|
7
7
|
const w = {
|
|
8
8
|
img: {
|
|
@@ -85,18 +85,19 @@ function q(e) {
|
|
|
85
85
|
}[e] || u.ITEMS_TYPE.CART_ITEMS : u.ITEMS_TYPE.CART_ITEMS;
|
|
86
86
|
}
|
|
87
87
|
function R(e) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
88
|
+
var a;
|
|
89
|
+
const t = (_, c) => _ == null ? c : _ === "1" || _ === "true", r = (_, c) => _ || c, l = e["data-type"] || e["data-source"], i = q(l), n = T[i];
|
|
90
|
+
let o = e["data-cart_items_select_control_value"] || ((a = n == null ? void 0 : n[0]) == null ? void 0 : a.value) || g.cartItemsSelectControlValue;
|
|
91
|
+
if (o && !o.includes("{{") && /^\d+$/.test(o)) {
|
|
92
|
+
const _ = parseInt(o) - 1, c = T[i];
|
|
93
|
+
c && c[_] && (o = c[_].value);
|
|
93
94
|
}
|
|
94
95
|
return {
|
|
95
96
|
initialized: !0,
|
|
96
97
|
blockInstanceId: r(e["data-block-instance-id"], F()),
|
|
97
98
|
source: i,
|
|
98
99
|
type: i,
|
|
99
|
-
itemsSelectValue:
|
|
100
|
+
itemsSelectValue: o,
|
|
100
101
|
orientation: e["data-card_orientation_control_value"] || u.ORIENTATION.VERTICAL,
|
|
101
102
|
nameTrimming: t(e["data-product_name_control_trim"], !0),
|
|
102
103
|
priceHideDiscount: t(e["data-product_price_control_nodup"], !0),
|
|
@@ -154,36 +155,36 @@ class V {
|
|
|
154
155
|
try {
|
|
155
156
|
let r = this.removeJinjaConditionals(t);
|
|
156
157
|
r = this.replaceTemplateVariables(r);
|
|
157
|
-
const
|
|
158
|
+
const l = this.parser.parseFromString(r, "text/html"), i = l.querySelectorAll(
|
|
158
159
|
"td.esd-cart-items-block, td.esd-browsed-items-block, td.esd-purchased-items-block"
|
|
159
160
|
);
|
|
160
161
|
return i.length === 0 ? (console.warn("ItemsBlockMigrator: No blocks found with items block selectors"), r) : (i.forEach((n) => {
|
|
161
|
-
const
|
|
162
|
-
orientation:
|
|
163
|
-
itemsType:
|
|
164
|
-
itemId:
|
|
165
|
-
currencySymbol:
|
|
166
|
-
currencyLocation:
|
|
167
|
-
formattedPrice:
|
|
168
|
-
configBlockAttributes:
|
|
162
|
+
const o = this.extractConfiguration(n), a = K({
|
|
163
|
+
orientation: o.orientation,
|
|
164
|
+
itemsType: o.itemsType,
|
|
165
|
+
itemId: o.itemId,
|
|
166
|
+
currencySymbol: o.currencySymbol,
|
|
167
|
+
currencyLocation: o.currencyLocation,
|
|
168
|
+
formattedPrice: o.formattedPrice,
|
|
169
|
+
configBlockAttributes: o.configBlockAttributes,
|
|
169
170
|
migrate: !0,
|
|
170
|
-
nameStyles:
|
|
171
|
-
buttonStyles:
|
|
172
|
-
priceStyles:
|
|
173
|
-
originalPriceStyles:
|
|
174
|
-
quantityStyles:
|
|
175
|
-
nodeConfig: R(
|
|
176
|
-
}),
|
|
177
|
-
`<table><tbody><tr>${
|
|
171
|
+
nameStyles: o.nameStyles,
|
|
172
|
+
buttonStyles: o.buttonStyles,
|
|
173
|
+
priceStyles: o.priceStyles,
|
|
174
|
+
originalPriceStyles: o.originalPriceStyles,
|
|
175
|
+
quantityStyles: o.quantityStyles,
|
|
176
|
+
nodeConfig: R(o.configBlockAttributes)
|
|
177
|
+
}), c = this.parser.parseFromString(
|
|
178
|
+
`<table><tbody><tr>${a}</tr></tbody></table>`,
|
|
178
179
|
"text/html"
|
|
179
180
|
).querySelector("td");
|
|
180
|
-
if (
|
|
181
|
-
const f = R(
|
|
182
|
-
|
|
183
|
-
const d =
|
|
184
|
-
d && d.remove(), n.parentNode.replaceChild(
|
|
181
|
+
if (c && n.parentNode) {
|
|
182
|
+
const f = R(o.configBlockAttributes);
|
|
183
|
+
c.setAttribute("esd-ext-config", JSON.stringify(f));
|
|
184
|
+
const d = c.querySelector("esd-config-block");
|
|
185
|
+
d && d.remove(), n.parentNode.replaceChild(c, n);
|
|
185
186
|
}
|
|
186
|
-
}),
|
|
187
|
+
}), l.documentElement.outerHTML);
|
|
187
188
|
} catch (r) {
|
|
188
189
|
return console.error("ItemsBlockMigrator failed:", r), t;
|
|
189
190
|
}
|
|
@@ -196,14 +197,14 @@ class V {
|
|
|
196
197
|
*/
|
|
197
198
|
extractConfiguration(t) {
|
|
198
199
|
var C, D, P;
|
|
199
|
-
const r = ((C = t.querySelector("[data-type]")) == null ? void 0 : C.getAttribute("data-type")) || "CART_ITEMS",
|
|
200
|
+
const r = ((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", i = parseInt(l) - 1, n = T[r], o = ((P = n == null ? void 0 : n[i]) == null ? void 0 : P.value) || n[0].value, a = t.querySelector('[product-attr="price"]'), _ = (a == null ? void 0 : a.getAttribute("data-currency_symbol")) || "USD", f = ((a == null ? void 0 : a.getAttribute("data-curency")) || "before") === "after" ? "1" : "0", d = (a == null ? void 0 : a.getAttribute("data-formated")) !== "false", s = this.extractConfigBlockAttributes(t, r, l), S = s["data-card_orientation_control_value"];
|
|
200
201
|
let b;
|
|
201
202
|
S ? b = S === "horizontal" ? "horizontal" : "vertical" : b = t.querySelector('[colspan="2"]') !== null ? "vertical" : "horizontal";
|
|
202
|
-
const p = t.querySelector('a[product-attr="name"]'), I = (p == null ? void 0 : p.getAttribute("style")) || void 0, y = t.querySelector('a[product-attr="button"]'), m = (y == null ? void 0 : y.getAttribute("style")) || void 0, h = (
|
|
203
|
+
const p = t.querySelector('a[product-attr="name"]'), I = (p == null ? void 0 : p.getAttribute("style")) || void 0, y = t.querySelector('a[product-attr="button"]'), m = (y == null ? void 0 : y.getAttribute("style")) || void 0, h = (a == null ? void 0 : a.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;
|
|
203
204
|
return {
|
|
204
205
|
orientation: b,
|
|
205
206
|
itemsType: r,
|
|
206
|
-
itemId:
|
|
207
|
+
itemId: o,
|
|
207
208
|
currencySymbol: _,
|
|
208
209
|
currencyLocation: f,
|
|
209
210
|
formattedPrice: d,
|
|
@@ -222,27 +223,27 @@ class V {
|
|
|
222
223
|
* @param itemsType - The type of items (CART_ITEMS, BROWSED_ITEMS, PURCHASED_ITEMS)
|
|
223
224
|
* @param itemNumber - The item number (1-based index)
|
|
224
225
|
*/
|
|
225
|
-
extractConfigBlockAttributes(t, r,
|
|
226
|
+
extractConfigBlockAttributes(t, r, l) {
|
|
226
227
|
const i = t.querySelector("esd-config-block"), n = {};
|
|
227
228
|
if (!i)
|
|
228
229
|
return this.getDefaultConfigBlockAttributes();
|
|
229
|
-
if (Array.from(i.attributes).forEach((
|
|
230
|
-
|
|
230
|
+
if (Array.from(i.attributes).forEach((a) => {
|
|
231
|
+
a.name.startsWith("data-") && (n[a.name] = a.value);
|
|
231
232
|
}), n["data-cart_items_select_control_value"]) {
|
|
232
|
-
const
|
|
233
|
-
if (/^\d+$/.test(
|
|
234
|
-
const _ = parseInt(
|
|
235
|
-
|
|
233
|
+
const a = n["data-cart_items_select_control_value"];
|
|
234
|
+
if (/^\d+$/.test(a)) {
|
|
235
|
+
const _ = parseInt(a) - 1, c = T[r];
|
|
236
|
+
c && c[_] && (n["data-cart_items_select_control_value"] = c[_].value);
|
|
236
237
|
}
|
|
237
238
|
}
|
|
238
239
|
if (n["data-product_price_control_curency"]) {
|
|
239
|
-
const
|
|
240
|
-
let _ =
|
|
241
|
-
|
|
240
|
+
const a = n["data-product_price_control_curency"];
|
|
241
|
+
let _ = a;
|
|
242
|
+
a === "before" ? _ = "0" : a === "after" && (_ = "1"), n["data-product_price_control_curency"] = _, n["data-product_price_currency_location"] = _;
|
|
242
243
|
}
|
|
243
244
|
(!n["data-product_price_control_currency_symbol"] || n["data-product_price_control_currency_symbol"].trim() === "") && (n["data-product_price_control_currency_symbol"] = "USD");
|
|
244
|
-
const
|
|
245
|
-
return
|
|
245
|
+
const o = { ...this.getDefaultConfigBlockAttributes(), ...n };
|
|
246
|
+
return o["data-type"] = r, o["data-source"] = r, o["data-product_image_link"] = $(r, l), o["data-product_button_link"] = x(r, l), o;
|
|
246
247
|
}
|
|
247
248
|
/**
|
|
248
249
|
* Returns default esd-config-block attributes based on the old template structure
|
|
@@ -302,15 +303,15 @@ class V {
|
|
|
302
303
|
* contains display condition Jinja scripts that should NOT be removed.
|
|
303
304
|
*/
|
|
304
305
|
removeJinjaConditionals(t) {
|
|
305
|
-
const r = "__ESD_DISPLAY_CONDITIONS_PLACEHOLDER__",
|
|
306
|
-
let i =
|
|
306
|
+
const r = "__ESD_DISPLAY_CONDITIONS_PLACEHOLDER__", l = t.match(/esd-custom-display-conditions="[^"]*"/);
|
|
307
|
+
let i = l ? t.replace(l[0], r) : t;
|
|
307
308
|
return i = i.replace(
|
|
308
309
|
/\{%\s*if\s+(ins_apr|browsed_item|purchased_item)_total_product_kind\s*(>|>)\s*\d+\s*%\}/g,
|
|
309
310
|
""
|
|
310
311
|
), i = i.replace(
|
|
311
312
|
/\{%\s*if\s+(ins_apr|browsed_item|purchased_item)_price_\d+\s*(!=|!=)\s*\1_originalprice_\d+\s*%\}/g,
|
|
312
313
|
""
|
|
313
|
-
), i = i.replace(/\{%\s*endif\s*%\}/g, ""),
|
|
314
|
+
), i = i.replace(/\{%\s*endif\s*%\}/g, ""), l && (i = i.replace(r, l[0])), i = i.replace(/\n\s*\n\s*\n/g, `
|
|
314
315
|
|
|
315
316
|
`), i;
|
|
316
317
|
}
|
|
@@ -324,26 +325,26 @@ class V {
|
|
|
324
325
|
* - {{purchased_item_formattedprice_5}} → '1,490.49' (PURCHASED_ITEMS)
|
|
325
326
|
*/
|
|
326
327
|
replaceTemplateVariables(t) {
|
|
327
|
-
const { PAIRS_FOR_EXTENSION: r } =
|
|
328
|
-
return t.replace(/{{([^}]+)}}/g, (
|
|
328
|
+
const { PAIRS_FOR_EXTENSION: r } = U;
|
|
329
|
+
return t.replace(/{{([^}]+)}}/g, (l, i) => {
|
|
329
330
|
const n = i.match(/^(ins_apr|browsed_item|purchased_item)_([a-z_]+)_(\d+)$/);
|
|
330
331
|
if (!n)
|
|
331
|
-
return
|
|
332
|
-
const [,
|
|
333
|
-
if (!
|
|
334
|
-
return console.warn(`Unknown variable prefix: ${
|
|
335
|
-
const f = w[
|
|
332
|
+
return l;
|
|
333
|
+
const [, o, a, _] = n, c = O[o];
|
|
334
|
+
if (!c)
|
|
335
|
+
return console.warn(`Unknown variable prefix: ${o}`), l;
|
|
336
|
+
const f = w[a];
|
|
336
337
|
if (!f)
|
|
337
|
-
return console.warn(`Unknown variable suffix mapping for: ${
|
|
338
|
-
const { pairsKey: d, defaultKey: s, isArray: S } = f, p = r[d][
|
|
338
|
+
return console.warn(`Unknown variable suffix mapping for: ${a}`), l;
|
|
339
|
+
const { pairsKey: d, defaultKey: s, isArray: S } = f, p = r[d][c];
|
|
339
340
|
if (!p)
|
|
340
|
-
return console.warn(`No data found for: ${d}.${
|
|
341
|
+
return console.warn(`No data found for: ${d}.${c}`), l;
|
|
341
342
|
if (S) {
|
|
342
343
|
const y = parseInt(_) - 1, m = p[s];
|
|
343
|
-
return Array.isArray(m) && m[y] ? m[y] : (console.warn(`Array value not found: ${d}.${
|
|
344
|
+
return Array.isArray(m) && m[y] ? m[y] : (console.warn(`Array value not found: ${d}.${c}.${s}[${y}]`), l);
|
|
344
345
|
}
|
|
345
346
|
const I = p[s];
|
|
346
|
-
return I !== void 0 ? String(I) : (console.warn(`Default value not found: ${d}.${
|
|
347
|
+
return I !== void 0 ? String(I) : (console.warn(`Default value not found: ${d}.${c}.${s}`), l);
|
|
347
348
|
});
|
|
348
349
|
}
|
|
349
350
|
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { useTranslations as e } from "../composables/useTranslations.js";
|
|
2
2
|
import { getEnvironmentPrefix as R } from "../utils/environmentUtil.js";
|
|
3
|
-
const
|
|
3
|
+
const _ = {
|
|
4
4
|
UNSUBSCRIBE_LINK_TYPE: 1,
|
|
5
5
|
PREFERENCES_LINK_TYPE: 3
|
|
6
|
-
},
|
|
6
|
+
}, I = {
|
|
7
7
|
UNSUBSCRIBE_LINK_REGEX: /{{ins-unsubscribe-link}}/g,
|
|
8
8
|
DATA_OGSB_BUTTON_CSS_REGEX: "\\[data-ogsb\\]\\s*\\.es-button\\.es-button-[0-9]+\\s*\\{(?:[^\\}]*)\\}",
|
|
9
9
|
GLOBAL_UNSUBSCRIBE_LINK_REGEX: /{{ins-global-unsubscribe-link}}/g,
|
|
10
10
|
PREFERENCES_UNSUBSCRIBE_LINK_REGEX: /{{ins-preferences-unsubscribe-link}}/g
|
|
11
|
-
},
|
|
12
|
-
UNSUBSCRIBE_URL: `https://mail.${
|
|
13
|
-
PREFERENCES_URL: `https://mail.${
|
|
14
|
-
},
|
|
11
|
+
}, n = R(), r = {
|
|
12
|
+
UNSUBSCRIBE_URL: `https://mail.${n}.com/user/v1/unsub`,
|
|
13
|
+
PREFERENCES_URL: `https://mail.${n}.com/user/v1/prefs`
|
|
14
|
+
}, B = "iid", i = {
|
|
15
15
|
name: "Global Unsubscribe",
|
|
16
16
|
sendGridId: "G"
|
|
17
17
|
}, C = "/email/unsubscribe-pages", E = {
|
|
@@ -20,6 +20,9 @@ const I = {
|
|
|
20
20
|
SUBSCRIPTION_PREFERENCE_CENTER: 3,
|
|
21
21
|
SUBSCRIPTION_PREFERENCE_CONFIRMATION: 4,
|
|
22
22
|
RESUBSCRIBE: 5
|
|
23
|
+
}, U = {
|
|
24
|
+
[E.GLOBAL_UNSUBSCRIBE]: "custom-unsubscribe",
|
|
25
|
+
[E.SUBSCRIPTION_PREFERENCE_CENTER]: "custom-preferences"
|
|
23
26
|
}, t = {
|
|
24
27
|
[E.GLOBAL_UNSUBSCRIBE]: [
|
|
25
28
|
E.GLOBAL_UNSUBSCRIBE,
|
|
@@ -30,29 +33,30 @@ const I = {
|
|
|
30
33
|
E.SUBSCRIPTION_PREFERENCE_CENTER,
|
|
31
34
|
E.SUBSCRIPTION_PREFERENCE_CONFIRMATION
|
|
32
35
|
]
|
|
33
|
-
},
|
|
34
|
-
const
|
|
36
|
+
}, c = () => {
|
|
37
|
+
const s = e();
|
|
35
38
|
return {
|
|
36
|
-
[E.GLOBAL_UNSUBSCRIBE]:
|
|
37
|
-
[E.GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE]:
|
|
38
|
-
[E.RESUBSCRIBE]:
|
|
39
|
-
[E.SUBSCRIPTION_PREFERENCE_CENTER]:
|
|
40
|
-
[E.SUBSCRIPTION_PREFERENCE_CONFIRMATION]:
|
|
39
|
+
[E.GLOBAL_UNSUBSCRIBE]: s("unsubscription-preference.type-global-unsubscribe"),
|
|
40
|
+
[E.GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE]: s("unsubscription-preference.type-global-unsubscription-confirmation"),
|
|
41
|
+
[E.RESUBSCRIBE]: s("unsubscription-preference.type-resubscribe"),
|
|
42
|
+
[E.SUBSCRIPTION_PREFERENCE_CENTER]: s("unsubscription-preference.type-subscription-preferences-center"),
|
|
43
|
+
[E.SUBSCRIPTION_PREFERENCE_CONFIRMATION]: s("unsubscription-preference.type-subscription-preferences-confirmation")
|
|
41
44
|
};
|
|
42
|
-
},
|
|
45
|
+
}, o = {
|
|
43
46
|
default: "{{ins-unsubscribe-link}}",
|
|
44
47
|
[E.GLOBAL_UNSUBSCRIBE]: "{{ins-global-unsubscribe-link}}",
|
|
45
48
|
[E.SUBSCRIPTION_PREFERENCE_CENTER]: "{{ins-preferences-unsubscribe-link}}"
|
|
46
49
|
};
|
|
47
50
|
export {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
i as DEFAULT_UNSUBSCRIBE_GROUP,
|
|
52
|
+
B as INSIDER_ID,
|
|
53
|
+
I as LINK_REGEXES,
|
|
54
|
+
_ as LINK_TYPES,
|
|
55
|
+
o as MERGE_TAGS,
|
|
53
56
|
E as PAGE_TYPES,
|
|
54
57
|
t as TYPE_COLLECTIONS,
|
|
55
58
|
C as UNSUBSCRIBE_PAGES_LINK,
|
|
56
|
-
|
|
57
|
-
|
|
59
|
+
U as UNSUBSCRIBE_SYNC_MODULE_TYPES,
|
|
60
|
+
r as URLS,
|
|
61
|
+
c as getTypeTranslations
|
|
58
62
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var n = (c, s, t) =>
|
|
4
|
-
import { CommonControl as
|
|
5
|
-
import { RecommendationConfigService as
|
|
1
|
+
var d = Object.defineProperty;
|
|
2
|
+
var m = (c, s, t) => s in c ? d(c, s, { enumerable: !0, configurable: !0, writable: !0, value: t }) : c[s] = t;
|
|
3
|
+
var n = (c, s, t) => m(c, typeof s != "symbol" ? s + "" : s, t);
|
|
4
|
+
import { CommonControl as h } from "../../../common-control.js";
|
|
5
|
+
import { RecommendationConfigService as f } from "../../services/configService.js";
|
|
6
6
|
import { useRecommendationExtensionStore as C } from "../../store/recommendation.js";
|
|
7
7
|
import { AlgorithmControl as p } from "./algorithm.js";
|
|
8
8
|
import { ALGORITHM_CONTROL_ID as W } from "./algorithm.js";
|
|
@@ -10,17 +10,17 @@ import { CurrencyControl as g } from "./currency.js";
|
|
|
10
10
|
import { CURRENCY_CONTROL_ID as H } from "./currency.js";
|
|
11
11
|
import { FiltersControl as R } from "./filters.js";
|
|
12
12
|
import { FILTERS_CONTROL_ID as j } from "./filters.js";
|
|
13
|
-
import { LocaleControl as
|
|
13
|
+
import { LocaleControl as y } from "./locale.js";
|
|
14
14
|
import { LOCALE_CONTROL_ID as K } from "./locale.js";
|
|
15
|
-
import { ProductLayoutControl as
|
|
15
|
+
import { ProductLayoutControl as _ } from "./productLayout.js";
|
|
16
16
|
import { PRODUCT_LAYOUT_CONTROL_ID as J } from "./productLayout.js";
|
|
17
|
-
import { ShuffleControl as
|
|
17
|
+
import { ShuffleControl as N } from "./shuffle.js";
|
|
18
18
|
import { SHUFFLE_CONTROL_ID as X } from "./shuffle.js";
|
|
19
|
-
import { regenerateProductRowsWithStyles as b, getBlockElement as
|
|
20
|
-
import { formatProductPrice as tt, getCardComposition as et, getCurrentLayout as ot, reapplySpacing as rt, regenerateMobileProductRows as
|
|
21
|
-
import { useDebounceFn as
|
|
19
|
+
import { regenerateProductRowsWithStyles as b, getBlockElement as P, updateProductContentInPlace as I } from "./utils.js";
|
|
20
|
+
import { formatProductPrice as tt, getCardComposition as et, getCurrentLayout as ot, reapplySpacing as rt, regenerateMobileProductRows as nt, regenerateProductRows as it, setCurrencyAttributes as st, updatePricesInPlace as ct, updateSingleProductContent as at } from "./utils.js";
|
|
21
|
+
import { useDebounceFn as l } from "../../../../../node_modules/@vueuse/shared/index.js";
|
|
22
22
|
const T = "recommendation-id", S = "ui-elements-recommendation-block";
|
|
23
|
-
class
|
|
23
|
+
class $ extends h {
|
|
24
24
|
constructor() {
|
|
25
25
|
super(...arguments);
|
|
26
26
|
n(this, "store", C());
|
|
@@ -36,19 +36,19 @@ class z extends f {
|
|
|
36
36
|
/**
|
|
37
37
|
* Debounced product fetch to prevent rapid API calls during config changes
|
|
38
38
|
*/
|
|
39
|
-
n(this, "_debouncedFetchProducts",
|
|
39
|
+
n(this, "_debouncedFetchProducts", l(() => {
|
|
40
40
|
this.store.fetchRecommendationProducts();
|
|
41
41
|
}, 500));
|
|
42
42
|
/**
|
|
43
43
|
* Debounced regeneration when products arrive from API
|
|
44
44
|
* Tries in-place update first to preserve styles, falls back to full regeneration
|
|
45
45
|
*/
|
|
46
|
-
n(this, "_debouncedRegenerateWithProducts",
|
|
46
|
+
n(this, "_debouncedRegenerateWithProducts", l(() => {
|
|
47
47
|
const t = this.store.recommendationProducts;
|
|
48
48
|
if (!this.currentNode || !this.api)
|
|
49
49
|
return;
|
|
50
50
|
const e = this.api.getDocumentModifier();
|
|
51
|
-
|
|
51
|
+
I({
|
|
52
52
|
currentNode: this.currentNode,
|
|
53
53
|
documentModifier: e,
|
|
54
54
|
products: t
|
|
@@ -59,7 +59,7 @@ class z extends f {
|
|
|
59
59
|
return S;
|
|
60
60
|
}
|
|
61
61
|
getTemplate() {
|
|
62
|
-
return this.algorithmControl = new p(), this.localeControl = new
|
|
62
|
+
return this.algorithmControl = new p(), this.localeControl = new y(), this.currencyControl = new g(), this.productLayoutControl = new _(), this.filtersControl = new R(), this.shuffleControl = new N(), `
|
|
63
63
|
<div class="recommendation-controls-container">
|
|
64
64
|
${this.algorithmControl.getTemplate()}
|
|
65
65
|
${this.localeControl.getTemplate()}
|
|
@@ -95,19 +95,19 @@ class z extends f {
|
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
97
|
onTemplateNodeUpdated(t) {
|
|
98
|
-
var
|
|
98
|
+
var i;
|
|
99
99
|
super.onTemplateNodeUpdated(t);
|
|
100
100
|
const e = this._getRecommendationIdFromNode(t);
|
|
101
|
-
e !== null && e !== this.store.currentRecommendationId && this.store.setCurrentBlock(e), this._syncNodeConfigToStore(), e !== null && !((
|
|
101
|
+
e !== null && e !== this.store.currentRecommendationId && this.store.setCurrentBlock(e), this._syncNodeConfigToStore(), e !== null && !((i = this.store.blockStates[e]) != null && i.isInitialized) && this._fetchBlockData(e), [
|
|
102
102
|
this.algorithmControl,
|
|
103
103
|
this.localeControl,
|
|
104
104
|
this.currencyControl,
|
|
105
105
|
this.productLayoutControl,
|
|
106
106
|
this.filtersControl,
|
|
107
107
|
this.shuffleControl
|
|
108
|
-
].forEach((
|
|
108
|
+
].forEach((r) => {
|
|
109
109
|
var a;
|
|
110
|
-
|
|
110
|
+
r != null && r.api && (r.currentNode = t, (a = r.onTemplateNodeUpdated) == null || a.call(r, t));
|
|
111
111
|
});
|
|
112
112
|
}
|
|
113
113
|
onDestroy() {
|
|
@@ -152,17 +152,13 @@ class z extends f {
|
|
|
152
152
|
* values are being prepared for the upcoming initial fetch.
|
|
153
153
|
*/
|
|
154
154
|
_syncNodeConfigToStore() {
|
|
155
|
-
|
|
156
|
-
const t = l.getConfig(this.currentNode), e = this.store.currentRecommendationId, o = e !== null && ((r = this.store.blockStates[e]) == null ? void 0 : r.isInitialized);
|
|
155
|
+
const t = f.getConfig(this.currentNode);
|
|
157
156
|
this.store.patchCurrentBlockConfig({
|
|
158
157
|
strategy: t.strategy,
|
|
159
158
|
language: t.language,
|
|
160
159
|
size: t.size,
|
|
161
160
|
productIds: t.productIds,
|
|
162
|
-
|
|
163
|
-
// After initialization, the Pinia store is the source of truth
|
|
164
|
-
// for filters (edited via the filter drawer).
|
|
165
|
-
...o ? {} : { filters: t.filters },
|
|
161
|
+
filters: t.filters,
|
|
166
162
|
shuffleProducts: t.shuffleProducts,
|
|
167
163
|
currencySettings: {
|
|
168
164
|
name: t.currency.code,
|
|
@@ -185,26 +181,26 @@ class z extends f {
|
|
|
185
181
|
this.store.fetchRecommendationFilters(),
|
|
186
182
|
this.store.fetchRecommendationCreateData(),
|
|
187
183
|
this.store.fetchRecommendationProducts()
|
|
188
|
-
])).forEach((o,
|
|
184
|
+
])).forEach((o, i) => {
|
|
189
185
|
o.status === "rejected" && console.warn(`Recommendation block: ${[
|
|
190
186
|
"fetchRecommendationFilters",
|
|
191
187
|
"fetchRecommendationCreateData",
|
|
192
188
|
"fetchRecommendationProducts"
|
|
193
|
-
][
|
|
189
|
+
][i]} failed`, o.reason);
|
|
194
190
|
});
|
|
195
191
|
}
|
|
196
192
|
/**
|
|
197
193
|
* Reads the recommendation-id attribute from the block element within the node
|
|
198
194
|
*/
|
|
199
195
|
_getRecommendationIdFromNode(t) {
|
|
200
|
-
const e =
|
|
196
|
+
const e = P(t);
|
|
201
197
|
if (!e || !("getAttribute" in e))
|
|
202
198
|
return null;
|
|
203
199
|
const o = e.getAttribute(T);
|
|
204
200
|
if (!o)
|
|
205
201
|
return null;
|
|
206
|
-
const
|
|
207
|
-
return Number.isNaN(
|
|
202
|
+
const i = parseInt(o);
|
|
203
|
+
return Number.isNaN(i) ? null : i;
|
|
208
204
|
}
|
|
209
205
|
/**
|
|
210
206
|
* Listen to store changes that require product refresh or regeneration.
|
|
@@ -217,27 +213,12 @@ class z extends f {
|
|
|
217
213
|
const { store: t } = this;
|
|
218
214
|
let e = t.recommendationProducts, o = t.$state.configVersion;
|
|
219
215
|
this.storeUnsubscription = t.$subscribe(() => {
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
const
|
|
223
|
-
a &&
|
|
216
|
+
const i = t.$state.configVersion;
|
|
217
|
+
i !== o && (o = i, this._debouncedFetchProducts());
|
|
218
|
+
const r = t.recommendationProducts, a = r !== e, u = Array.isArray(r) && r.length > 0;
|
|
219
|
+
a && u && (e = r, this._debouncedRegenerateWithProducts());
|
|
224
220
|
});
|
|
225
221
|
}
|
|
226
|
-
/**
|
|
227
|
-
* Persists the current filter state from Pinia store to the Stripo node config.
|
|
228
|
-
* This ensures filters survive template save/reload cycles.
|
|
229
|
-
*/
|
|
230
|
-
_persistFiltersToNodeConfig() {
|
|
231
|
-
if (!this.currentNode || !this.api)
|
|
232
|
-
return;
|
|
233
|
-
const { filters: t } = this.store.recommendationConfigs;
|
|
234
|
-
l.updateConfig(
|
|
235
|
-
this.api,
|
|
236
|
-
this.currentNode,
|
|
237
|
-
{ filters: t },
|
|
238
|
-
"Update recommendation filters"
|
|
239
|
-
);
|
|
240
|
-
}
|
|
241
222
|
}
|
|
242
223
|
export {
|
|
243
224
|
W as ALGORITHM_CONTROL_ID,
|
|
@@ -248,22 +229,22 @@ export {
|
|
|
248
229
|
j as FILTERS_CONTROL_ID,
|
|
249
230
|
R as FiltersControl,
|
|
250
231
|
K as LOCALE_CONTROL_ID,
|
|
251
|
-
|
|
232
|
+
y as LocaleControl,
|
|
252
233
|
J as PRODUCT_LAYOUT_CONTROL_ID,
|
|
253
|
-
|
|
254
|
-
|
|
234
|
+
_ as ProductLayoutControl,
|
|
235
|
+
$ as RecommendationBlockControl,
|
|
255
236
|
X as SHUFFLE_CONTROL_ID,
|
|
256
|
-
|
|
237
|
+
N as ShuffleControl,
|
|
257
238
|
tt as formatProductPrice,
|
|
258
|
-
|
|
239
|
+
P as getBlockElement,
|
|
259
240
|
et as getCardComposition,
|
|
260
241
|
ot as getCurrentLayout,
|
|
261
242
|
rt as reapplySpacing,
|
|
262
|
-
|
|
263
|
-
|
|
243
|
+
nt as regenerateMobileProductRows,
|
|
244
|
+
it as regenerateProductRows,
|
|
264
245
|
b as regenerateProductRowsWithStyles,
|
|
265
246
|
st as setCurrencyAttributes,
|
|
266
247
|
ct as updatePricesInPlace,
|
|
267
|
-
|
|
248
|
+
I as updateProductContentInPlace,
|
|
268
249
|
at as updateSingleProductContent
|
|
269
250
|
};
|