@useinsider/guido 1.0.3-beta.9b9f41a → 1.0.3-beta.9d0ef3f
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 +3 -32
- package/dist/components/Guido.vue.js +1 -1
- package/dist/components/Guido.vue2.js +49 -48
- package/dist/composables/useActionsApi.js +33 -24
- package/dist/composables/useHtmlCompiler.js +15 -13
- package/dist/composables/useHtmlValidator.js +36 -35
- package/dist/composables/useStripo.js +58 -52
- package/dist/composables/useTimerClone.js +52 -0
- package/dist/config/compiler/itemsCompilerRules.js +14 -0
- package/dist/enums/unsubscribe.js +27 -26
- package/dist/extensions/Blocks/Checkbox/control.js +15 -14
- package/dist/extensions/Blocks/Checkbox/template.js +14 -9
- package/dist/extensions/Blocks/Items/block.js +26 -26
- package/dist/extensions/Blocks/Items/controls/cardComposition.js +151 -57
- package/dist/extensions/Blocks/Items/controls/name/trimming.js +2 -2
- package/dist/extensions/Blocks/Items/controls/settingsControl.js +149 -117
- package/dist/extensions/Blocks/Items/enums/productEnums.js +83 -5
- package/dist/extensions/Blocks/Items/enums/settingsEnums.js +7 -1
- package/dist/extensions/Blocks/Items/layouts/horizontal.html.js +57 -56
- package/dist/extensions/Blocks/Items/layouts/vertical.html.js +54 -55
- package/dist/extensions/Blocks/Items/settingsPanel.js +56 -31
- package/dist/extensions/Blocks/Items/template.js +138 -59
- package/dist/extensions/Blocks/RadioButton/control.js +18 -17
- package/dist/extensions/Blocks/RadioButton/template.js +18 -9
- package/dist/extensions/Blocks/Unsubscribe/block.js +27 -27
- package/dist/guido.css +1 -1
- package/dist/node_modules/lodash-es/_DataView.js +6 -0
- package/dist/node_modules/lodash-es/_Promise.js +6 -0
- package/dist/node_modules/lodash-es/_Set.js +6 -0
- package/dist/node_modules/lodash-es/_SetCache.js +13 -0
- package/dist/node_modules/lodash-es/_WeakMap.js +6 -0
- package/dist/node_modules/lodash-es/_arrayFilter.js +10 -0
- package/dist/node_modules/lodash-es/_arrayLikeKeys.js +13 -12
- package/dist/node_modules/lodash-es/_arrayMap.js +8 -0
- package/dist/node_modules/lodash-es/_arrayPush.js +8 -0
- package/dist/node_modules/lodash-es/_arraySome.js +9 -0
- package/dist/node_modules/lodash-es/_baseEach.js +6 -0
- package/dist/node_modules/lodash-es/_baseFlatten.js +13 -0
- package/dist/node_modules/lodash-es/_baseForOwn.js +8 -0
- package/dist/node_modules/lodash-es/_baseGet.js +11 -0
- package/dist/node_modules/lodash-es/_baseGetAllKeys.js +9 -0
- package/dist/node_modules/lodash-es/_baseHasIn.js +6 -0
- package/dist/node_modules/lodash-es/_baseIsEqual.js +8 -0
- package/dist/node_modules/lodash-es/_baseIsEqualDeep.js +32 -0
- package/dist/node_modules/lodash-es/_baseIsMatch.js +29 -0
- package/dist/node_modules/lodash-es/_baseIteratee.js +11 -0
- package/dist/node_modules/lodash-es/_baseKeys.js +14 -0
- package/dist/node_modules/lodash-es/_baseMap.js +11 -0
- package/dist/node_modules/lodash-es/_baseMatches.js +12 -0
- package/dist/node_modules/lodash-es/_baseMatchesProperty.js +17 -0
- package/dist/node_modules/lodash-es/_baseProperty.js +8 -0
- package/dist/node_modules/lodash-es/_basePropertyDeep.js +9 -0
- package/dist/node_modules/lodash-es/_baseRange.js +9 -0
- package/dist/node_modules/lodash-es/_baseToString.js +18 -0
- package/dist/node_modules/lodash-es/_baseTrim.js +8 -0
- package/dist/node_modules/lodash-es/_cacheHas.js +6 -0
- package/dist/node_modules/lodash-es/_castPath.js +10 -0
- package/dist/node_modules/lodash-es/_createBaseEach.js +15 -0
- package/dist/node_modules/lodash-es/_createRange.js +11 -0
- package/dist/node_modules/lodash-es/_equalArrays.js +40 -0
- package/dist/node_modules/lodash-es/_equalByTag.js +45 -0
- package/dist/node_modules/lodash-es/_equalObjects.js +36 -0
- package/dist/node_modules/lodash-es/_getAllKeys.js +9 -0
- package/dist/node_modules/lodash-es/_getMatchData.js +12 -0
- package/dist/node_modules/lodash-es/_getSymbols.js +10 -0
- package/dist/node_modules/lodash-es/_getTag.js +28 -0
- package/dist/node_modules/lodash-es/_hasPath.js +19 -0
- package/dist/node_modules/lodash-es/_isFlattenable.js +10 -0
- package/dist/node_modules/lodash-es/_isKey.js +12 -0
- package/dist/node_modules/lodash-es/_isStrictComparable.js +7 -0
- package/dist/node_modules/lodash-es/_mapToArray.js +9 -0
- package/dist/node_modules/lodash-es/_matchesStrictComparable.js +8 -0
- package/dist/node_modules/lodash-es/_memoizeCapped.js +11 -0
- package/dist/node_modules/lodash-es/_nativeKeys.js +5 -0
- package/dist/node_modules/lodash-es/_setCacheAdd.js +7 -0
- package/dist/node_modules/lodash-es/_setCacheHas.js +6 -0
- package/dist/node_modules/lodash-es/_setToArray.js +9 -0
- package/dist/node_modules/lodash-es/_stringToPath.js +10 -0
- package/dist/node_modules/lodash-es/_toKey.js +10 -0
- package/dist/node_modules/lodash-es/_trimmedEndIndex.js +9 -0
- package/dist/node_modules/lodash-es/flatMap.js +8 -0
- package/dist/node_modules/lodash-es/get.js +8 -0
- package/dist/node_modules/lodash-es/hasIn.js +8 -0
- package/dist/node_modules/lodash-es/isSymbol.js +9 -0
- package/dist/node_modules/lodash-es/keys.js +9 -0
- package/dist/node_modules/lodash-es/keysIn.js +3 -3
- package/dist/node_modules/lodash-es/map.js +11 -0
- package/dist/node_modules/lodash-es/property.js +10 -0
- package/dist/node_modules/lodash-es/range.js +5 -0
- package/dist/node_modules/lodash-es/stubArray.js +6 -0
- package/dist/node_modules/lodash-es/toFinite.js +14 -0
- package/dist/node_modules/lodash-es/toNumber.js +22 -0
- package/dist/node_modules/lodash-es/toString.js +7 -0
- package/dist/src/composables/useActionsApi.d.ts +1 -0
- package/dist/src/composables/useTimerClone.d.ts +6 -0
- package/dist/src/config/compiler/itemsCompilerRules.d.ts +2 -0
- package/dist/src/extensions/Blocks/Checkbox/template.d.ts +1 -1
- package/dist/src/extensions/Blocks/Items/block.d.ts +14 -0
- package/dist/src/extensions/Blocks/Items/controls/cardComposition.d.ts +20 -7
- package/dist/src/extensions/Blocks/Items/controls/settingsControl.d.ts +8 -2
- package/dist/src/extensions/Blocks/Items/enums/productEnums.d.ts +8 -0
- package/dist/src/extensions/Blocks/Items/enums/settingsEnums.d.ts +6 -0
- package/dist/src/extensions/Blocks/Items/template.d.ts +9 -1
- package/dist/src/extensions/Blocks/RadioButton/template.d.ts +1 -1
- package/dist/src/utils/environmentUtil.d.ts +5 -0
- package/dist/src/utils/pairProductVariables.d.ts +7 -0
- package/dist/utils/environmentUtil.js +4 -0
- package/dist/utils/pairProductVariables.js +136 -0
- package/package.json +3 -10
package/README.md
CHANGED
|
@@ -600,6 +600,9 @@ Create a `.env` file with the following variables: (You can get env variables fr
|
|
|
600
600
|
VITE_STRIPO_PLUGIN_ID=your_plugin_id
|
|
601
601
|
VITE_STRIPO_SECRET_KEY=your_secret_key
|
|
602
602
|
VITE_STRIPO_ROLE=your_role
|
|
603
|
+
|
|
604
|
+
# Playwright Test Configuration (Optional - for local debugging only)
|
|
605
|
+
HEADED=false # Set to 'true' to run tests with visible browser
|
|
603
606
|
```
|
|
604
607
|
|
|
605
608
|
### Project Structure
|
|
@@ -787,35 +790,3 @@ ISC License
|
|
|
787
790
|
- Playwright integrationBoilerplate/control.ts
|
|
788
791
|
- Commitlint & Precommit Hooks integration
|
|
789
792
|
- Get Pre-built display conditions from API
|
|
790
|
-
|
|
791
|
-
Recommendation Block:
|
|
792
|
-
- [ ] Validations for Filters
|
|
793
|
-
- [ ] DOM Rerender after Filters change
|
|
794
|
-
- [ ] Change currencySymbol as Input Type
|
|
795
|
-
- [ ] Apply filter query to request
|
|
796
|
-
- [ ] Drawer loading bug
|
|
797
|
-
- [ ] Drawer send request when apply filters
|
|
798
|
-
- [ ] Clear all feature for Drawer
|
|
799
|
-
- [ ] Stripo's controls should be effect specific DOM item -- Try extending CommonControl class
|
|
800
|
-
- [ ] Show toaster message if uses multiple recommendation blocks in same template
|
|
801
|
-
- [ ] Change filter button text as Change Filters
|
|
802
|
-
- [ ] Migration template for Recommendation Block
|
|
803
|
-
- [ ] Recommendation Algorithm default value should be mostPopular
|
|
804
|
-
- [ ] Default fields for empty template like currency, title etc.
|
|
805
|
-
- [ ] Recommendation Block Icon Registry should be updated
|
|
806
|
-
- [ ] AMP Block Icon should be updated
|
|
807
|
-
- [ ] Padding feature for between Product Rows
|
|
808
|
-
|
|
809
|
-
Items Block Phase 2:
|
|
810
|
-
[ ] Writing configs to esd-config-data DOM.
|
|
811
|
-
[ ] Build on save feature should be working
|
|
812
|
-
[ ] Data Migration feature should be working
|
|
813
|
-
|
|
814
|
-
Tech Debts:
|
|
815
|
-
[ ] Merge Custom Blocks into a single File
|
|
816
|
-
[ ] Move Custom Blocks names to an enum file
|
|
817
|
-
[ ] Template Replacement should be optimized for version history
|
|
818
|
-
[ ] Code Optimization for Items Block inner blocks reordering
|
|
819
|
-
[ ] Image Size & Margins controls has an error on console
|
|
820
|
-
[ ] Feed Text Trimming feature to toggle settings
|
|
821
|
-
[ ] Formatted Price feature to toggle settings
|
|
@@ -1,23 +1,24 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { provideGuidoActions as
|
|
3
|
-
import { usePartner as
|
|
4
|
-
import { useStripo as
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import Z from "
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import
|
|
20
|
-
|
|
1
|
+
import { defineComponent as z, defineAsyncComponent as L, ref as K, computed as W, watch as j, onMounted as q, onUnmounted as J } from "vue";
|
|
2
|
+
import { provideGuidoActions as Q } from "../composables/useGuidoActions.js";
|
|
3
|
+
import { usePartner as V } from "../composables/usePartner.js";
|
|
4
|
+
import { useStripo as X } from "../composables/useStripo.js";
|
|
5
|
+
import { useTimerClone as Y } from "../composables/useTimerClone.js";
|
|
6
|
+
import { migrate as _ } from "../config/migrator/index.js";
|
|
7
|
+
import { DefaultUsername as Z, DefaultMessageType as $, DefaultGuidoConfig as ee } from "../enums/defaults.js";
|
|
8
|
+
import oe from "./organisms/base/Toaster.vue.js";
|
|
9
|
+
import te from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
|
|
10
|
+
import ne from "./organisms/header/HeaderWrapper.vue.js";
|
|
11
|
+
import re from "./organisms/LoadingWrapper.vue.js";
|
|
12
|
+
import ie from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
|
|
13
|
+
import se from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
|
|
14
|
+
import { useStripoApi as ae } from "../services/stripoApi.js";
|
|
15
|
+
import { useConfigStore as ce } from "../stores/config.js";
|
|
16
|
+
import { useDynamicContentStore as me } from "../stores/dynamic-content.js";
|
|
17
|
+
import { useEditorStore as de } from "../stores/editor.js";
|
|
18
|
+
import { usePreviewStore as le } from "../stores/preview.js";
|
|
19
|
+
import { useUnsubscribeStore as ue } from "../stores/unsubscribe.js";
|
|
20
|
+
import pe from "../node_modules/lodash-es/merge.js";
|
|
21
|
+
const Ae = /* @__PURE__ */ z({
|
|
21
22
|
__name: "Guido",
|
|
22
23
|
props: {
|
|
23
24
|
templateId: null,
|
|
@@ -32,34 +33,34 @@ const Ue = /* @__PURE__ */ O({
|
|
|
32
33
|
templateConfig: null
|
|
33
34
|
},
|
|
34
35
|
emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished", "test-email:click"],
|
|
35
|
-
setup(
|
|
36
|
-
const u =
|
|
36
|
+
setup(A, { expose: N, emit: o }) {
|
|
37
|
+
const u = A, F = L(
|
|
37
38
|
() => import("./organisms/email-preview/PreviewContainer.vue.js")
|
|
38
|
-
),
|
|
39
|
+
), H = L(
|
|
39
40
|
() => import("./organisms/onboarding/OnboardingWrapper.vue.js")
|
|
40
|
-
), p =
|
|
41
|
+
), p = K(), i = me(), g = ue(), f = ce(), s = de(), O = le(), n = W(() => s.hasChanges), { getPartnerName: y, getProductType: v, isTestPartner: R } = V(), h = () => {
|
|
41
42
|
var e;
|
|
42
43
|
return (e = p.value) == null ? void 0 : e.handleSave(!0);
|
|
43
44
|
}, {
|
|
44
45
|
templateId: a,
|
|
45
|
-
userId:
|
|
46
|
-
guidoConfig:
|
|
46
|
+
userId: b,
|
|
47
|
+
guidoConfig: C,
|
|
47
48
|
templateConfig: t,
|
|
48
49
|
html: r = "",
|
|
49
50
|
css: S = "",
|
|
50
51
|
partnerName: c = y(),
|
|
51
52
|
productType: m = v(),
|
|
52
|
-
messageType: w =
|
|
53
|
-
username: D =
|
|
53
|
+
messageType: w = $,
|
|
54
|
+
username: D = Z
|
|
54
55
|
} = u, d = (t == null ? void 0 : t.preselectedDynamicContentList) || [];
|
|
55
|
-
s.templateId = a, window.GuidoConfig =
|
|
56
|
+
s.templateId = a, window.GuidoConfig = pe(ee, C), window.GuidoConfig.partner = {
|
|
56
57
|
partnerName: c,
|
|
57
58
|
productType: m,
|
|
58
59
|
messageType: w
|
|
59
60
|
}, f.templateConfig = t;
|
|
60
|
-
const { initPlugin:
|
|
61
|
+
const { initPlugin: T } = X({
|
|
61
62
|
emailId: a,
|
|
62
|
-
userId:
|
|
63
|
+
userId: b,
|
|
63
64
|
username: D,
|
|
64
65
|
partnerName: c,
|
|
65
66
|
productType: m,
|
|
@@ -67,11 +68,11 @@ const Ue = /* @__PURE__ */ O({
|
|
|
67
68
|
onReady: () => {
|
|
68
69
|
console.debug("guido:ready"), o("ready");
|
|
69
70
|
}
|
|
70
|
-
}), { getDefaultTemplate:
|
|
71
|
+
}), { getDefaultTemplate: E } = ae(), { cloneTimersOnSave: k, hasTimerBlocks: P } = Y(), x = W(() => {
|
|
71
72
|
var e;
|
|
72
73
|
return !((e = window.GuidoConfig) != null && e.useHeader);
|
|
73
74
|
});
|
|
74
|
-
|
|
75
|
+
Q({
|
|
75
76
|
onBack: () => {
|
|
76
77
|
console.debug("guido:back"), o("back");
|
|
77
78
|
},
|
|
@@ -85,50 +86,50 @@ const Ue = /* @__PURE__ */ O({
|
|
|
85
86
|
console.debug("guido:test-email:click"), o("test-email:click");
|
|
86
87
|
}
|
|
87
88
|
});
|
|
88
|
-
const
|
|
89
|
+
const G = (e) => {
|
|
89
90
|
console.debug("dynamic-content:close", e), i.setSelectedDynamicContent(e), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: e }));
|
|
90
|
-
},
|
|
91
|
+
}, I = () => {
|
|
91
92
|
console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
|
|
92
93
|
};
|
|
93
|
-
|
|
94
|
+
j(() => n.value, () => {
|
|
94
95
|
o("on-change", n.value);
|
|
95
96
|
});
|
|
96
97
|
const l = (e) => {
|
|
97
|
-
const
|
|
98
|
-
console.debug("dynamic-content:open",
|
|
98
|
+
const U = e, { attribute: B, position: M } = U.detail;
|
|
99
|
+
console.debug("dynamic-content:open", U.detail), o("dynamic-content:open", B, M);
|
|
99
100
|
};
|
|
100
|
-
return
|
|
101
|
+
return q(async () => {
|
|
101
102
|
console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow");
|
|
102
103
|
try {
|
|
103
104
|
g.selectedUnsubscribePages = (t == null ? void 0 : t.selectedUnsubscribePages) || [];
|
|
104
105
|
let e = {
|
|
105
|
-
html: r && await
|
|
106
|
+
html: r && await _(r),
|
|
106
107
|
css: S,
|
|
107
108
|
forceRecreate: !0
|
|
108
109
|
// TODO: It should be false for old templates. We will communicate with Stripo
|
|
109
110
|
};
|
|
110
|
-
e.html || (e = await
|
|
111
|
+
e.html || (e = await E(), e.html = await _(e.html)), P(e.html) && (e.html = await k(e.html)), await T(e), i.selectedDynamicContentList = d;
|
|
111
112
|
} catch (e) {
|
|
112
113
|
console.error("Failed to initialize Stripo editor:", e);
|
|
113
114
|
}
|
|
114
115
|
document.addEventListener("dynamic-content:open", l);
|
|
115
|
-
}),
|
|
116
|
+
}), J(() => {
|
|
116
117
|
document.removeEventListener("dynamic-content:open", l);
|
|
117
118
|
try {
|
|
118
119
|
window.UIEditor.removeEditor();
|
|
119
120
|
} catch {
|
|
120
121
|
console.debug("Failed to remove Stripo editor: No editor found");
|
|
121
122
|
}
|
|
122
|
-
}),
|
|
123
|
+
}), N({
|
|
123
124
|
dynamicContent: {
|
|
124
|
-
insert:
|
|
125
|
-
close:
|
|
125
|
+
insert: G,
|
|
126
|
+
close: I
|
|
126
127
|
},
|
|
127
128
|
hasChanges: n,
|
|
128
|
-
saveSilent:
|
|
129
|
-
}), { __sfc: !0, PreviewContainer:
|
|
129
|
+
saveSilent: h
|
|
130
|
+
}), { __sfc: !0, PreviewContainer: F, OnboardingWrapper: H, headerWrapperRef: p, dynamicContentStore: i, unsubscribeStore: g, props: u, configStore: f, editorStore: s, previewStore: O, hasChanges: n, getPartnerName: y, getProductType: v, isTestPartner: R, saveSilent: h, templateId: a, userId: b, guidoConfig: C, templateConfig: t, html: r, css: S, partnerName: c, productType: m, messageType: w, username: D, preselectedDynamicContentList: d, emit: o, initPlugin: T, getDefaultTemplate: E, cloneTimersOnSave: k, hasTimerBlocks: P, noHeader: x, insertDynamicContent: G, closeDynamicContent: I, handleDynamicContentOpen: l, Toaster: oe, FilterSelectionDrawer: te, HeaderWrapper: ne, LoadingWrapper: re, SaveAsTemplateDrawer: ie, UnsubscribeWrapper: se };
|
|
130
131
|
}
|
|
131
132
|
});
|
|
132
133
|
export {
|
|
133
|
-
|
|
134
|
+
Ae as default
|
|
134
135
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { useToaster as
|
|
1
|
+
import { useToaster as w } from "./useToaster.js";
|
|
2
2
|
const A = () => {
|
|
3
|
-
const { handleError: l } =
|
|
3
|
+
const { handleError: l } = w(), s = (e = {}) => new Promise((t, a) => {
|
|
4
4
|
const i = { ...{
|
|
5
5
|
minimize: !0,
|
|
6
6
|
utmEntity: {
|
|
@@ -17,16 +17,16 @@ const A = () => {
|
|
|
17
17
|
]
|
|
18
18
|
},
|
|
19
19
|
mergeTags: ["Tag1", "Tag2"],
|
|
20
|
-
|
|
20
|
+
forceAmp: !1,
|
|
21
21
|
resetDataSavedFlag: !1,
|
|
22
22
|
disableLineHeightsReplace: !0
|
|
23
|
-
}, ...
|
|
24
|
-
callback: (
|
|
25
|
-
|
|
26
|
-
html:
|
|
27
|
-
ampHtml:
|
|
28
|
-
ampErrors:
|
|
29
|
-
displayConditions:
|
|
23
|
+
}, ...e }, m = {
|
|
24
|
+
callback: (n, p, c, d, u) => {
|
|
25
|
+
n ? a(n) : t({
|
|
26
|
+
html: p,
|
|
27
|
+
ampHtml: c,
|
|
28
|
+
ampErrors: d,
|
|
29
|
+
displayConditions: u
|
|
30
30
|
});
|
|
31
31
|
},
|
|
32
32
|
...i
|
|
@@ -34,44 +34,53 @@ const A = () => {
|
|
|
34
34
|
window.StripoEditorApi.actionsApi.compileEmail(m);
|
|
35
35
|
});
|
|
36
36
|
return {
|
|
37
|
-
getCompiledEmail:
|
|
38
|
-
getTemplateData: () => new Promise((
|
|
39
|
-
const
|
|
37
|
+
getCompiledEmail: s,
|
|
38
|
+
getTemplateData: () => new Promise((e) => {
|
|
39
|
+
const t = ({ html: a, css: o, width: i, height: r, utmParams: m, syncModulesIds: n }) => e({
|
|
40
40
|
html: a,
|
|
41
41
|
css: o,
|
|
42
42
|
width: i,
|
|
43
43
|
height: r,
|
|
44
44
|
utmParams: m,
|
|
45
|
-
syncModulesIds:
|
|
45
|
+
syncModulesIds: n
|
|
46
46
|
});
|
|
47
|
-
window.StripoEditorApi.actionsApi.getTemplateData(
|
|
47
|
+
window.StripoEditorApi.actionsApi.getTemplateData(t);
|
|
48
48
|
}),
|
|
49
|
-
activateCustomViewStyles: (
|
|
50
|
-
window.StripoEditorApi.actionsApi.activateCustomViewStyles(
|
|
49
|
+
activateCustomViewStyles: (e = !0) => {
|
|
50
|
+
window.StripoEditorApi.actionsApi.activateCustomViewStyles(e);
|
|
51
51
|
},
|
|
52
|
-
getPreviewData: async (
|
|
52
|
+
getPreviewData: async (e) => {
|
|
53
53
|
try {
|
|
54
54
|
const {
|
|
55
|
-
html:
|
|
55
|
+
html: t,
|
|
56
56
|
displayConditions: a,
|
|
57
57
|
ampHtml: o = "",
|
|
58
58
|
ampErrors: i = []
|
|
59
|
-
} = await
|
|
59
|
+
} = await s({ minimize: !1, resetDataSavedFlag: !1, ...e });
|
|
60
60
|
return {
|
|
61
|
-
html:
|
|
61
|
+
html: t,
|
|
62
62
|
ampHtml: o,
|
|
63
63
|
ampErrors: i,
|
|
64
64
|
displayConditions: a
|
|
65
65
|
};
|
|
66
|
-
} catch (
|
|
67
|
-
return l(
|
|
66
|
+
} catch (t) {
|
|
67
|
+
return l(t, "Error loading preview"), {
|
|
68
68
|
html: "",
|
|
69
69
|
ampHtml: "",
|
|
70
70
|
ampErrors: [],
|
|
71
71
|
displayConditions: []
|
|
72
72
|
};
|
|
73
73
|
}
|
|
74
|
-
}
|
|
74
|
+
},
|
|
75
|
+
updateTimerInClonedTemplate: () => new Promise((e) => {
|
|
76
|
+
try {
|
|
77
|
+
window.StripoEditorApi.actionsApi.updateTimerInClonedTemplate((t, a) => {
|
|
78
|
+
t ? (l(t, "Failed to update timer in cloned template"), e(null)) : e(a || null);
|
|
79
|
+
});
|
|
80
|
+
} catch (t) {
|
|
81
|
+
l(t, "Failed to call updateTimerInClonedTemplate"), e(null);
|
|
82
|
+
}
|
|
83
|
+
})
|
|
75
84
|
};
|
|
76
85
|
};
|
|
77
86
|
export {
|
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
import { defaultHtmlCompilerRules as t } from "../config/compiler/htmlCompilerRules.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
import { itemsCompilerRules as p } from "../config/compiler/itemsCompilerRules.js";
|
|
3
|
+
import { outlookCompilerRules as s } from "../config/compiler/outlookCompilerRules.js";
|
|
4
|
+
import { recommendationCompilerRules as u } from "../config/compiler/recommendationCompilerRules.js";
|
|
5
|
+
import { socialCompilerRules as n } from "../config/compiler/socialCompilerRules.js";
|
|
6
|
+
import { unsubscribeCompilerRules as c } from "../config/compiler/unsubscribeCompilerRules.js";
|
|
7
|
+
import { createHtmlCompiler as f } from "../utils/htmlCompiler.js";
|
|
8
|
+
import { useConfig as R } from "./useConfig.js";
|
|
9
|
+
const x = () => {
|
|
10
|
+
const { config: e } = R(), m = e.htmlCompilerRules || [], l = [
|
|
10
11
|
...!!e.ignoreDefaultHtmlCompilerRules ? [] : t,
|
|
12
|
+
...u,
|
|
13
|
+
...c,
|
|
14
|
+
...p,
|
|
11
15
|
...s,
|
|
12
16
|
...n,
|
|
13
|
-
...
|
|
14
|
-
...u,
|
|
15
|
-
...l.map((o, i) => ({
|
|
17
|
+
...m.map((o, i) => ({
|
|
16
18
|
...o,
|
|
17
19
|
priority: o.priority + 1e3 + i
|
|
18
20
|
// Ensure additional rules run after default rules
|
|
19
21
|
}))
|
|
20
|
-
], r =
|
|
22
|
+
], r = f(l);
|
|
21
23
|
return { compileHtml: (o) => r.compile(o) };
|
|
22
24
|
};
|
|
23
25
|
export {
|
|
24
|
-
|
|
26
|
+
x as useHtmlCompiler
|
|
25
27
|
};
|
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
import { useConfig as
|
|
2
|
-
import { TemplateTypes as
|
|
3
|
-
import { DISPLAY_CONDITIONS_REGEX as
|
|
1
|
+
import { useConfig as V } from "./useConfig.js";
|
|
2
|
+
import { TemplateTypes as D } from "../enums/defaults.js";
|
|
3
|
+
import { DISPLAY_CONDITIONS_REGEX as H, DISPLAY_CONDITIONS_EXCEPTIONS_REGEX as P, CampaignCouldNotBeSavedKey as R, CanNotMakeAnyChangesForRunningKey as _ } from "../enums/html-validator.js";
|
|
4
4
|
import { ToasterTypeOptions as l } from "../enums/toaster.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
5
|
+
import { itemsBlockDynamicVariables as G } from "../extensions/Blocks/Items/enums/productEnums.js";
|
|
6
|
+
import { useRecommendationStore as $ } from "../stores/recommendation.js";
|
|
7
|
+
import { base64EncodeWithSpecialChars as j } from "../utils/base64.js";
|
|
8
|
+
import { useHttp as q } from "./useHttp.js";
|
|
9
|
+
import { useToaster as M } from "./useToaster.js";
|
|
10
|
+
import { useTranslations as X } from "./useTranslations.js";
|
|
11
|
+
const ie = () => {
|
|
11
12
|
var d;
|
|
12
|
-
const { showToaster: c } =
|
|
13
|
+
const { showToaster: c } = M(), { post: y } = q(), { config: h } = V(), a = X(), m = $(), u = ((d = h.partner) == null ? void 0 : d.messageType) === D.transactional, v = async (e) => {
|
|
13
14
|
const t = await y(
|
|
14
15
|
"/newsletter/template-library/check-template-html-body",
|
|
15
|
-
{ html:
|
|
16
|
+
{ html: j(e) }
|
|
16
17
|
), { status: n, message: r } = t.data;
|
|
17
18
|
return n || c({
|
|
18
19
|
type: l.Alert,
|
|
@@ -25,10 +26,10 @@ const se = () => {
|
|
|
25
26
|
const t = e.match(/({%(.*?)%})/g);
|
|
26
27
|
let n = !0;
|
|
27
28
|
return t !== null && !u && t.forEach((r) => {
|
|
28
|
-
const
|
|
29
|
-
if (
|
|
30
|
-
const [
|
|
31
|
-
C(
|
|
29
|
+
const i = r.slice(2, -2).trim().match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);
|
|
30
|
+
if (i && i.length > 0) {
|
|
31
|
+
const [o] = i;
|
|
32
|
+
C(o) && !s.includes(o) && (c({
|
|
32
33
|
type: l.Warning,
|
|
33
34
|
message: a("custom-fields.invalid-custom-fields")
|
|
34
35
|
}), n = !1);
|
|
@@ -58,19 +59,19 @@ const se = () => {
|
|
|
58
59
|
}, k = (e, s) => {
|
|
59
60
|
const t = e.match(/{{([a-zA-Z0-9_\s]*)}}/gm);
|
|
60
61
|
if (t && !u) {
|
|
61
|
-
const n = new Set(s.map((
|
|
62
|
-
if (t.forEach((
|
|
63
|
-
const
|
|
64
|
-
(!n.has(
|
|
62
|
+
const n = new Set(s.map((i) => i.toLowerCase())), r = [];
|
|
63
|
+
if (t.forEach((i) => {
|
|
64
|
+
const o = i.slice(2, -2).trim().toLowerCase();
|
|
65
|
+
(!n.has(o) || o === "") && r.push(o);
|
|
65
66
|
}), r.length > 0) {
|
|
66
|
-
const
|
|
67
|
+
const i = `
|
|
67
68
|
<ul>
|
|
68
|
-
${r.map((
|
|
69
|
+
${r.map((o) => `<li>${o}</li>`).join("")}
|
|
69
70
|
</ul>
|
|
70
71
|
`;
|
|
71
72
|
return c({
|
|
72
73
|
type: l.Alert,
|
|
73
|
-
message: a("custom-fields.invalid-custom-fields") +
|
|
74
|
+
message: a("custom-fields.invalid-custom-fields") + i
|
|
74
75
|
}), !1;
|
|
75
76
|
}
|
|
76
77
|
}
|
|
@@ -79,11 +80,11 @@ const se = () => {
|
|
|
79
80
|
const s = e.match(/{%(.*?)%}/g), t = [];
|
|
80
81
|
let n = !0;
|
|
81
82
|
if (s && s.forEach((r) => {
|
|
82
|
-
const
|
|
83
|
-
(!
|
|
83
|
+
const i = r.match(H), o = r.match(P), B = (i == null ? void 0 : i.join("")) || "";
|
|
84
|
+
(!i || r !== B) && !o && (c({
|
|
84
85
|
type: l.Alert,
|
|
85
86
|
message: a("newsletter.display-conditions-invalid-syntax")
|
|
86
|
-
}), n = !1),
|
|
87
|
+
}), n = !1), i && i.forEach((f) => {
|
|
87
88
|
f.trim() === "=" && (c({
|
|
88
89
|
type: l.Alert,
|
|
89
90
|
message: a("custom-conditions.wrong-equality-operators")
|
|
@@ -94,8 +95,8 @@ const se = () => {
|
|
|
94
95
|
});
|
|
95
96
|
});
|
|
96
97
|
}), t.length) {
|
|
97
|
-
const r = t.filter((
|
|
98
|
-
r.length !==
|
|
98
|
+
const r = t.filter((o) => o === "if"), i = t.filter((o) => o === "endif");
|
|
99
|
+
r.length !== i.length && (c({
|
|
99
100
|
type: l.Alert,
|
|
100
101
|
message: a("custom-conditions.missing-if-endif-tag")
|
|
101
102
|
}), n = !1);
|
|
@@ -121,28 +122,28 @@ const se = () => {
|
|
|
121
122
|
}), !1);
|
|
122
123
|
}, N = (e) => {
|
|
123
124
|
const n = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".checkbox-block-v2");
|
|
124
|
-
return Array.from(n).find((
|
|
125
|
-
var
|
|
126
|
-
return !((
|
|
125
|
+
return Array.from(n).find((i) => {
|
|
126
|
+
var o;
|
|
127
|
+
return !((o = i.id) != null && o.trim());
|
|
127
128
|
}) ? (c({
|
|
128
129
|
type: l.Alert,
|
|
129
130
|
message: a("unsubscribe-templates.select-checkbox-groups")
|
|
130
131
|
}), !1) : !0;
|
|
131
132
|
}, O = (e) => {
|
|
132
133
|
const n = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".radio-button-v2");
|
|
133
|
-
return Array.from(n).find((
|
|
134
|
-
var
|
|
135
|
-
return !((
|
|
134
|
+
return Array.from(n).find((i) => {
|
|
135
|
+
var o;
|
|
136
|
+
return !((o = i.id) != null && o.trim());
|
|
136
137
|
}) ? (c({
|
|
137
138
|
type: l.Alert,
|
|
138
139
|
message: a("unsubscribe-templates.select-radio-button-groups")
|
|
139
140
|
}), !1) : !0;
|
|
140
141
|
};
|
|
141
142
|
return { validateHtml: async (e, s, t = !1) => {
|
|
142
|
-
const n = s.map((
|
|
143
|
+
const n = [...s.map((i) => i.value), ...G];
|
|
143
144
|
return await b(e, n, t) && E(e) && A(e) && x(e) && k(e, n) && T(e) && F(e) && I(e) && W() && L(e) && N(e) && O(e);
|
|
144
145
|
} };
|
|
145
146
|
};
|
|
146
147
|
export {
|
|
147
|
-
|
|
148
|
+
ie as useHtmlValidator
|
|
148
149
|
};
|