@useinsider/guido 3.16.0-beta.ca26c4e → 3.16.0-beta.efbb91f

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 (45) hide show
  1. package/dist/components/Guido.vue.js +8 -8
  2. package/dist/components/Guido.vue2.js +78 -76
  3. package/dist/components/organisms/AutoSaveController.vue2.js +9 -8
  4. package/dist/components/organisms/header/EditorActions.vue.js +2 -2
  5. package/dist/components/organisms/header/EditorActions.vue2.js +74 -43
  6. package/dist/components/organisms/header/LeftSlot.vue.js +5 -5
  7. package/dist/components/organisms/header/LeftSlot.vue2.js +45 -23
  8. package/dist/components/organisms/validation/ValidationErrorDrawer.vue.js +20 -0
  9. package/dist/components/organisms/validation/ValidationErrorDrawer.vue2.js +61 -0
  10. package/dist/components/wrappers/WpDrawer.vue.js +9 -7
  11. package/dist/components/wrappers/WpDrawer.vue2.js +1 -1
  12. package/dist/composables/useHtmlValidator.js +1 -0
  13. package/dist/composables/useSave.js +84 -41
  14. package/dist/composables/useSaveValidation.js +276 -0
  15. package/dist/composables/useSaveValidationRollout.js +9 -0
  16. package/dist/composables/validators/useCouponBlockValidator.js +24 -21
  17. package/dist/composables/validators/useUnsubscribeBlockValidator.js +34 -27
  18. package/dist/config/migrator/itemsBlockMigrator.js +1 -1
  19. package/dist/enums/recommendation.js +17 -17
  20. package/dist/enums/save-validation.js +4 -0
  21. package/dist/extensions/Blocks/Items/enums/productEnums.js +45 -45
  22. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +31 -24
  23. package/dist/guido.css +1 -1
  24. package/dist/src/@types/save-validation.d.ts +19 -0
  25. package/dist/src/components/Guido.vue.d.ts +17 -1
  26. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +17 -1
  27. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +17 -1
  28. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +17 -1
  29. package/dist/src/components/organisms/validation/ValidationErrorDrawer.vue.d.ts +2 -0
  30. package/dist/src/components/wrappers/WpDrawer.vue.d.ts +4 -3
  31. package/dist/src/composables/useHtmlValidator.d.ts +14 -0
  32. package/dist/src/composables/useSave.d.ts +6 -1
  33. package/dist/src/composables/useSaveValidation.d.ts +6 -0
  34. package/dist/src/composables/useSaveValidationRollout.d.ts +3 -0
  35. package/dist/src/composables/validators/useCouponBlockValidator.d.ts +3 -0
  36. package/dist/src/composables/validators/useUnsubscribeBlockValidator.d.ts +10 -0
  37. package/dist/src/enums/save-validation.d.ts +27 -0
  38. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +5 -0
  39. package/dist/src/stores/config.d.ts +5 -0
  40. package/dist/src/stores/save-validation.d.ts +22 -0
  41. package/dist/src/utils/templatePreparation.d.ts +30 -0
  42. package/dist/stores/config.js +13 -6
  43. package/dist/stores/save-validation.js +30 -0
  44. package/dist/utils/templatePreparation.js +28 -25
  45. package/package.json +1 -1
@@ -1,20 +1,20 @@
1
- import i from "./Guido.vue2.js";
1
+ import a from "./Guido.vue2.js";
2
2
  /* empty css */
3
- import a from "../_virtual/_plugin-vue2_normalizer.js";
3
+ import i 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", { ref: "wrapperRef", staticClass: "guido-editor__wrapper", class: { "guido-editor__no-header": e.noHeader } }, [r(e.HeaderWrapper, { ref: "headerWrapperRef" }), r(e.AutoSaveController), 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(p) {
6
+ return r("div", { ref: "wrapperRef", staticClass: "guido-editor__wrapper", class: { "guido-editor__no-header": e.noHeader } }, [r(e.HeaderWrapper, { ref: "headerWrapperRef" }), r(e.AutoSaveController), 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.isSaveValidationEnabled ? r(e.ValidationErrorDrawer) : o._e(), e.isTestPartner() ? o._e() : r(e.OnboardingWrapper, { on: { "onboarding-finished": function(p) {
7
7
  return e.emit("onboarding:finished");
8
8
  } } }), r(e.UnsubscribeWrapper), r(e.LoadingWrapper)], 1);
9
- }, n = [], s = /* @__PURE__ */ a(
10
- i,
9
+ }, n = [], d = /* @__PURE__ */ i(
10
+ a,
11
11
  t,
12
12
  n,
13
13
  !1,
14
14
  null,
15
- "b0d3b445"
15
+ "f02fdde0"
16
16
  );
17
- const l = s.exports;
17
+ const c = d.exports;
18
18
  export {
19
- l as default
19
+ c as default
20
20
  };
@@ -1,30 +1,32 @@
1
- import { defineComponent as j, defineAsyncComponent as R, ref as B, computed as U, watch as _, onMounted as J, onUnmounted as Q } from "vue";
2
- import { useCortexBlueprintBridge as X } from "../composables/useCortexBlueprintBridge.js";
3
- import { provideGuidoActions as Y } from "../composables/useGuidoActions.js";
4
- import { useGuidoStateBridge as Z } from "../composables/useGuidoStateBridge.js";
5
- import { usePartner as ee } from "../composables/usePartner.js";
6
- import { useStripo as te } from "../composables/useStripo.js";
7
- import { useTimerClone as oe } from "../composables/useTimerClone.js";
1
+ import { defineComponent as J, defineAsyncComponent as M, ref as B, computed as U, watch as _, onMounted as Q, onUnmounted as X } from "vue";
2
+ import { useCortexBlueprintBridge as Y } from "../composables/useCortexBlueprintBridge.js";
3
+ import { provideGuidoActions as Z } from "../composables/useGuidoActions.js";
4
+ import { useGuidoStateBridge as ee } from "../composables/useGuidoStateBridge.js";
5
+ import { usePartner as oe } from "../composables/usePartner.js";
6
+ import { useSaveValidationRollout as te } from "../composables/useSaveValidationRollout.js";
7
+ import { useStripo as ne } from "../composables/useStripo.js";
8
+ import { useTimerClone as re } from "../composables/useTimerClone.js";
8
9
  import { migrate as N } from "../config/migrator/index.js";
9
10
  import { ModuleFolderDefaults as O } from "../enums/defaults.js";
10
- import { RIBBON_SELECTOR as ne } from "../enums/onboarding.js";
11
- import { useRecommendationExtensionStore as re } from "../extensions/Blocks/Recommendation/store/recommendation.js";
12
- import se from "./organisms/AutoSaveController.vue.js";
13
- import ae from "./organisms/base/Toaster.vue.js";
14
- import ie from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
15
- import ce from "./organisms/header/HeaderWrapper.vue.js";
16
- import de from "./organisms/LoadingWrapper.vue.js";
17
- import me from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
18
- import le from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
19
- import { useStripoApi as ue } from "../services/stripoApi.js";
20
- import { useConfigStore as pe } from "../stores/config.js";
21
- import { useDynamicContentStore as fe } from "../stores/dynamic-content.js";
11
+ import { RIBBON_SELECTOR as se } from "../enums/onboarding.js";
12
+ import { useRecommendationExtensionStore as ae } from "../extensions/Blocks/Recommendation/store/recommendation.js";
13
+ import ie from "./organisms/AutoSaveController.vue.js";
14
+ import ce from "./organisms/base/Toaster.vue.js";
15
+ import de from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
16
+ import me from "./organisms/header/HeaderWrapper.vue.js";
17
+ import le from "./organisms/LoadingWrapper.vue.js";
18
+ import ue from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
19
+ import pe from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
20
+ import fe from "./organisms/validation/ValidationErrorDrawer.vue.js";
21
+ import { useStripoApi as ve } from "../services/stripoApi.js";
22
+ import { useConfigStore as ye } from "../stores/config.js";
23
+ import { useDynamicContentStore as Se } from "../stores/dynamic-content.js";
22
24
  import { useEditorStore as P } from "../stores/editor.js";
23
- import { usePreviewStore as ye } from "../stores/preview.js";
24
- import { useTemplateStore as ve } from "../stores/template.js";
25
- import { useUnsubscribeStore as he } from "../stores/unsubscribe.js";
25
+ import { usePreviewStore as he } from "../stores/preview.js";
26
+ import { useTemplateStore as be } from "../stores/template.js";
27
+ import { useUnsubscribeStore as ge } from "../stores/unsubscribe.js";
26
28
  import { readTrackFloor as A } from "../utils/linkTrackingIds.js";
27
- const ze = /* @__PURE__ */ j({
29
+ const Je = /* @__PURE__ */ J({
28
30
  __name: "Guido",
29
31
  props: {
30
32
  config: null,
@@ -32,121 +34,121 @@ const ze = /* @__PURE__ */ j({
32
34
  },
33
35
  emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished", "test-email:click"],
34
36
  setup(W, { expose: x, emit: r }) {
35
- const a = W, G = R(
37
+ const a = W, G = M(
36
38
  () => import("./organisms/email-preview/PreviewContainer.vue.js")
37
- ), H = R(
39
+ ), H = M(
38
40
  () => import("./organisms/onboarding/OnboardingWrapper.vue.js")
39
- ), h = B(), l = B(), u = fe(), S = he(), o = pe();
40
- a.ready && o.init(a.config);
41
- const c = P(), $ = ye(), m = U(() => c.hasChanges), { isTestPartner: z } = ee(), g = () => {
42
- var t;
43
- return (t = h.value) == null ? void 0 : t.handleSave(!0);
44
- }, b = (t) => {
45
- c.loadingStatus = t;
41
+ ), S = B(), l = B(), u = Se(), h = ge(), t = ye();
42
+ a.ready && t.init(a.config);
43
+ const c = P(), V = he(), m = U(() => c.hasChanges), { isTestPartner: $ } = oe(), { isEnabled: z } = te(), b = () => {
44
+ var o;
45
+ return (o = S.value) == null ? void 0 : o.handleSave(!0);
46
+ }, g = (o) => {
47
+ c.loadingStatus = o;
46
48
  };
47
- X(), Z();
49
+ Y(), ee();
48
50
  const p = () => {
49
- var t, e;
51
+ var o, e;
50
52
  return {
51
- emailId: o.templateId,
52
- userId: o.userId,
53
- username: o.username,
54
- partnerName: o.partnerName,
55
- savedModulesFolderName: ((t = o.editor) == null ? void 0 : t.savedModulesFolderName) || O.SAVED_MODULES,
56
- defaultModulesFolderName: ((e = o.editor) == null ? void 0 : e.defaultModulesFolderName) || O.DEFAULT_MODULES
53
+ emailId: t.templateId,
54
+ userId: t.userId,
55
+ username: t.username,
56
+ partnerName: t.partnerName,
57
+ savedModulesFolderName: ((o = t.editor) == null ? void 0 : o.savedModulesFolderName) || O.SAVED_MODULES,
58
+ defaultModulesFolderName: ((e = t.editor) == null ? void 0 : e.defaultModulesFolderName) || O.DEFAULT_MODULES
57
59
  };
58
- }, { initPlugin: E, preloadRuntime: w } = te(), { getDefaultTemplate: C } = ue(), { cloneTimersOnSave: D, hasTimerBlocks: k } = oe(), q = U(() => {
59
- var t;
60
- return !((t = o.ui) != null && t.showHeader);
60
+ }, { initPlugin: E, preloadRuntime: w } = ne(), { getDefaultTemplate: D } = ve(), { cloneTimersOnSave: C, hasTimerBlocks: k } = re(), q = U(() => {
61
+ var o;
62
+ return !((o = t.ui) != null && o.showHeader);
61
63
  });
62
- Y({
64
+ Z({
63
65
  onBack: () => {
64
66
  console.debug("guido:back"), r("back");
65
67
  },
66
68
  onSaveStart: () => {
67
69
  console.debug("guido:save:start"), r("save:start");
68
70
  },
69
- onSaveComplete: (t) => {
70
- const e = { ...t, metadata: p() };
71
+ onSaveComplete: (o) => {
72
+ const e = { ...o, metadata: p() };
71
73
  console.debug("guido:save:complete", e), r("save:complete", e);
72
74
  },
73
75
  onTestEmailClick: () => {
74
76
  console.debug("guido:test-email:click"), r("test-email:click");
75
77
  }
76
78
  });
77
- const T = (t) => {
78
- console.debug("dynamic-content:close", t), u.setSelectedDynamicContent(t), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: t }));
79
+ const T = (o) => {
80
+ console.debug("dynamic-content:close", o), u.setSelectedDynamicContent(o), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: o }));
79
81
  }, F = () => {
80
82
  console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
81
83
  };
82
84
  _(() => m.value, () => {
83
85
  r("on-change", m.value);
84
86
  });
85
- const f = (t) => {
86
- const e = t, { attribute: s, position: d } = e.detail;
87
+ const f = (o) => {
88
+ const e = o, { attribute: s, position: d } = e.detail;
87
89
  console.debug("dynamic-content:open", e.detail), r("dynamic-content:open", s, d);
88
90
  };
89
91
  let i = null;
90
- const y = () => {
92
+ const v = () => {
91
93
  var e;
92
- const t = document.querySelector(ne);
93
- (e = l.value) == null || e.style.setProperty("--ribbon-offset", `${(t == null ? void 0 : t.offsetHeight) ?? 0}px`);
94
- }, v = async () => {
95
- var t;
94
+ const o = document.querySelector(se);
95
+ (e = l.value) == null || e.style.setProperty("--ribbon-offset", `${(o == null ? void 0 : o.offsetHeight) ?? 0}px`);
96
+ }, y = async () => {
97
+ var o;
96
98
  try {
97
- o.initialized || o.init(a.config), c.templateId = o.templateId;
98
- const e = o.template, s = (e == null ? void 0 : e.html) || "", d = (e == null ? void 0 : e.css) || "", I = (e == null ? void 0 : e.preselectedDynamicContent) || [];
99
- S.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
100
- const L = ((t = e == null ? void 0 : e.migration) == null ? void 0 : t.recommendationConfigs) ?? {}, M = o.isFeatureEnabled("linkTrackingIds");
99
+ t.initialized || t.init(a.config), c.templateId = t.templateId;
100
+ const e = t.template, s = (e == null ? void 0 : e.html) || "", d = (e == null ? void 0 : e.css) || "", I = (e == null ? void 0 : e.preselectedDynamicContent) || [];
101
+ h.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
102
+ const L = ((o = e == null ? void 0 : e.migration) == null ? void 0 : o.recommendationConfigs) ?? {}, R = t.isFeatureEnabled("linkTrackingIds");
101
103
  let n = {
102
104
  html: s && await N(s, L),
103
105
  css: d
104
106
  };
105
- n.html || (n = await C(), n.html = await N(n.html, L));
106
- const K = M ? A(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
107
- k(n.html) && (n.html = await D(n.html)), M && (c.trackIdSessionFloor = Math.max(K, A(n.html)));
108
- const V = {
107
+ n.html || (n = await D(), n.html = await N(n.html, L));
108
+ const K = R ? A(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
109
+ k(n.html) && (n.html = await C(n.html)), R && (c.trackIdSessionFloor = Math.max(K, A(n.html)));
110
+ const j = {
109
111
  preselectedDynamicContentList: I,
110
112
  onReady: () => {
111
113
  console.debug("guido:ready"), r("ready");
112
114
  }
113
115
  };
114
- await E(n, p(), V), u.selectedDynamicContentList = I;
116
+ await E(n, p(), j), u.selectedDynamicContentList = I;
115
117
  } catch (e) {
116
118
  console.error("Failed to initialize Stripo editor:", e);
117
119
  }
118
120
  };
119
- return J(async () => {
121
+ return Q(async () => {
120
122
  var e;
121
- console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), re().$reset(), P().$reset(), ve().$reset(), y();
122
- const t = (e = l.value) == null ? void 0 : e.parentElement;
123
- if (t && (i = new ResizeObserver(y), i.observe(t)), w(), a.ready)
124
- await v();
123
+ console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), ae().$reset(), P().$reset(), be().$reset(), v();
124
+ const o = (e = l.value) == null ? void 0 : e.parentElement;
125
+ if (o && (i = new ResizeObserver(v), i.observe(o)), w(), a.ready)
126
+ await y();
125
127
  else {
126
128
  const s = _(() => a.ready, (d) => {
127
- d && (s(), v());
129
+ d && (s(), y());
128
130
  });
129
131
  }
130
132
  document.addEventListener("dynamic-content:open", f);
131
- }), Q(() => {
133
+ }), X(() => {
132
134
  i == null || i.disconnect(), document.removeEventListener("dynamic-content:open", f);
133
135
  try {
134
136
  window.UIEditor.removeEditor();
135
137
  } catch {
136
138
  console.debug("Failed to remove Stripo editor: No editor found");
137
139
  }
138
- o.reset();
140
+ t.reset();
139
141
  }), x({
140
142
  dynamicContent: {
141
143
  insert: T,
142
144
  close: F
143
145
  },
144
146
  hasChanges: m,
145
- saveSilent: g,
146
- setLoading: b
147
- }), { __sfc: !0, PreviewContainer: G, OnboardingWrapper: H, headerWrapperRef: h, wrapperRef: l, dynamicContentStore: u, unsubscribeStore: S, props: a, configStore: o, editorStore: c, previewStore: $, hasChanges: m, isTestPartner: z, saveSilent: g, setLoading: b, emit: r, buildMetadata: p, initPlugin: E, preloadRuntime: w, getDefaultTemplate: C, cloneTimersOnSave: D, hasTimerBlocks: k, noHeader: q, insertDynamicContent: T, closeDynamicContent: F, handleDynamicContentOpen: f, ribbonObserver: i, updateRibbonOffset: y, startEditor: v, AutoSaveController: se, Toaster: ae, FilterSelectionDrawer: ie, HeaderWrapper: ce, LoadingWrapper: de, SaveAsTemplateDrawer: me, UnsubscribeWrapper: le };
147
+ saveSilent: b,
148
+ setLoading: g
149
+ }), { __sfc: !0, PreviewContainer: G, OnboardingWrapper: H, headerWrapperRef: S, wrapperRef: l, dynamicContentStore: u, unsubscribeStore: h, props: a, configStore: t, editorStore: c, previewStore: V, hasChanges: m, isTestPartner: $, isSaveValidationEnabled: z, saveSilent: b, setLoading: g, emit: r, buildMetadata: p, initPlugin: E, preloadRuntime: w, getDefaultTemplate: D, cloneTimersOnSave: C, hasTimerBlocks: k, noHeader: q, insertDynamicContent: T, closeDynamicContent: F, handleDynamicContentOpen: f, ribbonObserver: i, updateRibbonOffset: v, startEditor: y, AutoSaveController: ie, Toaster: ce, FilterSelectionDrawer: de, HeaderWrapper: me, LoadingWrapper: le, SaveAsTemplateDrawer: ue, UnsubscribeWrapper: pe, ValidationErrorDrawer: fe };
148
150
  }
149
151
  });
150
152
  export {
151
- ze as default
153
+ Je as default
152
154
  };
@@ -1,13 +1,14 @@
1
- import { defineComponent as t } from "vue";
2
- import { useAutoSave as r } from "../../composables/useAutoSave.js";
3
- import { useSave as s } from "../../composables/useSave.js";
4
- const f = /* @__PURE__ */ t({
1
+ import { defineComponent as r } from "vue";
2
+ import { useAutoSave as s } from "../../composables/useAutoSave.js";
3
+ import { useSave as n } from "../../composables/useSave.js";
4
+ import { useSaveValidationRollout as u } from "../../composables/useSaveValidationRollout.js";
5
+ const v = /* @__PURE__ */ r({
5
6
  __name: "AutoSaveController",
6
- setup(a) {
7
- const { save: e } = s(), o = () => e(!1, !0);
8
- return r(o), { __sfc: !0, save: e, backgroundSave: o };
7
+ setup(m) {
8
+ const { save: e, saveRawOnly: o } = n(), { isEnabled: t } = u(), a = () => t.value ? o() : e(!1, !0);
9
+ return s(a), { __sfc: !0, save: e, saveRawOnly: o, isEnabled: t, backgroundSave: a };
9
10
  }
10
11
  });
11
12
  export {
12
- f as default
13
+ v as default
13
14
  };
@@ -4,7 +4,7 @@ import d from "../../../_virtual/_plugin-vue2_normalizer.js";
4
4
  var u = function() {
5
5
  var s, i, n, a;
6
6
  var o = this, e = o._self._c, t = o._self._setupProxy;
7
- return e("div", { staticClass: "d-f editor-actions" }, [t.isVersionHistoryButtonVisible ? e(t.InButtonV2, { attrs: { id: "guido__history-button", "left-icon": "line-architect-version-history", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryButtonDisabled, "label-text-status": !1, "selected-status": t.editorStore.isVersionHistoryOpen, "tooltip-options": t.getTooltipOptions("guido__history-button"), "tooltip-text": t.versionHistoryTooltipText }, on: { click: t.handleVersionHistory } }) : o._e(), e(t.InButtonV2, { attrs: { id: "guido__export-button", "left-icon": "line-export", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isExportButtonDisabled, "label-text-status": !1, "loading-status": t.isExporting, "tooltip-options": t.getTooltipOptions("guido__export-button"), "tooltip-text": t.trans("newsletter.export") }, on: { click: t.handleExport } }), (i = (s = t.config) == null ? void 0 : s.features) != null && i.saveAsTemplate ? e(t.InButtonV2, { attrs: { id: "guido__save-as-button", "left-icon": "line-newsletter-save-as-template", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isSaveAsButtonDisabled, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__save-as-button"), "tooltip-text": t.trans("newsletter.save-templates") }, on: { click: t.handleSaveAs } }) : o._e(), (a = (n = t.config) == null ? void 0 : n.features) != null && a.testMessage ? e(t.InButtonV2, { attrs: { id: "guido__test-button", "left-icon": "line-architect-test-journey", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isTestButtonDisabled, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__test-button", { staticPosition: "bottom right" }), "tooltip-text": t.trans("newsletter.test-email") }, on: { click: t.handleTestEmail } }) : o._e(), t.editorStore.isPreviewModeOpen ? o._e() : e(t.InButtonV2, { staticClass: "ml-3", attrs: { id: "guido__save-button", "label-text": "Save", "disabled-status": !t.isSaving && t.editorStore.isSaveButtonDisabled, "loading-status": t.isSaving }, on: { click: function(r) {
7
+ return e("div", { staticClass: "d-f editor-actions" }, [t.isVersionHistoryButtonVisible ? e(t.InButtonV2, { attrs: { id: "guido__history-button", "left-icon": "line-architect-version-history", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryButtonDisabled, "label-text-status": !1, "selected-status": t.editorStore.isVersionHistoryOpen, "tooltip-options": t.getTooltipOptions("guido__history-button"), "tooltip-text": t.versionHistoryTooltipText }, on: { click: t.handleVersionHistory } }) : o._e(), e(t.InButtonV2, { attrs: { id: "guido__export-button", "left-icon": "line-export", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isExportButtonDisabled, "label-text-status": !1, "loading-status": t.isExporting, "tooltip-options": t.getTooltipOptions("guido__export-button"), "tooltip-text": t.trans("newsletter.export") }, on: { click: t.handleExport } }), (i = (s = t.config) == null ? void 0 : s.features) != null && i.saveAsTemplate ? e(t.InButtonV2, { attrs: { id: "guido__save-as-button", "left-icon": "line-newsletter-save-as-template", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isSaveAsButtonDisabled, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__save-as-button"), "tooltip-text": t.trans("newsletter.save-templates") }, on: { click: t.handleSaveAs } }) : o._e(), (a = (n = t.config) == null ? void 0 : n.features) != null && a.testMessage ? e(t.InButtonV2, { attrs: { id: "guido__test-button", "left-icon": "line-architect-test-journey", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isTestButtonDisabled, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__test-button", { staticPosition: "bottom right" }), "tooltip-text": t.trans("newsletter.test-email") }, on: { click: t.handleTestEmail } }) : o._e(), t.editorStore.isPreviewModeOpen ? o._e() : e(t.InButtonV2, { staticClass: "ml-3", attrs: { id: "guido__save-button", "disabled-status": !t.isSaving && t.editorStore.isSaveButtonDisabled, "label-text": t.saveLabel, "loading-status": t.isSaving }, on: { click: function(r) {
8
8
  return t.handleSave(!1);
9
9
  } } }), e(t.MigrationConfirmModal, { ref: "migrationModalRef", on: { confirm: function(r) {
10
10
  return t.executeSave(!1);
@@ -15,7 +15,7 @@ var u = function() {
15
15
  p,
16
16
  !1,
17
17
  null,
18
- "6e711fd7"
18
+ "44d8e7c8"
19
19
  );
20
20
  const v = c.exports;
21
21
  export {
@@ -1,66 +1,97 @@
1
- import { defineComponent as O, ref as n, computed as h } from "vue";
2
- import { useActionsApi as q } from "../../../composables/useActionsApi.js";
3
- import { useConfig as b } from "../../../composables/useConfig.js";
4
- import { useExport as k } from "../../../composables/useExport.js";
5
- import { useTestEmailClick as B } from "../../../composables/useGuidoActions.js";
6
- import { useHtmlCompiler as D } from "../../../composables/useHtmlCompiler.js";
7
- import { useSave as F } from "../../../composables/useSave.js";
8
- import { useTranslations as L } from "../../../composables/useTranslations.js";
9
- import { useVersionHistoryApi as R } from "../../../composables/useVersionHistoryApi.js";
10
- import { useLiquidValidator as z } from "../../../composables/validators/useLiquidValidator.js";
11
- import { useEditorStore as I } from "../../../stores/editor.js";
12
- import { useTemplateStore as P } from "../../../stores/template.js";
13
- import { getTooltipOptions as j } from "../../../utils/tooltipUtils.js";
14
- import { InButtonV2 as G } from "@useinsider/design-system-vue";
15
- import { storeToRefs as J } from "pinia";
16
- import K from "./MigrationConfirmModal.vue.js";
17
- const ut = /* @__PURE__ */ O({
1
+ import { defineComponent as R, computed as l, ref as m } from "vue";
2
+ import { useActionsApi as D } from "../../../composables/useActionsApi.js";
3
+ import { useConfig as F } from "../../../composables/useConfig.js";
4
+ import { useExport as z } from "../../../composables/useExport.js";
5
+ import { useTestEmailClick as I } from "../../../composables/useGuidoActions.js";
6
+ import { useHtmlCompiler as P } from "../../../composables/useHtmlCompiler.js";
7
+ import { useSave as j } from "../../../composables/useSave.js";
8
+ import { useSaveValidation as G } from "../../../composables/useSaveValidation.js";
9
+ import { useSaveValidationRollout as J } from "../../../composables/useSaveValidationRollout.js";
10
+ import { useToaster as K } from "../../../composables/useToaster.js";
11
+ import { useTranslations as N } from "../../../composables/useTranslations.js";
12
+ import { useVersionHistoryApi as Q } from "../../../composables/useVersionHistoryApi.js";
13
+ import { useLiquidValidator as U } from "../../../composables/validators/useLiquidValidator.js";
14
+ import { ToasterTypeOptions as W } from "../../../enums/toaster.js";
15
+ import { useConfigStore as X } from "../../../stores/config.js";
16
+ import { useEditorStore as Y } from "../../../stores/editor.js";
17
+ import { useSaveValidationStore as Z } from "../../../stores/save-validation.js";
18
+ import { useTemplateStore as $ } from "../../../stores/template.js";
19
+ import { getTooltipOptions as tt } from "../../../utils/tooltipUtils.js";
20
+ import { InButtonV2 as ot } from "@useinsider/design-system-vue";
21
+ import { storeToRefs as et } from "pinia";
22
+ import rt from "./MigrationConfirmModal.vue.js";
23
+ const At = /* @__PURE__ */ R({
18
24
  __name: "EditorActions",
19
- setup(N, { expose: x }) {
20
- const { config: a, isFeatureEnabled: l } = b(), { exportHtml: m } = k(), { save: u } = F(), { openVersionHistory: c, closeVersionHistory: p } = R(), { getCompiledEmail: f } = q(), { compileHtml: d } = D(), { validateLiquidSyntax: v } = z(), e = I(), y = P(), { hasMigrations: g } = J(y), s = L(), i = n(!1), r = n(!1), S = n(), H = B(), T = () => {
25
+ setup(it, { expose: A }) {
26
+ const { config: u, isFeatureEnabled: c } = F(), { exportHtml: f } = z(), { save: p } = j(), { validateCurrentTemplate: d } = G(), { isEnabled: i } = J(), { showToaster: v } = K(), { openVersionHistory: S, closeVersionHistory: y } = Q(), { getCompiledEmail: g } = D(), { compileHtml: h } = P(), { validateLiquidSyntax: T } = U(), V = X(), e = Y(), H = Z(), w = $(), { hasMigrations: E } = et(w), r = N(), O = l(() => i.value && !V.isTransactional ? r("email-editor.save-and-continue") : "Save"), s = m(!1), a = m(!1), x = m(), n = I(), M = () => {
21
27
  if (e.isVersionHistoryOpen) {
22
- p();
28
+ y();
23
29
  return;
24
30
  }
25
- c();
26
- }, w = async () => {
27
- i.value = !0, await m(), i.value = !1;
28
- }, _ = () => {
31
+ S();
32
+ }, b = async () => {
33
+ s.value = !0, await f(), s.value = !1;
34
+ }, k = () => {
29
35
  e.isSaveAsTemplateDrawerOpen = !0;
30
- }, C = h(() => e.isVersionHistoryOpen ? s("newsletter.close-version-history") : s("newsletter.version-history")), A = h(
36
+ }, q = l(() => e.isVersionHistoryOpen ? r("newsletter.close-version-history") : r("newsletter.version-history")), B = l(
31
37
  () => {
32
38
  var t, o;
33
- return ((o = (t = a.value) == null ? void 0 : t.features) == null ? void 0 : o.versionHistory) && !e.isPreviewModeOpen;
39
+ return ((o = (t = u.value) == null ? void 0 : t.features) == null ? void 0 : o.versionHistory) && !e.isPreviewModeOpen;
34
40
  }
35
- ), V = async (t) => {
36
- r.value = !0, t || (e.loadingStatus = !0);
37
- const o = await u(t);
38
- return r.value = !1, !t && !o && (e.loadingStatus = !1), o;
39
- }, E = (t) => {
41
+ ), C = async (t) => {
42
+ a.value = !0, t || (e.loadingStatus = !0);
43
+ const o = await p(t);
44
+ return a.value = !1, !t && !o && (e.loadingStatus = !1), o;
45
+ }, _ = (t) => {
40
46
  var o;
41
- if (!t && g.value) {
42
- (o = S.value) == null || o.open();
47
+ if (!t && E.value) {
48
+ (o = x.value) == null || o.open();
43
49
  return;
44
50
  }
45
- return V(t);
46
- }, M = async () => {
47
- if (l("liquidSyntax")) {
51
+ return C(t);
52
+ }, L = async () => {
53
+ if (i.value) {
48
54
  e.loadingStatus = !0;
55
+ let t = [];
49
56
  try {
50
- const { html: t } = await f({ minimize: !0, resetDataSavedFlag: !1 }), { compiledHtml: o } = d(t);
51
- if (!await v(o))
57
+ t = await d();
58
+ } catch (o) {
59
+ console.warn("Test-path validation failed; sending without the drawer.", o);
60
+ } finally {
61
+ e.loadingStatus = !1;
62
+ }
63
+ if (t.length) {
64
+ v({
65
+ type: W.Error,
66
+ message: r("email-editor.validation-errors-found"),
67
+ actionButton: {
68
+ text: r("email-editor.check-errors"),
69
+ onClick: () => H.open(t, "test")
70
+ },
71
+ autoHide: !1
72
+ });
73
+ return;
74
+ }
75
+ n();
76
+ return;
77
+ }
78
+ if (c("liquidSyntax")) {
79
+ e.loadingStatus = !0;
80
+ try {
81
+ const { html: t } = await g({ minimize: !0, resetDataSavedFlag: !1 }), { compiledHtml: o } = h(t);
82
+ if (!await T(o))
52
83
  return;
53
84
  } finally {
54
85
  e.loadingStatus = !1;
55
86
  }
56
87
  }
57
- H();
88
+ n();
58
89
  };
59
- return x({
60
- handleSave: E
61
- }), { __sfc: !0, config: a, isFeatureEnabled: l, exportHtml: m, save: u, openVersionHistory: c, closeVersionHistory: p, getCompiledEmail: f, compileHtml: d, validateLiquidSyntax: v, editorStore: e, templateStore: y, hasMigrations: g, trans: s, isExporting: i, isSaving: r, migrationModalRef: S, testEmailClick: H, handleVersionHistory: T, handleExport: w, handleSaveAs: _, versionHistoryTooltipText: C, isVersionHistoryButtonVisible: A, executeSave: V, handleSave: E, handleTestEmail: M, getTooltipOptions: j, InButtonV2: G, MigrationConfirmModal: K };
90
+ return A({
91
+ handleSave: _
92
+ }), { __sfc: !0, config: u, isFeatureEnabled: c, exportHtml: f, save: p, validateCurrentTemplate: d, isEnabled: i, showToaster: v, openVersionHistory: S, closeVersionHistory: y, getCompiledEmail: g, compileHtml: h, validateLiquidSyntax: T, configStore: V, editorStore: e, saveValidationStore: H, templateStore: w, hasMigrations: E, trans: r, saveLabel: O, isExporting: s, isSaving: a, migrationModalRef: x, testEmailClick: n, handleVersionHistory: M, handleExport: b, handleSaveAs: k, versionHistoryTooltipText: q, isVersionHistoryButtonVisible: B, executeSave: C, handleSave: _, handleTestEmail: L, getTooltipOptions: tt, InButtonV2: ot, MigrationConfirmModal: rt };
62
93
  }
63
94
  });
64
95
  export {
65
- ut as default
96
+ At as default
66
97
  };
@@ -1,16 +1,16 @@
1
1
  import o from "./LeftSlot.vue2.js";
2
2
  /* empty css */
3
- import a from "../../../_virtual/_plugin-vue2_normalizer.js";
4
- var n = function() {
3
+ import n from "../../../_virtual/_plugin-vue2_normalizer.js";
4
+ var a = function() {
5
5
  var e = this, s = e._self._c, t = e._self._setupProxy;
6
6
  return s("div", { staticClass: "d-f a-i-c" }, [s(t.InButtonV2, { attrs: { id: "guido__back-button", "left-icon": "line-arrow-left", styling: "ghost", type: "secondary", "disabled-status": t.isBackButtonDisabled, "label-text": t.backButtonLabel, "skeleton-sizing": { width: 150, height: 26 }, "skeleton-status": t.editorStore.loadingStatus }, on: { click: t.handleBackClick } })], 1);
7
- }, i = [], r = /* @__PURE__ */ a(
7
+ }, i = [], r = /* @__PURE__ */ n(
8
8
  o,
9
- n,
9
+ a,
10
10
  i,
11
11
  !1,
12
12
  null,
13
- "73199fa4"
13
+ "ee2d4f7d"
14
14
  );
15
15
  const f = r.exports;
16
16
  export {
@@ -1,36 +1,58 @@
1
- import { defineComponent as l, computed as p, ref as d } from "vue";
2
- import { useConfig as k } from "../../../composables/useConfig.js";
3
- import { useBack as B } from "../../../composables/useGuidoActions.js";
4
- import { usePreviewMode as b } from "../../../composables/usePreviewMode.js";
5
- import { useTranslations as v } from "../../../composables/useTranslations.js";
1
+ import { defineComponent as k, computed as v, ref as b } from "vue";
2
+ import { useConfig as B } from "../../../composables/useConfig.js";
3
+ import { useBack as y } from "../../../composables/useGuidoActions.js";
4
+ import { usePreviewMode as S } from "../../../composables/usePreviewMode.js";
5
+ import { useSaveValidation as w } from "../../../composables/useSaveValidation.js";
6
+ import { useSaveValidationRollout as V } from "../../../composables/useSaveValidationRollout.js";
7
+ import { useTranslations as h } from "../../../composables/useTranslations.js";
6
8
  import { useVersionHistoryApi as _ } from "../../../composables/useVersionHistoryApi.js";
7
- import { useEditorStore as V } from "../../../stores/editor.js";
8
- import { InButtonV2 as w } from "@useinsider/design-system-vue";
9
- import { useDebounceFn as y } from "../../../node_modules/@vueuse/shared/index.js";
10
- const D = /* @__PURE__ */ l({
9
+ import { useEditorStore as g } from "../../../stores/editor.js";
10
+ import { useSaveValidationStore as C } from "../../../stores/save-validation.js";
11
+ import { InButtonV2 as H } from "@useinsider/design-system-vue";
12
+ import { useDebounceFn as L } from "../../../node_modules/@vueuse/shared/index.js";
13
+ const G = /* @__PURE__ */ k({
11
14
  __name: "LeftSlot",
12
- setup(C) {
13
- const e = V(), i = B(), { closeVersionHistory: n } = _(), { closePreviewMode: s } = b(), o = v(), { config: t } = k(), f = p(() => {
14
- var u, m;
15
- return e.isVersionHistoryOpen || e.isPreviewModeOpen ? o("email-editor.back-to-editor") : (m = (u = t.value) == null ? void 0 : u.ui) != null && m.backButtonLabel ? t.value.ui.backButtonLabel : o("email-editor.back-to-design");
16
- }), r = d(!1), c = () => {
15
+ setup(M) {
16
+ const e = g(), n = y(), { closeVersionHistory: s } = _(), { closePreviewMode: c } = S(), { validateCurrentTemplate: l } = w(), { isEnabled: u } = V(), f = C(), r = h(), { config: i } = B(), p = v(() => {
17
+ var t, o;
18
+ return e.isVersionHistoryOpen || e.isPreviewModeOpen ? r("email-editor.back-to-editor") : (o = (t = i.value) == null ? void 0 : t.ui) != null && o.backButtonLabel ? i.value.ui.backButtonLabel : r("email-editor.back-to-design");
19
+ }), a = b(!1), m = async () => {
17
20
  if (e.isVersionHistoryOpen) {
18
- n();
21
+ s();
19
22
  return;
20
23
  }
21
24
  if (e.isPreviewModeOpen) {
22
- s();
25
+ c();
23
26
  return;
24
27
  }
25
- i();
26
- }, a = y(() => {
27
- c(), r.value = !1;
28
+ if (u.value) {
29
+ e.loadingStatus = !0;
30
+ let t = [];
31
+ try {
32
+ t = await l();
33
+ } catch (o) {
34
+ console.warn("Back-path validation failed; leaving without the drawer.", o);
35
+ } finally {
36
+ e.loadingStatus = !1;
37
+ }
38
+ if (t.length) {
39
+ f.open(t, "back");
40
+ return;
41
+ }
42
+ }
43
+ n();
44
+ }, d = L(async () => {
45
+ try {
46
+ await m();
47
+ } finally {
48
+ a.value = !1;
49
+ }
28
50
  }, 500);
29
- return { __sfc: !0, editorStore: e, handleBack: i, closeVersionHistory: n, closePreviewMode: s, trans: o, config: t, backButtonLabel: f, isBackButtonDisabled: r, executeBackAction: c, debouncedBackAction: a, handleBackClick: () => {
30
- r.value = !0, a();
31
- }, InButtonV2: w };
51
+ return { __sfc: !0, editorStore: e, handleBack: n, closeVersionHistory: s, closePreviewMode: c, validateCurrentTemplate: l, isEnabled: u, saveValidationStore: f, trans: r, config: i, backButtonLabel: p, isBackButtonDisabled: a, executeBackAction: m, debouncedBackAction: d, handleBackClick: () => {
52
+ a.value = !0, d();
53
+ }, InButtonV2: H };
32
54
  }
33
55
  });
34
56
  export {
35
- D as default
57
+ G as default
36
58
  };
@@ -0,0 +1,20 @@
1
+ import n from "./ValidationErrorDrawer.vue2.js";
2
+ /* empty css */
3
+ import s from "../../../_virtual/_plugin-vue2_normalizer.js";
4
+ var i = function() {
5
+ var r = this, o = r._self._c, t = r._self._setupProxy;
6
+ return o(t.WpDrawer, { attrs: { id: "guido__validation-error-drawer", size: "small", "footer-button-group-options": t.footerButtonGroupOptions, status: t.store.isDrawerOpen, "title-text": t.titleText }, on: { onCloseEvent: t.handleClose, primaryButtonEvent: t.handleClose, secondaryButtonEvent: t.handleSecondary } }, [o("div", { staticClass: "d-f f-d-c validation-error-list" }, r._l(t.rows, function(e, a) {
7
+ return o("div", { key: a, staticClass: "d-f a-i-c validation-error-row" }, [o(t.InIcons, { staticClass: "validation-error-row__icon i-c-12", attrs: { name: "filled-caution-triangle" } }), o("span", { staticClass: "validation-error-row__text" }, [r._v(r._s(e))])], 1);
8
+ }), 0)]);
9
+ }, l = [], _ = /* @__PURE__ */ s(
10
+ n,
11
+ i,
12
+ l,
13
+ !1,
14
+ null,
15
+ "cbfabe9a"
16
+ );
17
+ const u = _.exports;
18
+ export {
19
+ u as default
20
+ };