@useinsider/guido 3.0.0-beta.34a1600 → 3.0.0-beta.39155d9

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 (91) hide show
  1. package/dist/@types/config/schemas.js +10 -8
  2. package/dist/components/Guido.vue.js +3 -3
  3. package/dist/components/Guido.vue2.js +61 -60
  4. package/dist/components/organisms/header/EditorActions.vue.js +1 -1
  5. package/dist/components/organisms/header/EditorActions.vue2.js +6 -6
  6. package/dist/composables/useCustomFieldAttributes.js +16 -0
  7. package/dist/composables/useHtmlValidator.js +40 -38
  8. package/dist/config/compiler/unsubscribeCompilerRules.js +14 -14
  9. package/dist/config/compiler/utils/recommendationCompilerUtils.js +29 -18
  10. package/dist/extensions/Blocks/Recommendation/block.js +40 -55
  11. package/dist/extensions/Blocks/Recommendation/constants/blockIds.js +1 -1
  12. package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +1 -1
  13. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +34 -36
  14. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +15 -12
  15. package/dist/extensions/Blocks/Recommendation/controls/cardBackground/index.js +4 -4
  16. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +693 -144
  17. package/dist/extensions/Blocks/Recommendation/controls/customAttribute/index.js +78 -0
  18. package/dist/extensions/Blocks/Recommendation/controls/{main/layoutOrientation.js → layout/index.js} +27 -32
  19. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +15 -15
  20. package/dist/extensions/Blocks/Recommendation/controls/main/currency.js +24 -24
  21. package/dist/extensions/Blocks/Recommendation/controls/main/filters.js +2 -2
  22. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +78 -107
  23. package/dist/extensions/Blocks/Recommendation/controls/main/locale.js +2 -2
  24. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +64 -150
  25. package/dist/extensions/Blocks/Recommendation/controls/main/shuffle.js +2 -2
  26. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +191 -177
  27. package/dist/extensions/Blocks/Recommendation/controls/mobileLayout/cssRules.js +8 -25
  28. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +5 -6
  29. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/textAfter.js +8 -8
  30. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/textBefore.js +21 -21
  31. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/textAfter.js +13 -13
  32. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/textBefore.js +17 -17
  33. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +100 -94
  34. package/dist/extensions/Blocks/Recommendation/extension.js +27 -25
  35. package/dist/extensions/Blocks/Recommendation/recommendation.css.js +125 -36
  36. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +111 -99
  37. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +2 -2
  38. package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +63 -34
  39. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +30 -33
  40. package/dist/extensions/Blocks/Recommendation/templates/index.js +8 -8
  41. package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +28 -13
  42. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +25 -44
  43. package/dist/extensions/Blocks/Recommendation/templates/utils.js +62 -38
  44. package/dist/extensions/Blocks/common-control.js +41 -90
  45. package/dist/guido.css +1 -1
  46. package/dist/services/customFieldAttributesApi.js +21 -0
  47. package/dist/src/@types/config/schemas.d.ts +4 -0
  48. package/dist/src/components/Guido.vue.d.ts +1 -1
  49. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
  50. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
  51. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  52. package/dist/src/composables/useConfig.d.ts +2 -0
  53. package/dist/src/composables/useCustomFieldAttributes.d.ts +5 -0
  54. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +1 -0
  55. package/dist/src/extensions/Blocks/Recommendation/constants/blockIds.d.ts +2 -1
  56. package/dist/src/extensions/Blocks/Recommendation/constants/controlIds.d.ts +7 -1
  57. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
  58. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +10 -0
  59. package/dist/src/extensions/Blocks/Recommendation/controls/cardBackgroundColorControl.d.ts +25 -0
  60. package/dist/src/extensions/Blocks/Recommendation/controls/cardComposition/index.d.ts +134 -44
  61. package/dist/src/extensions/Blocks/Recommendation/controls/customAttribute/index.d.ts +105 -0
  62. package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +3 -2
  63. package/dist/src/extensions/Blocks/Recommendation/controls/{main/layoutOrientation.d.ts → layout/index.d.ts} +3 -3
  64. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +1 -5
  65. package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +20 -38
  66. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +4 -4
  67. package/dist/src/extensions/Blocks/Recommendation/controls/mobileLayout/cssRules.d.ts +1 -23
  68. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscountTextAfterControl.d.ts +15 -0
  69. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscountTextBeforeControl.d.ts +15 -0
  70. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPriceTextAfterControl.d.ts +15 -0
  71. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPriceTextBeforeControl.d.ts +15 -0
  72. package/dist/src/extensions/Blocks/Recommendation/controls/spacing/index.d.ts +18 -8
  73. package/dist/src/extensions/Blocks/Recommendation/controls/spacingControl.d.ts +60 -0
  74. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +1 -1
  75. package/dist/src/extensions/Blocks/Recommendation/templates/grid/elementRenderer.d.ts +1 -1
  76. package/dist/src/extensions/Blocks/Recommendation/templates/list/elementRenderer.d.ts +1 -1
  77. package/dist/src/extensions/Blocks/Recommendation/templates/list/template.d.ts +10 -4
  78. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +37 -2
  79. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +0 -13
  80. package/dist/src/extensions/Blocks/common-control.d.ts +2 -24
  81. package/dist/src/mock/api/custom-field-attributes.d.ts +2 -0
  82. package/dist/src/services/customFieldAttributesApi.d.ts +3 -0
  83. package/dist/src/stores/config.d.ts +18 -0
  84. package/dist/static/styles/components/wide-panel.css.js +0 -1
  85. package/dist/static/styles/customEditorStyle.css.js +0 -9
  86. package/dist/static/styles/variables.css.js +3 -0
  87. package/package.json +1 -1
  88. package/dist/extensions/Blocks/Recommendation/controls/main/productCount.js +0 -58
  89. package/dist/extensions/Blocks/Recommendation/controls/syncInfoMessage.js +0 -65
  90. package/dist/src/extensions/Blocks/Recommendation/controls/main/productCount.d.ts +0 -28
  91. package/dist/src/extensions/Blocks/Recommendation/controls/syncInfoMessage.d.ts +0 -34
@@ -61,7 +61,7 @@ const m = {
61
61
  value: t()
62
62
  })
63
63
  )
64
- }), R = o({
64
+ }), A = o({
65
65
  /** Initial HTML content */
66
66
  html: e(t(), ""),
67
67
  /** Initial CSS content */
@@ -71,11 +71,13 @@ const m = {
71
71
  c(f),
72
72
  []
73
73
  ),
74
+ /** Valid custom field attribute names from the partner's categorized fields */
75
+ customFieldAttributes: e(c(t()), []),
74
76
  /** Selected unsubscribe page IDs */
75
77
  selectedUnsubscribePages: e(c(p()), []),
76
78
  /** Force recreate template in Stripo storage (use true when updating externally modified templates) */
77
79
  forceRecreate: e(a(), !1)
78
- }), A = o({
80
+ }), R = o({
79
81
  /** Sender display name */
80
82
  senderName: e(t(), ""),
81
83
  /** Email subject line */
@@ -88,7 +90,7 @@ const m = {
88
90
  /** Migration date for template compatibility */
89
91
  migrationDate: e(p(), 1759696858),
90
92
  /** Email header settings */
91
- emailHeader: e(A, { senderName: "", subject: "" }),
93
+ emailHeader: e(R, { senderName: "", subject: "" }),
92
94
  /** Folder name for user-saved modules (used by Stripo plugin panel for path construction) */
93
95
  savedModulesFolderName: e(t(), b.SAVED_MODULES),
94
96
  /** Folder name for default/prebuilt modules (used by Stripo plugin panel for path construction) */
@@ -205,7 +207,7 @@ const m = {
205
207
  "externalValidation must be a function"
206
208
  )
207
209
  )
208
- }), H = o({
210
+ }), F = o({
209
211
  // Required sections
210
212
  /** Identity configuration (required) */
211
213
  identity: h,
@@ -213,7 +215,7 @@ const m = {
213
215
  partner: y,
214
216
  // Optional sections (with defaults)
215
217
  /** Template content and presets */
216
- template: e(R, {}),
218
+ template: e(A, {}),
217
219
  /** Editor settings */
218
220
  editor: e(C, {}),
219
221
  /** UI configuration */
@@ -237,9 +239,9 @@ export {
237
239
  E as DefaultBlockTypeSchema,
238
240
  f as DynamicContentSchema,
239
241
  C as EditorSchema,
240
- A as EmailHeaderSchema,
242
+ R as EmailHeaderSchema,
241
243
  I as FeaturesSchema,
242
- H as GuidoConfigSchema,
244
+ F as GuidoConfigSchema,
243
245
  h as IdentitySchema,
244
246
  m as MessageType,
245
247
  y as PartnerSchema,
@@ -247,6 +249,6 @@ export {
247
249
  M as RegexRuleSchema,
248
250
  N as RemoveRuleSchema,
249
251
  L as ReplaceRuleSchema,
250
- R as TemplateSchema,
252
+ A as TemplateSchema,
251
253
  T as UISchema
252
254
  };
@@ -12,9 +12,9 @@ var t = function() {
12
12
  n,
13
13
  !1,
14
14
  null,
15
- "a26d7792"
15
+ "e9f9ae3a"
16
16
  );
17
- const v = s.exports;
17
+ const u = s.exports;
18
18
  export {
19
- v as default
19
+ u as default
20
20
  };
@@ -1,121 +1,122 @@
1
- import { defineComponent as K, defineAsyncComponent as _, ref as V, computed as P, watch as j, onMounted as q, onUnmounted as J } from "vue";
2
- import { provideGuidoActions as Q } from "../composables/useGuidoActions.js";
3
- import { usePartner as X } from "../composables/usePartner.js";
4
- import { useStripo as Y } from "../composables/useStripo.js";
5
- import { useTimerClone as Z } from "../composables/useTimerClone.js";
6
- import { migrate as A } from "../config/migrator/index.js";
7
- import { ModuleFolderDefaults as N } from "../enums/defaults.js";
8
- import $ from "./organisms/base/Toaster.vue.js";
9
- import ee from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
10
- import oe from "./organisms/header/HeaderWrapper.vue.js";
11
- import te from "./organisms/LoadingWrapper.vue.js";
12
- import ne from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
13
- import se from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
14
- import { useStripoApi as re } from "../services/stripoApi.js";
15
- import { useConfigStore as ce } from "../stores/config.js";
16
- import { useDynamicContentStore as ae } from "../stores/dynamic-content.js";
17
- import { useEditorStore as ie } from "../stores/editor.js";
18
- import { usePreviewStore as me } from "../stores/preview.js";
19
- import { useUnsubscribeStore as de } from "../stores/unsubscribe.js";
20
- const Me = /* @__PURE__ */ K({
1
+ import { defineComponent as j, defineAsyncComponent as P, ref as q, computed as N, watch as J, onMounted as Q, onUnmounted as X } from "vue";
2
+ import { useCustomFieldAttributes as Y } from "../composables/useCustomFieldAttributes.js";
3
+ import { provideGuidoActions as Z } from "../composables/useGuidoActions.js";
4
+ import { usePartner as $ } from "../composables/usePartner.js";
5
+ import { useStripo as ee } from "../composables/useStripo.js";
6
+ import { useTimerClone as te } from "../composables/useTimerClone.js";
7
+ import { migrate as W } from "../config/migrator/index.js";
8
+ import { ModuleFolderDefaults as I } from "../enums/defaults.js";
9
+ import oe from "./organisms/base/Toaster.vue.js";
10
+ import ne from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
11
+ import se from "./organisms/header/HeaderWrapper.vue.js";
12
+ import re from "./organisms/LoadingWrapper.vue.js";
13
+ import ae from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
14
+ import ce from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
15
+ import { useStripoApi as ie } from "../services/stripoApi.js";
16
+ import { useConfigStore as me } from "../stores/config.js";
17
+ import { useDynamicContentStore as de } from "../stores/dynamic-content.js";
18
+ import { useEditorStore as le } from "../stores/editor.js";
19
+ import { usePreviewStore as ue } from "../stores/preview.js";
20
+ import { useUnsubscribeStore as pe } from "../stores/unsubscribe.js";
21
+ const Ne = /* @__PURE__ */ j({
21
22
  __name: "Guido",
22
23
  props: {
23
24
  config: null
24
25
  },
25
26
  emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished", "test-email:click"],
26
- setup(W, { expose: I, emit: t }) {
27
- const v = W, O = _(
27
+ setup(O, { expose: G, emit: o }) {
28
+ const v = O, H = P(
28
29
  () => import("./organisms/email-preview/PreviewContainer.vue.js")
29
- ), G = _(
30
+ ), x = P(
30
31
  () => import("./organisms/onboarding/OnboardingWrapper.vue.js")
31
- ), h = V(), i = ae(), y = de(), s = ce();
32
+ ), b = q(), i = de(), f = pe(), s = me();
32
33
  s.init(v.config);
33
- const m = ie(), H = me(), c = P(() => m.hasChanges), { isTestPartner: x } = X(), f = () => {
34
+ const m = le(), B = ue(), a = N(() => m.hasChanges), { isTestPartner: R } = $(), h = () => {
34
35
  var e;
35
- return (e = h.value) == null ? void 0 : e.handleSave(!0);
36
+ return (e = b.value) == null ? void 0 : e.handleSave(!0);
36
37
  }, {
37
38
  templateId: d,
38
- userId: b,
39
+ userId: y,
39
40
  partnerName: S,
40
41
  username: g,
41
- template: o,
42
+ template: t,
42
43
  editor: n
43
- } = s, a = (o == null ? void 0 : o.html) || "", D = (o == null ? void 0 : o.css) || "", l = (o == null ? void 0 : o.preselectedDynamicContent) || [], w = (n == null ? void 0 : n.savedModulesFolderName) || N.SAVED_MODULES, E = (n == null ? void 0 : n.defaultModulesFolderName) || N.DEFAULT_MODULES;
44
+ } = s, c = (t == null ? void 0 : t.html) || "", w = (t == null ? void 0 : t.css) || "", l = (t == null ? void 0 : t.preselectedDynamicContent) || [], D = (n == null ? void 0 : n.savedModulesFolderName) || I.SAVED_MODULES, C = (n == null ? void 0 : n.defaultModulesFolderName) || I.DEFAULT_MODULES;
44
45
  m.templateId = d;
45
46
  const u = {
46
47
  emailId: d,
47
- userId: b,
48
+ userId: y,
48
49
  username: g,
49
50
  partnerName: S,
50
- savedModulesFolderName: w,
51
- defaultModulesFolderName: E
52
- }, C = {
51
+ savedModulesFolderName: D,
52
+ defaultModulesFolderName: C
53
+ }, E = {
53
54
  preselectedDynamicContentList: l,
54
55
  onReady: () => {
55
- console.debug("guido:ready"), t("ready");
56
+ console.debug("guido:ready"), o("ready");
56
57
  }
57
- }, { initPlugin: T } = Y(u, C), { getDefaultTemplate: k } = re(), { cloneTimersOnSave: F, hasTimerBlocks: U } = Z(), B = P(() => {
58
+ }, { initPlugin: F } = ee(u, E), { getDefaultTemplate: T } = ie(), { resolveCustomFieldAttributes: k, resetCustomFieldAttributes: A } = Y(), { cloneTimersOnSave: U, hasTimerBlocks: L } = te(), z = N(() => {
58
59
  var e;
59
60
  return !((e = s.ui) != null && e.showHeader);
60
61
  });
61
- Q({
62
+ Z({
62
63
  onBack: () => {
63
- console.debug("guido:back"), t("back");
64
+ console.debug("guido:back"), o("back");
64
65
  },
65
66
  onSaveStart: () => {
66
- console.debug("guido:save:start"), t("save:start");
67
+ console.debug("guido:save:start"), o("save:start");
67
68
  },
68
69
  onSaveComplete: (e) => {
69
70
  const r = { ...e, metadata: u };
70
- console.debug("guido:save:complete", r), t("save:complete", r);
71
+ console.debug("guido:save:complete", r), o("save:complete", r);
71
72
  },
72
73
  onTestEmailClick: () => {
73
- console.debug("guido:test-email:click"), t("test-email:click");
74
+ console.debug("guido:test-email:click"), o("test-email:click");
74
75
  }
75
76
  });
76
- const L = (e) => {
77
+ const M = (e) => {
77
78
  console.debug("dynamic-content:close", e), i.setSelectedDynamicContent(e), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: e }));
78
- }, M = () => {
79
+ }, _ = () => {
79
80
  console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
80
81
  };
81
- j(() => c.value, () => {
82
- t("on-change", c.value);
82
+ J(() => a.value, () => {
83
+ o("on-change", a.value);
83
84
  });
84
85
  const p = (e) => {
85
- const r = e, { attribute: R, position: z } = r.detail;
86
- console.debug("dynamic-content:open", r.detail), t("dynamic-content:open", R, z);
86
+ const r = e, { attribute: K, position: V } = r.detail;
87
+ console.debug("dynamic-content:open", r.detail), o("dynamic-content:open", K, V);
87
88
  };
88
- return q(async () => {
89
+ return Q(async () => {
89
90
  console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow");
90
91
  try {
91
- y.selectedUnsubscribePages = (o == null ? void 0 : o.selectedUnsubscribePages) || [];
92
+ f.selectedUnsubscribePages = (t == null ? void 0 : t.selectedUnsubscribePages) || [], await k();
92
93
  let e = {
93
- html: a && await A(a),
94
- css: D
94
+ html: c && await W(c),
95
+ css: w
95
96
  };
96
- e.html || (e = await k(), e.html = await A(e.html)), U(e.html) && (e.html = await F(e.html)), await T(e), i.selectedDynamicContentList = l;
97
+ e.html || (e = await T(), e.html = await W(e.html)), L(e.html) && (e.html = await U(e.html)), await F(e), i.selectedDynamicContentList = l;
97
98
  } catch (e) {
98
99
  console.error("Failed to initialize Stripo editor:", e);
99
100
  }
100
101
  document.addEventListener("dynamic-content:open", p);
101
- }), J(() => {
102
+ }), X(() => {
102
103
  document.removeEventListener("dynamic-content:open", p);
103
104
  try {
104
105
  window.UIEditor.removeEditor();
105
106
  } catch {
106
107
  console.debug("Failed to remove Stripo editor: No editor found");
107
108
  }
108
- s.reset();
109
- }), I({
109
+ A(), s.reset();
110
+ }), G({
110
111
  dynamicContent: {
111
- insert: L,
112
- close: M
112
+ insert: M,
113
+ close: _
113
114
  },
114
- hasChanges: c,
115
- saveSilent: f
116
- }), { __sfc: !0, PreviewContainer: O, OnboardingWrapper: G, headerWrapperRef: h, dynamicContentStore: i, unsubscribeStore: y, props: v, configStore: s, editorStore: m, previewStore: H, hasChanges: c, isTestPartner: x, saveSilent: f, templateId: d, userId: b, partnerName: S, username: g, templateConfig: o, editorConfig: n, html: a, css: D, preselectedDynamicContentList: l, savedModulesFolderName: w, defaultModulesFolderName: E, emit: t, metadata: u, options: C, initPlugin: T, getDefaultTemplate: k, cloneTimersOnSave: F, hasTimerBlocks: U, noHeader: B, insertDynamicContent: L, closeDynamicContent: M, handleDynamicContentOpen: p, Toaster: $, FilterSelectionDrawer: ee, HeaderWrapper: oe, LoadingWrapper: te, SaveAsTemplateDrawer: ne, UnsubscribeWrapper: se };
115
+ hasChanges: a,
116
+ saveSilent: h
117
+ }), { __sfc: !0, PreviewContainer: H, OnboardingWrapper: x, headerWrapperRef: b, dynamicContentStore: i, unsubscribeStore: f, props: v, configStore: s, editorStore: m, previewStore: B, hasChanges: a, isTestPartner: R, saveSilent: h, templateId: d, userId: y, partnerName: S, username: g, templateConfig: t, editorConfig: n, html: c, css: w, preselectedDynamicContentList: l, savedModulesFolderName: D, defaultModulesFolderName: C, emit: o, metadata: u, options: E, initPlugin: F, getDefaultTemplate: T, resolveCustomFieldAttributes: k, resetCustomFieldAttributes: A, cloneTimersOnSave: U, hasTimerBlocks: L, noHeader: z, insertDynamicContent: M, closeDynamicContent: _, handleDynamicContentOpen: p, Toaster: oe, FilterSelectionDrawer: ne, HeaderWrapper: se, LoadingWrapper: re, SaveAsTemplateDrawer: ae, UnsubscribeWrapper: ce };
117
118
  }
118
119
  });
119
120
  export {
120
- Me as default
121
+ Ne as default
121
122
  };
@@ -15,7 +15,7 @@ var u = function() {
15
15
  p,
16
16
  !1,
17
17
  null,
18
- "a289b9e9"
18
+ "acff76a8"
19
19
  );
20
20
  const v = c.exports;
21
21
  export {
@@ -14,17 +14,17 @@ import P from "./MigrationConfirmModal.vue.js";
14
14
  const Z = /* @__PURE__ */ E({
15
15
  __name: "EditorActions",
16
16
  setup(j, { expose: H }) {
17
- const { config: a } = w(), { exportHtml: m } = C(), { save: p } = O(), { openVersionHistory: l, closeVersionHistory: c } = k(), e = B(), u = R(), { hasMigrations: f } = I(u), s = A(), r = n(!1), i = n(!1), v = n(), S = M(), V = () => {
17
+ const { config: a } = w(), { exportHtml: m } = C(), { save: p } = O(), { openVersionHistory: l, closeVersionHistory: u } = k(), e = B(), c = R(), { hasMigrations: f } = I(c), r = A(), s = n(!1), i = n(!1), v = n(), S = M(), V = () => {
18
18
  if (e.isVersionHistoryOpen) {
19
- c();
19
+ u();
20
20
  return;
21
21
  }
22
22
  l();
23
23
  }, T = async () => {
24
- r.value = !0, await m(), r.value = !1;
24
+ s.value = !0, await m(), s.value = !1;
25
25
  }, _ = () => {
26
26
  e.isSaveAsTemplateDrawerOpen = !0;
27
- }, h = g(() => e.isVersionHistoryOpen ? s("newsletter.close-version-history") : s("newsletter.version-history")), x = g(
27
+ }, h = g(() => e.isVersionHistoryOpen ? r("newsletter.close-version-history") : r("newsletter.version-history")), x = g(
28
28
  () => {
29
29
  var o, t;
30
30
  return ((t = (o = a.value) == null ? void 0 : o.features) == null ? void 0 : t.versionHistory) && !e.isPreviewModeOpen;
@@ -39,11 +39,11 @@ const Z = /* @__PURE__ */ E({
39
39
  (t = v.value) == null || t.open();
40
40
  return;
41
41
  }
42
- d(o);
42
+ return d(o);
43
43
  };
44
44
  return H({
45
45
  handleSave: y
46
- }), { __sfc: !0, config: a, exportHtml: m, save: p, openVersionHistory: l, closeVersionHistory: c, editorStore: e, templateStore: u, hasMigrations: f, trans: s, isExporting: r, isSaving: i, migrationModalRef: v, testEmailClick: S, handleVersionHistory: V, handleExport: T, handleSaveAs: _, versionHistoryTooltipText: h, isVersionHistoryButtonVisible: x, executeSave: d, handleSave: y, getTooltipOptions: b, InButtonV2: D, MigrationConfirmModal: P };
46
+ }), { __sfc: !0, config: a, exportHtml: m, save: p, openVersionHistory: l, closeVersionHistory: u, editorStore: e, templateStore: c, hasMigrations: f, trans: r, isExporting: s, isSaving: i, migrationModalRef: v, testEmailClick: S, handleVersionHistory: V, handleExport: T, handleSaveAs: _, versionHistoryTooltipText: h, isVersionHistoryButtonVisible: x, executeSave: d, handleSave: y, getTooltipOptions: b, InButtonV2: D, MigrationConfirmModal: P };
47
47
  }
48
48
  });
49
49
  export {
@@ -0,0 +1,16 @@
1
+ import { useConfig as u } from "./useConfig.js";
2
+ import { useCustomFieldAttributesApi as l } from "../services/customFieldAttributesApi.js";
3
+ import { ref as m } from "vue";
4
+ const e = m([]), A = () => {
5
+ const { getCategorizedFields: i } = l(), { config: r } = u();
6
+ return { customFieldAttributes: e, resolveCustomFieldAttributes: async () => {
7
+ var s, o;
8
+ const t = (o = (s = r.value) == null ? void 0 : s.template) == null ? void 0 : o.customFieldAttributes;
9
+ e.value = t != null && t.length ? t : await i();
10
+ }, resetCustomFieldAttributes: () => {
11
+ e.value = [];
12
+ } };
13
+ };
14
+ export {
15
+ A as useCustomFieldAttributes
16
+ };
@@ -1,54 +1,55 @@
1
- import { useConfig as L } from "./useConfig.js";
2
- import { TemplateTypes as V } from "../enums/defaults.js";
3
- import { DISPLAY_CONDITIONS_REGEX as _, DISPLAY_CONDITIONS_EXCEPTIONS_REGEX as H, CampaignCouldNotBeSavedKey as P, CanNotMakeAnyChangesForRunningKey as G } from "../enums/html-validator.js";
1
+ import { useConfig as V } from "./useConfig.js";
2
+ import { useCustomFieldAttributes as _ } from "./useCustomFieldAttributes.js";
3
+ import { TemplateTypes as H } from "../enums/defaults.js";
4
+ import { DISPLAY_CONDITIONS_REGEX as P, DISPLAY_CONDITIONS_EXCEPTIONS_REGEX as G, CampaignCouldNotBeSavedKey as M, CanNotMakeAnyChangesForRunningKey as $ } from "../enums/html-validator.js";
4
5
  import { ToasterTypeOptions as c } from "../enums/toaster.js";
5
- import { itemsBlockDynamicVariables as M } from "../extensions/Blocks/Items/enums/productEnums.js";
6
- import { useRecommendationStore as $ } from "../stores/recommendation.js";
7
- import { base64EncodeWithSpecialChars as X } from "../utils/base64.js";
8
- import { useHttp as j } from "./useHttp.js";
9
- import { useToaster as q } from "./useToaster.js";
10
- import { useTranslations as z } from "./useTranslations.js";
11
- const K = /recommendation-id="(\d+)"/g;
12
- function U(i) {
13
- return [...i.matchAll(K)].map((u) => u[1]);
6
+ import { itemsBlockDynamicVariables as X } from "../extensions/Blocks/Items/enums/productEnums.js";
7
+ import { useRecommendationStore as j } from "../stores/recommendation.js";
8
+ import { base64EncodeWithSpecialChars as q } from "../utils/base64.js";
9
+ import { useHttp as z } from "./useHttp.js";
10
+ import { useToaster as K } from "./useToaster.js";
11
+ import { useTranslations as U } from "./useTranslations.js";
12
+ const Y = /recommendation-id="(\d+)"/g;
13
+ function Z(i) {
14
+ return [...i.matchAll(Y)].map((u) => u[1]);
14
15
  }
15
- function Y(i, u) {
16
+ function J(i, u) {
16
17
  return u.some((d) => i.startsWith(`${d}_`));
17
18
  }
18
- const ce = () => {
19
+ const ue = () => {
19
20
  var y, h;
20
- const { showToaster: i } = q(), { post: u } = j(), { config: d } = L(), r = z(), g = $(), p = ((h = (y = d.value) == null ? void 0 : y.partner) == null ? void 0 : h.messageType) === V.transactional, w = async (e) => {
21
+ const { showToaster: i } = K(), { post: u } = z(), { config: d } = V(), r = U(), g = j(), { customFieldAttributes: b } = _(), p = ((h = (y = d.value) == null ? void 0 : y.partner) == null ? void 0 : h.messageType) === H.transactional, w = async (e) => {
21
22
  const t = await u(
22
23
  "/newsletter/template-library/check-template-html-body",
23
- { html: X(e) }
24
+ { html: q(e) }
24
25
  ), { status: n, message: l } = t.data;
25
26
  return n || i({
26
27
  type: c.Alert,
27
28
  message: n === void 0 ? l : r("newsletter.invalid-url-link-for-toaster")
28
- }), r(P), l === r(G) && i({
29
+ }), r(M), l === r($) && i({
29
30
  type: c.Alert,
30
31
  message: r("newsletter.already-in-progress")
31
32
  }), n;
32
- }, b = (e) => !["if", "endif", "else", "elif", "now"].includes(e.toLowerCase()), S = (e) => ["if", "endif"].includes(e.toLowerCase()), E = (e, s) => {
33
+ }, S = (e) => !["if", "endif", "else", "elif", "now"].includes(e.toLowerCase()), E = (e) => ["if", "endif"].includes(e.toLowerCase()), A = (e, s) => {
33
34
  const t = e.match(/({%(.*?)%})/g);
34
35
  let n = !0;
35
36
  return t !== null && !p && t.forEach((l) => {
36
37
  const o = l.slice(2, -2).trim().match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);
37
38
  if (o && o.length > 0) {
38
39
  const [a] = o;
39
- b(a) && !s.includes(a) && (i({
40
+ S(a) && !s.includes(a) && (i({
40
41
  type: c.Warning,
41
42
  message: r("custom-fields.invalid-custom-fields")
42
43
  }), n = !1);
43
44
  }
44
45
  }), n;
45
- }, A = async (e, s, t) => {
46
+ }, I = async (e, s, t) => {
46
47
  const n = t ? await w(e) : !0;
47
- return E(e, s) && n;
48
- }, I = (e) => e.length > 0 ? !0 : (i({
48
+ return A(e, s) && n;
49
+ }, k = (e) => e.length > 0 ? !0 : (i({
49
50
  type: c.Warning,
50
51
  message: r("newsletter.html-content-is-empty")
51
- }), !1), k = (e) => {
52
+ }), !1), x = (e) => {
52
53
  const s = (e.match(/{/gm) || []).length, t = (e.match(/}/gm) || []).length;
53
54
  return s > t && i({
54
55
  type: c.Warning,
@@ -57,7 +58,7 @@ const ce = () => {
57
58
  type: c.Warning,
58
59
  message: r("custom-fields.missing-opening-braces")
59
60
  }), s === t;
60
- }, x = (e) => {
61
+ }, F = (e) => {
61
62
  const s = e.match(/{{\s*(\w+\s+((\w+\|\w+)|(\w+)))\s*}}/gm) === null;
62
63
  return s || i({
63
64
  type: c.Warning,
@@ -66,10 +67,10 @@ const ce = () => {
66
67
  }, T = (e, s) => {
67
68
  const t = e.match(/{{([a-zA-Z0-9_\s]*)}}/gm);
68
69
  if (t && !p) {
69
- const n = new Set(s.map((a) => a.toLowerCase())), l = U(e), o = [];
70
+ const n = new Set(s.map((a) => a.toLowerCase())), l = Z(e), o = [];
70
71
  if (t.forEach((a) => {
71
72
  const m = a.slice(2, -2).trim().toLowerCase();
72
- (!n.has(m) || m === "") && !Y(m, l) && o.push(m);
73
+ (!n.has(m) || m === "") && !J(m, l) && o.push(m);
73
74
  }), o.length > 0) {
74
75
  const a = `
75
76
  <ul>
@@ -83,11 +84,11 @@ const ce = () => {
83
84
  }
84
85
  }
85
86
  return !0;
86
- }, F = (e) => {
87
+ }, W = (e) => {
87
88
  const s = e.match(/{%(.*?)%}/g), t = [];
88
89
  let n = !0;
89
90
  if (s && s.forEach((l) => {
90
- const o = l.match(_), a = l.match(H), m = (o == null ? void 0 : o.join("")) || "";
91
+ const o = l.match(P), a = l.match(G), m = (o == null ? void 0 : o.join("")) || "";
91
92
  (!o || l !== m) && !a && (i({
92
93
  type: c.Alert,
93
94
  message: r("newsletter.display-conditions-invalid-syntax")
@@ -98,7 +99,7 @@ const ce = () => {
98
99
  }), n = !1);
99
100
  const v = f.match(/^[a-zA-Z]*$/g);
100
101
  v && v.forEach((C) => {
101
- S(C) && t.push(C);
102
+ E(C) && t.push(C);
102
103
  });
103
104
  });
104
105
  }), t.length) {
@@ -109,25 +110,25 @@ const ce = () => {
109
110
  }), n = !1);
110
111
  }
111
112
  return n;
112
- }, W = (e) => {
113
+ }, N = (e) => {
113
114
  const s = (e.match(/{% /gm) || []).length, t = (e.match(/ %}/gm) || []).length, n = s === t;
114
115
  return n || i({
115
116
  type: c.Warning,
116
117
  message: r("custom-conditions.no-space-after-braces")
117
118
  }), n;
118
- }, N = (e) => (e.match(/({%(.*?)%})/g) || []).filter((t) => t.includes("if")).map((t) => (t.match(/{{.*}}/gm) || []).length).reduce((t, n) => t + n, 0) > 0 ? (i({
119
+ }, O = (e) => (e.match(/({%(.*?)%})/g) || []).filter((t) => t.includes("if")).map((t) => (t.match(/{{.*}}/gm) || []).length).reduce((t, n) => t + n, 0) > 0 ? (i({
119
120
  type: c.Warning,
120
121
  message: r("custom-conditions.no-braces-inside-if-tag")
121
- }), !1) : !0, O = () => g.recommendationConfigs && Object.values(g.recommendationConfigs).find((s) => s.filters.find((t) => t.value === "")) !== void 0 ? (i({
122
+ }), !1) : !0, B = () => g.recommendationConfigs && Object.values(g.recommendationConfigs).find((s) => s.filters.find((t) => t.value === "")) !== void 0 ? (i({
122
123
  type: c.Alert,
123
124
  message: r("newsletter.fill-all-necessary-fields")
124
- }), !1) : !0, B = (e) => {
125
+ }), !1) : !0, R = (e) => {
125
126
  const s = /src="[^"]*\.(svg|pst)"/gm;
126
127
  return e.match(s) === null ? !0 : (i({
127
128
  type: c.Alert,
128
129
  message: r("newsletter.invalid-image-type")
129
130
  }), !1);
130
- }, R = (e) => {
131
+ }, D = (e) => {
131
132
  const n = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".checkbox-block-v2");
132
133
  return Array.from(n).find((o) => {
133
134
  var a;
@@ -136,7 +137,7 @@ const ce = () => {
136
137
  type: c.Alert,
137
138
  message: r("unsubscribe-templates.select-checkbox-groups")
138
139
  }), !1) : !0;
139
- }, D = (e) => {
140
+ }, L = (e) => {
140
141
  const n = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".radio-button-v2");
141
142
  return Array.from(n).find((o) => {
142
143
  var a;
@@ -149,11 +150,12 @@ const ce = () => {
149
150
  return { validateHtml: async (e, s, t = !1) => {
150
151
  const n = [
151
152
  ...s.map((o) => o.value),
152
- ...M
153
+ ...X,
154
+ ...b.value
153
155
  ];
154
- return await A(e, n, t) && I(e) && k(e) && x(e) && T(e, n) && F(e) && W(e) && N(e) && O() && B(e) && R(e) && D(e);
156
+ return await I(e, n, t) && k(e) && x(e) && F(e) && T(e, n) && W(e) && N(e) && O(e) && B() && R(e) && D(e) && L(e);
155
157
  } };
156
158
  };
157
159
  export {
158
- ce as useHtmlValidator
160
+ ue as useHtmlValidator
159
161
  };
@@ -1,5 +1,5 @@
1
1
  import { usePartner as N } from "../../composables/usePartner.js";
2
- import { LINK_REGEXES as l, LINK_TYPES as g, INSIDER_ID as f, URLS as S } from "../../enums/unsubscribe.js";
2
+ import { LINK_REGEXES as l, LINK_TYPES as S, INSIDER_ID as R, URLS as _ } from "../../enums/unsubscribe.js";
3
3
  import { parsePageList as U } from "../../extensions/Blocks/Unsubscribe/utils/utils.js";
4
4
  import { useConfigStore as B } from "../../stores/config.js";
5
5
  import { useDynamicContentStore as y } from "../../stores/dynamic-content.js";
@@ -16,25 +16,25 @@ const D = [
16
16
  let e = t;
17
17
  const r = `/${i()}/email/${a}?user={{iid}}`;
18
18
  return new DOMParser().parseFromString(e, "text/html").querySelectorAll(".unsubscribe-block-v2[data-unsubscribe-page-list]").forEach((p) => {
19
- var b;
19
+ var g;
20
20
  const m = p.getAttribute("data-unsubscribe-page-list");
21
21
  if (!m)
22
22
  return;
23
- const R = U(m), d = ((b = u.templates) == null ? void 0 : b.filter(
24
- (o) => R.includes(o.id)
25
- )) ?? [], _ = d.some((o) => o.type === g.UNSUBSCRIBE_LINK_TYPE), I = d.some((o) => o.type === g.PREFERENCES_LINK_TYPE), E = p.outerHTML;
26
- let s = E;
27
- _ && (n.selectedDynamicContentList.push({
28
- text: f,
29
- value: f,
23
+ const I = U(m), d = ((g = u.templates) == null ? void 0 : g.filter(
24
+ (o) => I.includes(o.id)
25
+ )) ?? [], E = d.some((o) => o.type === S.UNSUBSCRIBE_LINK_TYPE), b = d.some((o) => o.type === S.PREFERENCES_LINK_TYPE), f = p.outerHTML;
26
+ let s = f;
27
+ (E || b) && n.selectedDynamicContentList.push({
28
+ text: R,
29
+ value: R,
30
30
  fallback: ""
31
- }), s = s.replace(
31
+ }), E && (s = s.replace(
32
32
  l.GLOBAL_UNSUBSCRIBE_LINK_REGEX,
33
- S.UNSUBSCRIBE_URL + r
34
- )), I && (s = s.replace(
33
+ _.UNSUBSCRIBE_URL + r
34
+ )), b && (s = s.replace(
35
35
  l.PREFERENCES_UNSUBSCRIBE_LINK_REGEX,
36
- S.PREFERENCES_URL + r
37
- )), s = s.replace(l.UNSUBSCRIBE_LINK_REGEX, ""), e = e.replace(E, s);
36
+ _.PREFERENCES_URL + r
37
+ )), s = s.replace(l.UNSUBSCRIBE_LINK_REGEX, ""), e = e.replace(f, s);
38
38
  }), e;
39
39
  },
40
40
  priority: 60