@useinsider/guido 1.0.3-beta.413aef4 → 1.0.3-beta.46b1cdf
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 +4 -0
- package/dist/components/Guido.vue.js +11 -9
- package/dist/components/Guido.vue2.js +14 -14
- package/dist/components/organisms/onboarding/NewVersionPopup.vue.js +9 -9
- package/dist/components/organisms/onboarding/NewVersionPopup.vue2.js +30 -17
- package/dist/components/organisms/onboarding/OnboardingWrapper.vue.js +12 -10
- package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +19 -18
- package/dist/config/migrator/index.js +7 -6
- package/dist/config/migrator/recommendationMigrator.js +293 -0
- package/dist/enums/date.js +6 -0
- package/dist/enums/defaults.js +4 -3
- package/dist/enums/onboarding.js +2 -1
- package/dist/extensions/Blocks/Recommendation/block.js +6 -3
- package/dist/extensions/Blocks/Recommendation/cardCompositionControl.js +103 -0
- package/dist/extensions/Blocks/Recommendation/constants.js +5 -0
- package/dist/extensions/Blocks/Recommendation/control.js +69 -40
- package/dist/extensions/Blocks/Recommendation/controls/button/align.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/button/border.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/button/borderRadius.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/button/color.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/button/fitToContent.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/button/fontFamily.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/button/margins.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/button/paddings.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/button/text.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/button/textSize.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/button/textStyleAndFontColor.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/image/margins.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/image/size.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/name/align.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/name/background.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/name/color.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/name/fontFamily.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/name/paddings.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/name/size.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/name/style.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/oldPrice/align.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/oldPrice/background.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/oldPrice/color.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/oldPrice/fontFamily.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/oldPrice/paddings.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/oldPrice/size.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/oldPrice/style.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/price/align.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/price/background.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/price/color.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/price/fontFamily.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/price/paddings.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/price/size.js +13 -0
- package/dist/extensions/Blocks/Recommendation/controls/price/style.js +13 -0
- package/dist/extensions/Blocks/Recommendation/extension.js +42 -7
- package/dist/extensions/Blocks/Recommendation/settingsPanel.js +107 -22
- package/dist/extensions/Blocks/Recommendation/templates/blockTemplate.js +160 -0
- package/dist/extensions/Blocks/Recommendation/templates/migrationTemplate.js +152 -0
- package/dist/extensions/Blocks/Recommendation/templates/templateUtils.js +180 -0
- package/dist/extensions/Blocks/common-control.js +125 -43
- package/dist/guido.css +1 -1
- package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +307 -100
- package/dist/package.json.js +1 -1
- package/dist/src/@types/generic.d.ts +6 -0
- package/dist/src/components/Guido.vue.d.ts +1 -0
- package/dist/src/components/organisms/onboarding/NewVersionPopup.vue.d.ts +3 -1
- package/dist/src/components/organisms/onboarding/OnboardingWrapper.vue.d.ts +3 -1
- package/dist/src/config/migrator/recommendationMigrator.d.ts +1 -0
- package/dist/src/enums/date.d.ts +4 -0
- package/dist/src/enums/onboarding.d.ts +1 -0
- package/dist/src/extensions/Blocks/Recommendation/block.d.ts +1 -0
- package/dist/src/extensions/Blocks/Recommendation/cardCompositionControl.d.ts +28 -0
- package/dist/src/extensions/Blocks/Recommendation/constants.d.ts +51 -0
- package/dist/src/extensions/Blocks/Recommendation/control.d.ts +6 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/button/align.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/button/border.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/button/borderRadius.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/button/color.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/button/fitToContent.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/button/fontFamily.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/button/margins.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/button/paddings.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/button/text.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/button/textSize.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/button/textStyleAndFontColor.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/image/margins.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/image/size.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/name/align.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/name/background.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/name/color.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/name/fontFamily.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/name/paddings.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/name/size.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/name/style.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/align.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/background.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/color.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/fontFamily.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/paddings.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/size.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/style.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/price/align.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/price/background.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/price/color.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/price/fontFamily.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/price/paddings.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/price/size.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/price/style.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/templates/blockTemplate.d.ts +16 -0
- package/dist/src/extensions/Blocks/Recommendation/templates/migrationTemplate.d.ts +16 -0
- package/dist/src/extensions/Blocks/Recommendation/templates/templateUtils.d.ts +44 -0
- package/dist/src/extensions/Blocks/common-control.d.ts +21 -0
- package/dist/src/stores/config.d.ts +1 -0
- package/dist/src/utils/dateUtil.d.ts +21 -0
- package/dist/static/styles/customEditorStyle.css.js +5 -0
- package/dist/utils/dateUtil.js +24 -3
- package/package.json +3 -3
- package/dist/extensions/Blocks/Recommendation/template.js +0 -200
- package/dist/src/extensions/Blocks/Recommendation/template.d.ts +0 -6
package/README.md
CHANGED
|
@@ -52,6 +52,7 @@ npm install @useinsider/guido
|
|
|
52
52
|
ref="guidoEditor"
|
|
53
53
|
:template-id="templateId"
|
|
54
54
|
:user-id="userId"
|
|
55
|
+
:migration-date="migrationDate"
|
|
55
56
|
:guido-config="guidoConfig"
|
|
56
57
|
:html="initialHtml"
|
|
57
58
|
:css="initialCss"
|
|
@@ -74,6 +75,7 @@ export default {
|
|
|
74
75
|
return {
|
|
75
76
|
templateId: 'template-123',
|
|
76
77
|
userId: 'user-456',
|
|
78
|
+
migrationDate: 1699488000,
|
|
77
79
|
initialHtml: '<p>Initial HTML content</p>',
|
|
78
80
|
initialCss: 'p { color: #333; }',
|
|
79
81
|
guidoConfig: {
|
|
@@ -145,6 +147,7 @@ export default {
|
|
|
145
147
|
| `templateId` | `string` | ✅ | - | Unique identifier for the email template |
|
|
146
148
|
| `userId` | `string` | ✅ | - | Unique identifier for the user |
|
|
147
149
|
| `guidoConfig` | `GuidoConfig` | ✅ | - | Configuration object for the editor |
|
|
150
|
+
| `migrationDate` | `number` | ✅ | - | Stripo migration date in Unix timestamp (seconds). Retrieved from backend `/partner-settings` endpoint as `migrationDate`. Used for onboarding process |
|
|
148
151
|
| `partnerName` | `string` | ⚪ | From URL host | Partner identifier |
|
|
149
152
|
| `productType` | `string` | ⚪ | From URL path | Product type identifier |
|
|
150
153
|
| `username` | `string` | ⚪ | `'Guido User'` | Display name for the user |
|
|
@@ -161,6 +164,7 @@ export default {
|
|
|
161
164
|
| `save:complete` | `Omit<Template, 'forceRecreate'>` | Fired when template is successfully saved |
|
|
162
165
|
| `on-change` | void | It Fires once for managing leave modal etc. |
|
|
163
166
|
| `ready` | void | Fired when the editor is ready and template is loaded |
|
|
167
|
+
| `onboarding-finished` | void | Fired when the onboarding popup is dismissed or completed, allowing parent applications to track onboarding state |
|
|
164
168
|
|
|
165
169
|
### Guido Exposed Methods
|
|
166
170
|
```typescript
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import i from "./Guido.vue2.js";
|
|
2
2
|
/* empty css */
|
|
3
|
-
import
|
|
3
|
+
import a from "../_virtual/_plugin-vue2_normalizer.js";
|
|
4
4
|
var t = function() {
|
|
5
5
|
var o = this, r = o._self._c, e = o._self._setupProxy;
|
|
6
|
-
return r("div", { staticClass: "guido-editor__wrapper", class: { "guido-editor__no-header": e.noHeader } }, [r(e.HeaderWrapper, { ref: "headerWrapperRef" }), e.editorStore.isPreviewModeOpen ? r(e.PreviewContainer) : o._e(), r("div", { directives: [{ name: "show", rawName: "v-show", value: !e.previewStore.isLoaded, expression: "!previewStore.isLoaded" }], staticClass: "guido-editor__container", class: { "guido-editor__no-header": e.noHeader }, attrs: { id: "guido-editor" } }), r(e.Toaster), r(e.FilterSelectionDrawer), r(e.SaveAsTemplateDrawer), e.isTestPartner() ? o._e() : r(e.OnboardingWrapper
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
return r("div", { staticClass: "guido-editor__wrapper", class: { "guido-editor__no-header": e.noHeader } }, [r(e.HeaderWrapper, { ref: "headerWrapperRef" }), e.editorStore.isPreviewModeOpen ? r(e.PreviewContainer) : o._e(), r("div", { directives: [{ name: "show", rawName: "v-show", value: !e.previewStore.isLoaded, expression: "!previewStore.isLoaded" }], staticClass: "guido-editor__container", class: { "guido-editor__no-header": e.noHeader }, attrs: { id: "guido-editor" } }), r(e.Toaster), r(e.FilterSelectionDrawer), r(e.SaveAsTemplateDrawer), e.isTestPartner() ? o._e() : r(e.OnboardingWrapper, { on: { "onboarding-finished": function(_) {
|
|
7
|
+
return e.emit("onboarding:finished");
|
|
8
|
+
} } }), r(e.UnsubscribeWrapper), r(e.LoadingWrapper)], 1);
|
|
9
|
+
}, n = [], s = /* @__PURE__ */ a(
|
|
10
|
+
i,
|
|
9
11
|
t,
|
|
10
|
-
|
|
12
|
+
n,
|
|
11
13
|
!1,
|
|
12
14
|
null,
|
|
13
|
-
"
|
|
15
|
+
"3c910a93"
|
|
14
16
|
);
|
|
15
|
-
const
|
|
17
|
+
const v = s.exports;
|
|
16
18
|
export {
|
|
17
|
-
|
|
19
|
+
v as default
|
|
18
20
|
};
|
|
@@ -15,8 +15,8 @@ import { useConfigStore as te } from "../stores/config.js";
|
|
|
15
15
|
import { useDynamicContentStore as ne } from "../stores/dynamic-content.js";
|
|
16
16
|
import { useEditorStore as re } from "../stores/editor.js";
|
|
17
17
|
import { usePreviewStore as ae } from "../stores/preview.js";
|
|
18
|
-
import { useUnsubscribeStore as
|
|
19
|
-
import
|
|
18
|
+
import { useUnsubscribeStore as ie } from "../stores/unsubscribe.js";
|
|
19
|
+
import se from "../node_modules/lodash-es/merge.js";
|
|
20
20
|
const Ge = /* @__PURE__ */ R({
|
|
21
21
|
__name: "Guido",
|
|
22
22
|
props: {
|
|
@@ -31,39 +31,39 @@ const Ge = /* @__PURE__ */ R({
|
|
|
31
31
|
guidoConfig: null,
|
|
32
32
|
templateConfig: null
|
|
33
33
|
},
|
|
34
|
-
emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready"],
|
|
34
|
+
emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished"],
|
|
35
35
|
setup(_, { expose: L, emit: t }) {
|
|
36
36
|
const u = _, k = I(
|
|
37
37
|
() => import("./organisms/email-preview/PreviewContainer.vue.js")
|
|
38
38
|
), A = I(
|
|
39
39
|
() => import("./organisms/onboarding/OnboardingWrapper.vue.js")
|
|
40
|
-
), l = x(), a = ne(), p =
|
|
40
|
+
), l = x(), a = ne(), p = ie(), g = te(), i = re(), N = ae(), n = U(() => i.hasChanges), { getPartnerName: f, getProductType: y, isTestPartner: F } = O(), v = () => {
|
|
41
41
|
var e;
|
|
42
42
|
return (e = l.value) == null ? void 0 : e.handleSave(!0);
|
|
43
43
|
}, {
|
|
44
|
-
templateId:
|
|
44
|
+
templateId: s,
|
|
45
45
|
userId: b,
|
|
46
46
|
guidoConfig: C,
|
|
47
47
|
templateConfig: o,
|
|
48
48
|
html: r = "",
|
|
49
49
|
css: h = "",
|
|
50
50
|
partnerName: c = f(),
|
|
51
|
-
productType:
|
|
51
|
+
productType: d = y(),
|
|
52
52
|
messageType: S = J,
|
|
53
53
|
username: w = q
|
|
54
|
-
} = u,
|
|
55
|
-
|
|
54
|
+
} = u, m = (o == null ? void 0 : o.preselectedDynamicContentList) || [];
|
|
55
|
+
i.templateId = s, window.GuidoConfig = se(Q, C), window.GuidoConfig.partner = {
|
|
56
56
|
partnerName: c,
|
|
57
|
-
productType:
|
|
57
|
+
productType: d,
|
|
58
58
|
messageType: S
|
|
59
59
|
}, g.templateConfig = o;
|
|
60
60
|
const { initPlugin: D } = j({
|
|
61
|
-
emailId:
|
|
61
|
+
emailId: s,
|
|
62
62
|
userId: b,
|
|
63
63
|
username: w,
|
|
64
64
|
partnerName: c,
|
|
65
|
-
productType:
|
|
66
|
-
preselectedDynamicContentList:
|
|
65
|
+
productType: d,
|
|
66
|
+
preselectedDynamicContentList: m,
|
|
67
67
|
onReady: () => {
|
|
68
68
|
console.debug("guido:ready"), t("ready");
|
|
69
69
|
}
|
|
@@ -99,7 +99,7 @@ const Ge = /* @__PURE__ */ R({
|
|
|
99
99
|
forceRecreate: !0
|
|
100
100
|
// TODO: It should be false for old templates. We will communicate with Stripo
|
|
101
101
|
};
|
|
102
|
-
e.html || (e = await T(), e.html = await W(e.html)), await D(e), a.selectedDynamicContentList =
|
|
102
|
+
e.html || (e = await T(), e.html = await W(e.html)), await D(e), a.selectedDynamicContentList = m;
|
|
103
103
|
} catch (e) {
|
|
104
104
|
console.error("Failed to initialize Stripo editor:", e);
|
|
105
105
|
}
|
|
@@ -120,7 +120,7 @@ const Ge = /* @__PURE__ */ R({
|
|
|
120
120
|
},
|
|
121
121
|
hasChanges: n,
|
|
122
122
|
saveSilent: v
|
|
123
|
-
}), { __sfc: !0, PreviewContainer: k, OnboardingWrapper: A, headerWrapperRef: l, dynamicContentStore: a, unsubscribeStore: p, props: u, configStore: g, editorStore:
|
|
123
|
+
}), { __sfc: !0, PreviewContainer: k, OnboardingWrapper: A, headerWrapperRef: l, dynamicContentStore: a, unsubscribeStore: p, props: u, configStore: g, editorStore: i, previewStore: N, hasChanges: n, getPartnerName: f, getProductType: y, isTestPartner: F, saveSilent: v, templateId: s, userId: b, guidoConfig: C, templateConfig: o, html: r, css: h, partnerName: c, productType: d, messageType: S, username: w, preselectedDynamicContentList: m, emit: t, initPlugin: D, getDefaultTemplate: T, noHeader: H, insertDynamicContent: E, closeDynamicContent: P, Toaster: V, FilterSelectionDrawer: X, HeaderWrapper: Y, LoadingWrapper: Z, SaveAsTemplateDrawer: $, UnsubscribeWrapper: ee };
|
|
124
124
|
}
|
|
125
125
|
});
|
|
126
126
|
export {
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import
|
|
1
|
+
import t from "./NewVersionPopup.vue2.js";
|
|
2
2
|
import n from "../../../_virtual/_plugin-vue2_normalizer.js";
|
|
3
|
-
var
|
|
4
|
-
var e = this,
|
|
5
|
-
return o.isVisible ?
|
|
6
|
-
},
|
|
7
|
-
|
|
8
|
-
r,
|
|
3
|
+
var i = function() {
|
|
4
|
+
var e = this, s = e._self._c, o = e._self._setupProxy;
|
|
5
|
+
return o.isVisible ? s(o.WpModal, { attrs: { id: "guido__new-version-popup", size: "medium", "close-on-outside-click": !1, "footer-button-options": o.footerButtonOptions, title: o.popupTitle }, on: { close: o.handleClose, "primary-action": o.handleDiscoverNow, "secondary-action": o.handleRemindLater } }, [s("div", { staticClass: "d-f f-d-c" }, [s("img", { staticClass: "w-1 h-1 d-b p-e-n mb-5", attrs: { src: o.onboardingImageSvg } }), s("p", { staticClass: "f-s-2 f-w-400", domProps: { innerHTML: e._s(o.popupDescription) } })])]) : e._e();
|
|
6
|
+
}, r = [], a = /* @__PURE__ */ n(
|
|
7
|
+
t,
|
|
9
8
|
i,
|
|
9
|
+
r,
|
|
10
10
|
!1,
|
|
11
11
|
null,
|
|
12
12
|
null
|
|
13
13
|
);
|
|
14
|
-
const
|
|
14
|
+
const _ = a.exports;
|
|
15
15
|
export {
|
|
16
|
-
|
|
16
|
+
_ as default
|
|
17
17
|
};
|
|
@@ -1,30 +1,43 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
|
|
1
|
+
import { defineComponent as g, ref as b, computed as o } from "vue";
|
|
2
|
+
import v from "../../wrappers/WpModal.vue.js";
|
|
3
|
+
import { useConfig as D } from "../../../composables/useConfig.js";
|
|
4
|
+
import { useTranslations as h } from "../../../composables/useTranslations.js";
|
|
5
|
+
import { ACADEMY_LINK as l } from "../../../enums/onboarding.js";
|
|
6
|
+
import y from "../../../static/assets/onboarding-img.svg.js";
|
|
7
|
+
import { useOnboardingStore as _ } from "../../../stores/onboarding.js";
|
|
8
|
+
import { isAfterDate as C, formatShortDate as L } from "../../../utils/dateUtil.js";
|
|
9
|
+
const I = /* @__PURE__ */ g({
|
|
7
10
|
__name: "NewVersionPopup",
|
|
8
|
-
|
|
9
|
-
|
|
11
|
+
emits: ["onboarding-finished"],
|
|
12
|
+
setup(w, { emit: a }) {
|
|
13
|
+
const e = h(), t = _(), s = b(!0), { config: p } = D(), i = o(() => p.migrationDate), n = o(() => C(i.value || 0)), d = o(() => L(
|
|
14
|
+
i.value
|
|
15
|
+
)), m = o(() => n.value ? e("email-editor.onboarding-popup-sunsetted-title") : e("email-editor.onboarding-title")), c = o(() => n.value ? e("email-editor.onboarding-popup-sunsetted-description", {
|
|
16
|
+
sunsetDate: d.value,
|
|
17
|
+
academyLink: l
|
|
18
|
+
}) : e("email-editor.onboarding-description", {
|
|
19
|
+
academyLink: l
|
|
20
|
+
})), u = o(() => n.value ? e("products.cancel") : e("products.remind-me-later")), f = o(() => ({
|
|
10
21
|
primaryButton: {
|
|
11
22
|
type: "primary",
|
|
12
|
-
labelText:
|
|
23
|
+
labelText: e("left-menu.discover-now")
|
|
13
24
|
},
|
|
14
25
|
secondaryButton: {
|
|
15
26
|
type: "subtle-primary",
|
|
16
|
-
labelText:
|
|
27
|
+
labelText: u.value
|
|
17
28
|
}
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
|
|
29
|
+
})), r = () => {
|
|
30
|
+
s.value = !1, a("onboarding-finished");
|
|
31
|
+
};
|
|
32
|
+
return { __sfc: !0, emit: a, trans: e, onboardingStore: t, isVisible: s, config: p, migrationDate: i, isAfterMigrationDate: n, formattedSunsetDate: d, popupTitle: m, popupDescription: c, secondaryButtonLabel: u, footerButtonOptions: f, closePopup: r, handleDiscoverNow: () => {
|
|
33
|
+
t.onDiscoverNowClicked(), r();
|
|
21
34
|
}, handleRemindLater: () => {
|
|
22
|
-
|
|
35
|
+
t.onRemindMeLater(), r();
|
|
23
36
|
}, handleClose: () => {
|
|
24
|
-
|
|
25
|
-
}, WpModal:
|
|
37
|
+
t.onNewVersionPopupClose(), r();
|
|
38
|
+
}, WpModal: v, onboardingImageSvg: y };
|
|
26
39
|
}
|
|
27
40
|
});
|
|
28
41
|
export {
|
|
29
|
-
|
|
42
|
+
I as default
|
|
30
43
|
};
|
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import t from "./OnboardingWrapper.vue2.js";
|
|
2
|
+
import i from "../../../_virtual/_plugin-vue2_normalizer.js";
|
|
3
3
|
var s = function() {
|
|
4
|
-
var n = this, e = n._self._c,
|
|
5
|
-
return e("div", n._l(
|
|
6
|
-
return e(
|
|
4
|
+
var n = this, e = n._self._c, r = n._self._setupProxy;
|
|
5
|
+
return e("div", n._l(r.visibleOnboardings, function(o) {
|
|
6
|
+
return e(o.component, { key: o.type, tag: "component", on: { "onboarding-finished": function(p) {
|
|
7
|
+
return r.emit("onboarding-finished");
|
|
8
|
+
} } });
|
|
7
9
|
}), 1);
|
|
8
|
-
},
|
|
9
|
-
|
|
10
|
+
}, _ = [], a = /* @__PURE__ */ i(
|
|
11
|
+
t,
|
|
10
12
|
s,
|
|
11
|
-
|
|
13
|
+
_,
|
|
12
14
|
!1,
|
|
13
15
|
null,
|
|
14
16
|
null
|
|
15
17
|
);
|
|
16
|
-
const
|
|
18
|
+
const d = a.exports;
|
|
17
19
|
export {
|
|
18
|
-
|
|
20
|
+
d as default
|
|
19
21
|
};
|
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { usePartner as
|
|
3
|
-
import { useEditorStore as
|
|
4
|
-
import { useOnboardingStore as
|
|
5
|
-
import { usePreviewStore as
|
|
6
|
-
import
|
|
7
|
-
import
|
|
1
|
+
import { defineComponent as b, computed as e, onMounted as O, watch as t } from "vue";
|
|
2
|
+
import { usePartner as u } from "../../../composables/usePartner.js";
|
|
3
|
+
import { useEditorStore as v } from "../../../stores/editor.js";
|
|
4
|
+
import { useOnboardingStore as l } from "../../../stores/onboarding.js";
|
|
5
|
+
import { usePreviewStore as y } from "../../../stores/preview.js";
|
|
6
|
+
import S from "./AMPOnboarding.vue.js";
|
|
7
|
+
import h from "./GenericOnboarding.vue.js";
|
|
8
8
|
import w from "./NewVersionPopup.vue.js";
|
|
9
9
|
import P from "./TextBlockOnboarding.vue.js";
|
|
10
|
-
import
|
|
11
|
-
const
|
|
10
|
+
import _ from "./VersionHistoryOnboarding.vue.js";
|
|
11
|
+
const F = /* @__PURE__ */ b({
|
|
12
12
|
__name: "OnboardingWrapper",
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
emits: ["onboarding-finished"],
|
|
14
|
+
setup(A, { emit: f }) {
|
|
15
|
+
const o = l(), r = v(), s = y(), { isTestPartner: a } = u(), p = e(() => r.isStripoInitialized), d = e(() => a()), m = [
|
|
15
16
|
{ type: "newVersionPopup", component: w },
|
|
16
|
-
{ type: "genericOnboarding", component:
|
|
17
|
+
{ type: "genericOnboarding", component: h },
|
|
17
18
|
{ type: "textBlockOnboarding", component: P },
|
|
18
|
-
{ type: "versionHistoryOnboarding", component:
|
|
19
|
-
{ type: "ampOnboarding", component:
|
|
20
|
-
], c = (n) => d.value || !p.value ? !1 : n === "newVersionPopup" ? o.shouldShowOnboarding(n) : o.isActive(n),
|
|
21
|
-
return
|
|
19
|
+
{ type: "versionHistoryOnboarding", component: _ },
|
|
20
|
+
{ type: "ampOnboarding", component: S }
|
|
21
|
+
], c = (n) => d.value || !p.value ? !1 : n === "newVersionPopup" ? o.shouldShowOnboarding(n) : o.isActive(n), g = e(() => m.filter((n) => c(n.type)));
|
|
22
|
+
return O(async () => {
|
|
22
23
|
await o.fetchUserModalState();
|
|
23
24
|
}), t(
|
|
24
25
|
() => r.isVersionHistoryOpen,
|
|
@@ -35,9 +36,9 @@ const E = /* @__PURE__ */ g({
|
|
|
35
36
|
(n) => {
|
|
36
37
|
!n && o.isActive("ampOnboarding") && o.close("ampOnboarding");
|
|
37
38
|
}
|
|
38
|
-
), { __sfc: !0, onboardingStore: o, editorStore: r, previewStore: s, isTestPartner: a, isStripoReady: p, isTestPartnerActive: d, onboardingConfigs: m, shouldShow: c, visibleOnboardings:
|
|
39
|
+
), { __sfc: !0, emit: f, onboardingStore: o, editorStore: r, previewStore: s, isTestPartner: a, isStripoReady: p, isTestPartnerActive: d, onboardingConfigs: m, shouldShow: c, visibleOnboardings: g };
|
|
39
40
|
}
|
|
40
41
|
});
|
|
41
42
|
export {
|
|
42
|
-
|
|
43
|
+
F as default
|
|
43
44
|
};
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { migrateCheckbox as
|
|
2
|
-
import { migrateCouponBlock as
|
|
1
|
+
import { migrateCheckbox as m } from "./checkboxMigrator.js";
|
|
2
|
+
import { migrateCouponBlock as o } from "./couponBlockMigrator.js";
|
|
3
3
|
import { migrateRadioButton as i } from "./radioButtonMigrator.js";
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import { migrateRecommendation as e } from "./recommendationMigrator.js";
|
|
5
|
+
import { migrateUnsubscribe as a } from "./unsubscribeMigrator.js";
|
|
6
|
+
const s = async (t) => {
|
|
6
7
|
let r = t;
|
|
7
|
-
return r =
|
|
8
|
+
return r = m(r), r = i(r), r = await a(r), r = o(r), r = e(r), r;
|
|
8
9
|
};
|
|
9
10
|
export {
|
|
10
|
-
|
|
11
|
+
s as migrate
|
|
11
12
|
};
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
var h = Object.defineProperty;
|
|
2
|
+
var T = (A, e, t) => e in A ? h(A, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : A[e] = t;
|
|
3
|
+
var m = (A, e, t) => T(A, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
+
import P, { prepareProductRows as S } from "../../extensions/Blocks/Recommendation/templates/migrationTemplate.js";
|
|
5
|
+
import { getDefaultProducts as q } from "../../extensions/Blocks/Recommendation/templates/templateUtils.js";
|
|
6
|
+
class w {
|
|
7
|
+
constructor() {
|
|
8
|
+
m(this, "parser");
|
|
9
|
+
this.parser = new DOMParser();
|
|
10
|
+
}
|
|
11
|
+
migrate(e) {
|
|
12
|
+
try {
|
|
13
|
+
const t = this.parser.parseFromString(e, "text/html"), s = t.querySelectorAll(
|
|
14
|
+
'td.ins-recommendation-v3-block-1, td.product-block[esd-handler-name*="EmailRecommendationV3"]'
|
|
15
|
+
);
|
|
16
|
+
return s.length === 0 ? e : (s.forEach((o) => {
|
|
17
|
+
const l = o.getAttribute("id"), r = this.extractBgColor(o), i = this.extractTitle(o), u = this.extractProductRows(o), c = P.replace("{-{-TITLE-}-}", i).replace("{-{-PRODUCT_ROWS-}-}", u), a = this.parser.parseFromString(
|
|
18
|
+
`<table id="tempDoc"><tbody><tr>${c}</tr></tbody></table>`,
|
|
19
|
+
"text/html"
|
|
20
|
+
).querySelector(".ins-recommendation-v3-block-v2");
|
|
21
|
+
a && o.parentNode && (l && a.setAttribute("id", l), r && a.setAttribute("bgcolor", r), o.parentNode.replaceChild(a, o));
|
|
22
|
+
}), t.documentElement.outerHTML);
|
|
23
|
+
} catch (t) {
|
|
24
|
+
return console.error("RecommendationMigrator failed:", t), e;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Extracts background color from old block
|
|
29
|
+
* @param block - The old recommendation block element
|
|
30
|
+
* @returns The background color value or empty string
|
|
31
|
+
*/
|
|
32
|
+
extractBgColor(e) {
|
|
33
|
+
const t = e.getAttribute("bgcolor");
|
|
34
|
+
if (t)
|
|
35
|
+
return t.trim();
|
|
36
|
+
const s = e.getAttribute("style");
|
|
37
|
+
if (s) {
|
|
38
|
+
const o = s.match(/background-color\s*:\s*([^;]+)/i);
|
|
39
|
+
if (o && o[1])
|
|
40
|
+
return o[1].trim();
|
|
41
|
+
}
|
|
42
|
+
return "";
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Extracts background color from product card wrapper element
|
|
46
|
+
* @param cardElement - The product card TD element
|
|
47
|
+
* @returns The background color value or empty string
|
|
48
|
+
*/
|
|
49
|
+
extractCardBgColor(e) {
|
|
50
|
+
const t = e.getAttribute("bgcolor");
|
|
51
|
+
if (t)
|
|
52
|
+
return t.trim();
|
|
53
|
+
const s = e.getAttribute("style");
|
|
54
|
+
if (s) {
|
|
55
|
+
const o = s.match(/background-color\s*:\s*([^;]+)/i);
|
|
56
|
+
if (o && o[1])
|
|
57
|
+
return o[1].trim();
|
|
58
|
+
}
|
|
59
|
+
return "";
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Extracts title from old block and converts to new structure
|
|
63
|
+
* @param block - The old recommendation block element
|
|
64
|
+
* @returns HTML string for the title block
|
|
65
|
+
*/
|
|
66
|
+
extractTitle(e) {
|
|
67
|
+
var a, g;
|
|
68
|
+
const t = e.querySelector(".ext-recommendation-title");
|
|
69
|
+
if (!t)
|
|
70
|
+
return this.buildTitleBlock({
|
|
71
|
+
text: "You May Also Like!",
|
|
72
|
+
isBold: !0,
|
|
73
|
+
isItalic: !1,
|
|
74
|
+
align: "center",
|
|
75
|
+
styles: "font-size: 28px; color: #333333;"
|
|
76
|
+
});
|
|
77
|
+
const s = t.querySelector("p");
|
|
78
|
+
if (!s) {
|
|
79
|
+
const p = ((a = t.textContent) == null ? void 0 : a.trim()) || "You May Also Like!", b = t.getAttribute("align") || "center";
|
|
80
|
+
return this.buildTitleBlock({
|
|
81
|
+
text: p,
|
|
82
|
+
isBold: !0,
|
|
83
|
+
isItalic: !1,
|
|
84
|
+
align: b,
|
|
85
|
+
styles: "font-size: 28px; color: #333333;"
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const o = ((g = s.textContent) == null ? void 0 : g.trim()) || "You May Also Like!", l = t.getAttribute("align") || s.getAttribute("align") || "center", r = s.getAttribute("style") || "", i = /font-weight\s*:\s*bold/i.test(r) || !!s.querySelector("b, strong"), u = /font-style\s*:\s*italic/i.test(r) || !!s.querySelector("i, em"), c = this.removeStyleProperties(r, ["font-weight", "font-style"]), n = this.convertInlineToBlock(c);
|
|
89
|
+
return this.buildTitleBlock({
|
|
90
|
+
text: o,
|
|
91
|
+
isBold: i,
|
|
92
|
+
isItalic: u,
|
|
93
|
+
align: l,
|
|
94
|
+
styles: n
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Extracts product configuration from old block and generates new product rows
|
|
99
|
+
* @param block - The old recommendation block element
|
|
100
|
+
* @returns HTML string for product rows
|
|
101
|
+
*/
|
|
102
|
+
extractProductRows(e) {
|
|
103
|
+
const t = this.extractProductConfig(e);
|
|
104
|
+
if (!t)
|
|
105
|
+
return console.warn("[RecommendationMigrator] No product config found, using defaults"), this.generateProductRows(6, 3, {});
|
|
106
|
+
const { totalCount: s, productsPerRow: o } = t, l = this.extractProductStyles(e);
|
|
107
|
+
return this.generateProductRows(s, o, l);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Extracts Stripo padding/margin utility classes from a class string
|
|
111
|
+
* @param classString - Space-separated class string from element
|
|
112
|
+
* @returns Filtered Stripo utility classes as a space-separated string
|
|
113
|
+
*/
|
|
114
|
+
extractStripoClasses(e) {
|
|
115
|
+
return e ? e.split(/\s+/).filter((o) => /^es-(p\d+|m[-\d])/.test(o)).join(" ") : "";
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Extracts product configuration from old block
|
|
119
|
+
* @param block - The old recommendation block element
|
|
120
|
+
* @returns Object with totalCount and productsPerRow, or null if parsing fails
|
|
121
|
+
*/
|
|
122
|
+
extractProductConfig(e) {
|
|
123
|
+
const t = e.getAttribute("esd-dev-product-config");
|
|
124
|
+
if (!t)
|
|
125
|
+
return null;
|
|
126
|
+
try {
|
|
127
|
+
const s = this.unescapeJsonString(t), o = JSON.parse(s);
|
|
128
|
+
return {
|
|
129
|
+
totalCount: o.totalCount ?? 6,
|
|
130
|
+
productsPerRow: o.rowCount ?? 3
|
|
131
|
+
};
|
|
132
|
+
} catch (s) {
|
|
133
|
+
return console.error("[RecommendationMigrator] Failed to parse product config:", s), console.error(
|
|
134
|
+
"[RecommendationMigrator] Error details:",
|
|
135
|
+
s instanceof Error ? s.message : String(s)
|
|
136
|
+
), null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Decodes HTML entities from JSON string
|
|
141
|
+
* @param text - The encoded string
|
|
142
|
+
* @returns Decoded string
|
|
143
|
+
*/
|
|
144
|
+
unescapeJsonString(e) {
|
|
145
|
+
return e.replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/'/g, "'").replace(/"/g, '"').replace(/\\\\"/g, "'");
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Generates product rows using prepareProductRows with default product data
|
|
149
|
+
* @param totalCount - Total number of products to display
|
|
150
|
+
* @param productsPerRow - Number of products in each row
|
|
151
|
+
* @param extractedStyles - Styles extracted from old product elements
|
|
152
|
+
* @returns HTML string for product rows with applied styles
|
|
153
|
+
*/
|
|
154
|
+
generateProductRows(e, t, s) {
|
|
155
|
+
const o = q(), l = [];
|
|
156
|
+
for (let i = 0; i < e; i++) {
|
|
157
|
+
const u = o[i % o.length];
|
|
158
|
+
l.push({ ...u });
|
|
159
|
+
}
|
|
160
|
+
let r = S(l, t);
|
|
161
|
+
return r = this.applyExtractedStyles(r, s), r;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Extracts styles from old product elements
|
|
165
|
+
* @param block - The old recommendation block element
|
|
166
|
+
* @returns Object with extracted styles for each element type
|
|
167
|
+
*/
|
|
168
|
+
extractProductStyles(e) {
|
|
169
|
+
const t = {}, s = e.querySelector(".product-card");
|
|
170
|
+
if (!s)
|
|
171
|
+
return console.warn("[RecommendationMigrator] No product card found, using default styles"), t;
|
|
172
|
+
const o = this.extractCardBgColor(s);
|
|
173
|
+
o && (t.cardBgColor = o);
|
|
174
|
+
const l = s.querySelector(".ext-product-image");
|
|
175
|
+
if (l) {
|
|
176
|
+
const n = l.querySelector("img"), a = n == null ? void 0 : n.getAttribute("width"), g = l.getAttribute("style") || "", p = l.getAttribute("align") || "center", b = l.getAttribute("class") || "", d = this.extractStripoClasses(b);
|
|
177
|
+
t.imageWidth = a || "120", t.imageAlign = p, t.imageTdStyle = g, t.imageClasses = d;
|
|
178
|
+
}
|
|
179
|
+
const r = s.querySelector(".ext-product-name");
|
|
180
|
+
if (r) {
|
|
181
|
+
const n = r.querySelector("p"), a = (n == null ? void 0 : n.getAttribute("style")) || "", g = r.getAttribute("align") || "center", p = r.getAttribute("style") || "", b = r.getAttribute("class") || "", d = this.extractStripoClasses(b);
|
|
182
|
+
t.nameStyle = a, t.nameAlign = g, t.nameTdStyle = p, t.nameClasses = d;
|
|
183
|
+
}
|
|
184
|
+
const i = s.querySelector(".ext-product-price");
|
|
185
|
+
if (i) {
|
|
186
|
+
const n = i.querySelector("p"), a = (n == null ? void 0 : n.getAttribute("style")) || "", g = i.getAttribute("align") || "center", p = i.getAttribute("style") || "", b = i.getAttribute("class") || "", d = this.extractStripoClasses(b);
|
|
187
|
+
t.priceStyle = a, t.priceAlign = g, t.priceTdStyle = p, t.priceClasses = d;
|
|
188
|
+
}
|
|
189
|
+
const u = s.querySelector(".ext-product-original-price");
|
|
190
|
+
if (u) {
|
|
191
|
+
const n = u.querySelector("p"), a = (n == null ? void 0 : n.getAttribute("style")) || "", g = u.getAttribute("align") || "center", p = u.getAttribute("style") || "", b = u.getAttribute("class") || "", d = this.extractStripoClasses(b);
|
|
192
|
+
t.oldPriceStyle = a, t.oldPriceAlign = g, t.oldPriceTdStyle = p, t.oldPriceClasses = d;
|
|
193
|
+
}
|
|
194
|
+
const c = s.querySelector(".ext-product-button");
|
|
195
|
+
if (c) {
|
|
196
|
+
const n = c.querySelector(".es-button-border"), a = c.querySelector("a.es-button"), g = (n == null ? void 0 : n.getAttribute("style")) || "", p = (a == null ? void 0 : a.getAttribute("style")) || "", b = c.getAttribute("align") || "center", d = c.getAttribute("style") || "", f = c.getAttribute("class") || "", C = this.extractStripoClasses(f), y = ((c == null ? void 0 : c.textContent) || "").trim();
|
|
197
|
+
t.buttonBorderStyle = g, t.buttonLinkStyle = p, t.buttonAlign = b, t.buttonTdStyle = d, t.buttonClasses = C, t.buttonText = y;
|
|
198
|
+
}
|
|
199
|
+
return t;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Applies extracted styles to the generated HTML
|
|
203
|
+
* @param html - The generated HTML from prepareProductRows
|
|
204
|
+
* @param extractedStyles - Styles extracted from old product elements
|
|
205
|
+
* @returns HTML with applied styles
|
|
206
|
+
*/
|
|
207
|
+
applyExtractedStyles(e, t) {
|
|
208
|
+
if (!t || Object.keys(t).length === 0)
|
|
209
|
+
return e;
|
|
210
|
+
const s = this.parser.parseFromString(`<table>${e}</table>`, "text/html");
|
|
211
|
+
t.cardBgColor && s.querySelectorAll(".product-attribute-cell").forEach((r) => {
|
|
212
|
+
r.setAttribute("bgcolor", t.cardBgColor);
|
|
213
|
+
}), (t.imageWidth || t.imageAlign || t.imageTdStyle || t.imageClasses) && s.querySelectorAll(".product-image").forEach((r) => {
|
|
214
|
+
if (t.imageAlign && r.setAttribute("align", t.imageAlign), t.imageTdStyle && r.setAttribute("style", t.imageTdStyle), t.imageClasses) {
|
|
215
|
+
const c = `${r.getAttribute("class") || ""} ${t.imageClasses}`.trim();
|
|
216
|
+
r.setAttribute("class", c);
|
|
217
|
+
}
|
|
218
|
+
const i = r.querySelector("img");
|
|
219
|
+
i && t.imageWidth && i.setAttribute("width", t.imageWidth);
|
|
220
|
+
}), (t.nameStyle || t.nameAlign || t.nameTdStyle || t.nameClasses) && s.querySelectorAll(".product-name").forEach((r) => {
|
|
221
|
+
if (t.nameAlign && r.setAttribute("align", t.nameAlign), t.nameTdStyle && r.setAttribute("style", t.nameTdStyle), t.nameClasses) {
|
|
222
|
+
const c = `${r.getAttribute("class") || ""} ${t.nameClasses}`.trim();
|
|
223
|
+
r.setAttribute("class", c);
|
|
224
|
+
}
|
|
225
|
+
const i = r.querySelector("p");
|
|
226
|
+
i && t.nameStyle && i.setAttribute("style", t.nameStyle);
|
|
227
|
+
}), (t.priceStyle || t.priceAlign || t.priceTdStyle || t.priceClasses) && s.querySelectorAll(".product-price").forEach((r) => {
|
|
228
|
+
if (t.priceAlign && r.setAttribute("align", t.priceAlign), t.priceTdStyle && r.setAttribute("style", t.priceTdStyle), t.priceClasses) {
|
|
229
|
+
const c = `${r.getAttribute("class") || ""} ${t.priceClasses}`.trim();
|
|
230
|
+
r.setAttribute("class", c);
|
|
231
|
+
}
|
|
232
|
+
const i = r.querySelector("p");
|
|
233
|
+
i && t.priceStyle && i.setAttribute("style", t.priceStyle);
|
|
234
|
+
}), (t.oldPriceStyle || t.oldPriceAlign || t.oldPriceTdStyle || t.oldPriceClasses) && s.querySelectorAll(".product-old-price").forEach((r) => {
|
|
235
|
+
if (t.oldPriceAlign && r.setAttribute("align", t.oldPriceAlign), t.oldPriceTdStyle && r.setAttribute("style", t.oldPriceTdStyle), t.oldPriceClasses) {
|
|
236
|
+
const c = `${r.getAttribute("class") || ""} ${t.oldPriceClasses}`.trim();
|
|
237
|
+
r.setAttribute("class", c);
|
|
238
|
+
}
|
|
239
|
+
const i = r.querySelector("p");
|
|
240
|
+
i && t.oldPriceStyle && i.setAttribute("style", t.oldPriceStyle);
|
|
241
|
+
}), (t.buttonBorderStyle || t.buttonLinkStyle || t.buttonAlign || t.buttonTdStyle || t.buttonClasses) && s.querySelectorAll(".product-button").forEach((r) => {
|
|
242
|
+
if (t.buttonAlign && r.setAttribute("align", t.buttonAlign), t.buttonTdStyle && r.setAttribute("style", t.buttonTdStyle), t.buttonClasses) {
|
|
243
|
+
const n = `${r.getAttribute("class") || ""} ${t.buttonClasses}`.trim();
|
|
244
|
+
r.setAttribute("class", n);
|
|
245
|
+
}
|
|
246
|
+
const i = r.querySelector(".es-button-border");
|
|
247
|
+
i && t.buttonBorderStyle && i.setAttribute("style", t.buttonBorderStyle);
|
|
248
|
+
const u = r.querySelector("a.es-button");
|
|
249
|
+
u && (t.buttonLinkStyle && u.setAttribute("style", t.buttonLinkStyle), t.buttonText && (u.textContent = t.buttonText));
|
|
250
|
+
});
|
|
251
|
+
const o = s.querySelector("table");
|
|
252
|
+
return (o == null ? void 0 : o.innerHTML) || e;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Builds title block with proper structure
|
|
256
|
+
*/
|
|
257
|
+
buildTitleBlock(e) {
|
|
258
|
+
let t = e.text;
|
|
259
|
+
e.isBold && e.isItalic ? t = `<strong path="1,0"><em path="1,0,0">${t}</em></strong>` : e.isBold ? t = `<strong path="1,0">${t}</strong>` : e.isItalic && (t = `<em path="1,0">${t}</em>`);
|
|
260
|
+
const s = e.align ? ` align="${e.align}"` : "", o = e.styles ? ` style="${e.styles}"` : "";
|
|
261
|
+
return `
|
|
262
|
+
<td class="esd-block-text es-p10t es-p10b es-p20l es-p20r"${s}>
|
|
263
|
+
<p path="1"${o}>
|
|
264
|
+
${t}
|
|
265
|
+
</p>
|
|
266
|
+
</td>
|
|
267
|
+
`;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Removes specified style properties from a style string
|
|
271
|
+
*/
|
|
272
|
+
removeStyleProperties(e, t) {
|
|
273
|
+
return e ? t.reduce((o, l) => {
|
|
274
|
+
const r = new RegExp(`${l}\\s*:\\s*[^;]*;?`, "gi");
|
|
275
|
+
return o.replace(r, "");
|
|
276
|
+
}, e).replace(/;\s*;/g, ";").replace(/^;|;$/g, "").trim() : "";
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Converts inline display to block display
|
|
280
|
+
*/
|
|
281
|
+
convertInlineToBlock(e) {
|
|
282
|
+
if (!e)
|
|
283
|
+
return "";
|
|
284
|
+
let t = e.replace(/display\s*:\s*inline/gi, "display: block");
|
|
285
|
+
return /display\s*:/i.test(t) || (t = t ? `${t}; display: block` : "display: block"), t.replace(/;\s*;/g, ";").replace(/^;|;$/g, "").replace(/"/g, "'").trim();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function k(A) {
|
|
289
|
+
return new w().migrate(A);
|
|
290
|
+
}
|
|
291
|
+
export {
|
|
292
|
+
k as migrateRecommendation
|
|
293
|
+
};
|