@useinsider/guido 3.3.0-beta.0a507dd → 3.3.0-beta.1778fd7

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.
Files changed (38) hide show
  1. package/dist/components/Guido.vue.js +1 -1
  2. package/dist/components/Guido.vue2.js +103 -89
  3. package/dist/components/organisms/extensions/recommendation/FilterItem.vue.js +9 -11
  4. package/dist/components/organisms/extensions/recommendation/FilterItem.vue2.js +70 -35
  5. package/dist/components/organisms/header/MiddleSlot.vue.js +7 -7
  6. package/dist/composables/useCortexBlueprintBridge.js +66 -0
  7. package/dist/composables/useEmailTemplateApplier.js +41 -0
  8. package/dist/composables/useGuidoStateBridge.js +48 -0
  9. package/dist/composables/useHtmlValidator.js +41 -36
  10. package/dist/composables/useRecommendation.js +2 -2
  11. package/dist/composables/useStripo.js +66 -62
  12. package/dist/config/migrator/index.js +21 -10
  13. package/dist/config/migrator/radioButtonMigrator.js +72 -47
  14. package/dist/enums/extensions/recommendationBlock.js +101 -46
  15. package/dist/enums/unsubscribe.js +25 -24
  16. package/dist/extensions/Blocks/Checkbox/control.js +23 -23
  17. package/dist/extensions/Blocks/RadioButton/control.js +15 -15
  18. package/dist/extensions/Blocks/RadioButton/template.js +6 -6
  19. package/dist/extensions/Blocks/Recommendation/block.js +43 -36
  20. package/dist/extensions/Blocks/Recommendation/services/configService.js +33 -26
  21. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +35 -26
  22. package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +25 -12
  23. package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +33 -0
  24. package/dist/guido.css +1 -1
  25. package/dist/src/composables/useCortexBlueprintBridge.d.ts +25 -0
  26. package/dist/src/composables/useEmailTemplateApplier.d.ts +21 -0
  27. package/dist/src/composables/useGuidoStateBridge.d.ts +22 -0
  28. package/dist/src/enums/extensions/recommendationBlock.d.ts +6 -1
  29. package/dist/src/enums/unsubscribe.d.ts +8 -3
  30. package/dist/src/extensions/Blocks/RadioButton/template.d.ts +1 -1
  31. package/dist/src/extensions/Blocks/Recommendation/services/configService.d.ts +11 -3
  32. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +7 -1
  33. package/dist/src/extensions/Blocks/Recommendation/utils/filterUtil.d.ts +2 -0
  34. package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +21 -0
  35. package/dist/src/stores/guido-email-editor.d.ts +41 -0
  36. package/dist/stores/guido-email-editor.js +20 -0
  37. package/dist/utils/templatePreparation.js +57 -50
  38. package/package.json +1 -1
@@ -0,0 +1,20 @@
1
+ import { defineStore as e } from "pinia";
2
+ const d = e("guidoEmailEditor", {
3
+ state: () => ({
4
+ /** Current Stripo HTML — stripe tables only, no DOCTYPE/wrapper. */
5
+ html: "",
6
+ /** Current Stripo CSS — es-p* utility classes used by the html. */
7
+ css: "",
8
+ /** Wall-clock ms when html/css were last written by the bridge. */
9
+ lastUpdatedAt: 0,
10
+ /** Template id from the editor config, for cortex-fe to scope per-template. */
11
+ templateId: ""
12
+ }),
13
+ getters: {
14
+ /** True once the bridge has published at least one snapshot. */
15
+ hasSnapshot: (t) => t.lastUpdatedAt > 0 && t.html !== ""
16
+ }
17
+ });
18
+ export {
19
+ d as useGuidoEmailEditorStore
20
+ };
@@ -1,29 +1,29 @@
1
- import { useActionsApi as T } from "../composables/useActionsApi.js";
2
- import { useHtmlCompiler as C } from "../composables/useHtmlCompiler.js";
3
- import { DEFAULT_CURRENCY as l, DEFAULT_NODE_CONFIG as a } from "../extensions/Blocks/Recommendation/constants/defaultConfig.js";
4
- import { useRecommendationExtensionStore as b } from "../extensions/Blocks/Recommendation/store/recommendation.js";
5
- import { DATA_ATTRIBUTES as y } from "../extensions/Blocks/Unsubscribe/utils/constants.js";
6
- import { parsePageList as P } from "../extensions/Blocks/Unsubscribe/utils/utils.js";
7
- import { useDynamicContentStore as D } from "../stores/dynamic-content.js";
8
- import { useUnsubscribeStore as E } from "../stores/unsubscribe.js";
9
- function U(i, r) {
10
- const s = new DOMParser().parseFromString(i, "text/html").querySelectorAll(`[${y.PAGE_LIST}]`), c = [];
11
- return s.forEach((t) => {
12
- const o = t.getAttribute(y.PAGE_LIST);
13
- o && c.push(...P(o));
1
+ import { useActionsApi as R } from "../composables/useActionsApi.js";
2
+ import { useHtmlCompiler as U } from "../composables/useHtmlCompiler.js";
3
+ import { DEFAULT_CURRENCY as d, DEFAULT_NODE_CONFIG as i } from "../extensions/Blocks/Recommendation/constants/defaultConfig.js";
4
+ import { useRecommendationExtensionStore as A } from "../extensions/Blocks/Recommendation/store/recommendation.js";
5
+ import { DATA_ATTRIBUTES as T } from "../extensions/Blocks/Unsubscribe/utils/constants.js";
6
+ import { parsePageList as F } from "../extensions/Blocks/Unsubscribe/utils/utils.js";
7
+ import { useDynamicContentStore as H } from "../stores/dynamic-content.js";
8
+ import { useUnsubscribeStore as w } from "../stores/unsubscribe.js";
9
+ function x(m, r) {
10
+ const n = new DOMParser().parseFromString(m, "text/html").querySelectorAll(`[${T.PAGE_LIST}]`), c = [];
11
+ return n.forEach((t) => {
12
+ const o = t.getAttribute(T.PAGE_LIST);
13
+ o && c.push(...F(o));
14
14
  }), r.filter((t) => c.includes(t));
15
15
  }
16
- function F(i) {
17
- const m = new DOMParser().parseFromString(i, "text/html").querySelectorAll(".recommendation-block-v2");
18
- if (m.length === 0)
16
+ function z(m) {
17
+ const l = new DOMParser().parseFromString(m, "text/html").querySelectorAll(".recommendation-block-v2");
18
+ if (l.length === 0)
19
19
  return;
20
- const d = b();
21
- m.forEach((s) => {
22
- var g, f, u, n, S;
23
- const c = s.getAttribute("recommendation-id"), t = c ? Number(c) : NaN;
20
+ const p = A();
21
+ l.forEach((n) => {
22
+ var g, f, a, s, S;
23
+ const c = n.getAttribute("recommendation-id"), t = c ? Number(c) : NaN;
24
24
  if (!Number.isFinite(t))
25
25
  return;
26
- const o = s.getAttribute("esd-ext-config");
26
+ const o = n.getAttribute("esd-ext-config");
27
27
  if (!o)
28
28
  return;
29
29
  let e;
@@ -34,60 +34,67 @@ function F(i) {
34
34
  }
35
35
  if (!e || typeof e != "object" || Array.isArray(e))
36
36
  return;
37
- const p = {
38
- strategy: e.strategy ?? a.strategy,
39
- language: e.language ?? a.language,
40
- size: e.size ?? a.size,
37
+ const u = {
38
+ strategy: e.strategy ?? i.strategy,
39
+ language: e.language ?? i.language,
40
+ size: e.size ?? i.size,
41
41
  // Spread the default arrays so each block gets a fresh reference
42
42
  // instead of sharing the singleton in DEFAULT_NODE_CONFIG.
43
- productIds: e.productIds ?? [...a.productIds],
44
- filters: e.filters ?? [...a.filters],
45
- shuffleProducts: e.shuffleProducts ?? a.shuffleProducts,
46
- currencyCode: ((g = e.currency) == null ? void 0 : g.code) ?? l.code,
47
- currencyAlignment: ((f = e.currency) == null ? void 0 : f.alignment) ?? l.alignment,
48
- currencyDecimalCount: ((u = e.currency) == null ? void 0 : u.decimalCount) ?? l.decimalCount,
49
- currencyDecimalSeparator: ((n = e.currency) == null ? void 0 : n.decimalSeparator) ?? l.decimalSeparator,
50
- currencyThousandSeparator: ((S = e.currency) == null ? void 0 : S.thousandSeparator) ?? l.thousandSeparator
43
+ productIds: e.productIds ?? [...i.productIds],
44
+ filters: e.filters ?? [...i.filters],
45
+ shuffleProducts: e.shuffleProducts ?? i.shuffleProducts,
46
+ currencyCode: ((g = e.currency) == null ? void 0 : g.code) ?? d.code,
47
+ currencyAlignment: ((f = e.currency) == null ? void 0 : f.alignment) ?? d.alignment,
48
+ currencyDecimalCount: ((a = e.currency) == null ? void 0 : a.decimalCount) ?? d.decimalCount,
49
+ currencyDecimalSeparator: ((s = e.currency) == null ? void 0 : s.decimalSeparator) ?? d.decimalSeparator,
50
+ currencyThousandSeparator: ((S = e.currency) == null ? void 0 : S.thousandSeparator) ?? d.thousandSeparator
51
51
  };
52
- d.seedBlockUrlConfig(t, p);
52
+ p.seedBlockUrlConfig(t, u);
53
53
  });
54
54
  }
55
- const _ = () => {
56
- const i = D(), r = E(), { getCompiledEmail: m, getTemplateData: d } = T(), { compileHtml: s } = C();
55
+ const G = () => {
56
+ const m = H(), r = w(), { getCompiledEmail: l, getTemplateData: p } = R(), { compileHtml: n } = U();
57
57
  return {
58
58
  prepareTemplateDetails: async () => {
59
- const { html: t, ampHtml: o = "", ampErrors: e = [] } = await m({
59
+ const { html: t, ampHtml: o = "", ampErrors: e = [] } = await l({
60
60
  minimize: !0,
61
61
  resetDataSavedFlag: !1
62
- }), { html: p, css: g, syncModulesIds: f = [] } = await d();
63
- r.selectedUnsubscribePages.length && await r.fetchTemplates(), F(p);
64
- const { compiledHtml: u, stats: n, appliedRules: S } = s(t), h = i.getSelectedDynamicContentList, A = b();
62
+ }), { html: u, css: g, syncModulesIds: f = [] } = await p();
63
+ r.selectedUnsubscribePages.length && await r.fetchTemplates(), z(u);
64
+ const { compiledHtml: a, stats: s, appliedRules: S } = n(t), C = m.getSelectedDynamicContentList, P = A(), b = (D) => (D.match(/<td[^>]*radio-button-v2[^>]*>/gi) ?? []).map((E) => {
65
+ var h;
66
+ const y = (((h = E.match(/class="([^"]*)"/)) == null ? void 0 : h[1]) ?? "").split(/\s+/).filter(Boolean);
67
+ return { hasBlock: y.includes("radio-button-block"), classes: y };
68
+ });
65
69
  return console.debug("HTML Compilation Stats:", {
66
- originalSize: n.originalSize,
67
- compiledSize: n.compiledSize,
68
- reduction: `${n.reductionPercentage.toFixed(2)}%`,
70
+ originalSize: s.originalSize,
71
+ compiledSize: s.compiledSize,
72
+ reduction: `${s.reductionPercentage.toFixed(2)}%`,
69
73
  appliedRules: S,
70
- executionTime: `${n.executionTime.toFixed(2)}ms`
74
+ executionTime: `${s.executionTime.toFixed(2)}ms`
75
+ }), console.debug("[guido:radio-migrator] template-prep", {
76
+ rawHtmlRadioTds: b(u),
77
+ compiledHtmlRadioTds: b(a)
71
78
  }), {
72
- dynamicContentList: h,
73
- compiledHtml: u,
74
- rawHtml: p,
79
+ dynamicContentList: C,
80
+ compiledHtml: a,
81
+ rawHtml: u,
75
82
  css: g,
76
83
  ampHtml: o,
77
84
  ampErrors: e,
78
85
  modules: f.map(Number),
79
86
  recommendation: {
80
- campaignUrls: A.recommendationCampaignUrls,
87
+ campaignUrls: P.recommendationCampaignUrls,
81
88
  configs: {}
82
89
  },
83
90
  unsubscribe: {
84
91
  status: r.unsubscribePagesStatus,
85
- config: U(u, r.selectedUnsubscribePages)
92
+ config: x(a, r.selectedUnsubscribePages)
86
93
  }
87
94
  };
88
95
  }
89
96
  };
90
97
  };
91
98
  export {
92
- _ as useTemplatePreparation
99
+ G as useTemplatePreparation
93
100
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useinsider/guido",
3
- "version": "3.3.0-beta.0a507dd",
3
+ "version": "3.3.0-beta.1778fd7",
4
4
  "description": "Guido is a Vue + TypeScript wrapper for Email Plugin. Easily embed the email editor in your Vue applications.",
5
5
  "main": "./dist/guido.umd.cjs",
6
6
  "module": "./dist/library.js",